Невозможно заблокировать отправку формы с помощью ответа Ajax, инициированного атрибутом onSubmit. - PullRequest
2 голосов
/ 14 декабря 2011

Этот вопрос немного отличается от тех, на которые уже даны ответы ...

Я хочу запустить функцию autoHide(), которая вызывает файл PHP, artistdo.php, которыйвыполняет запрос MySQL при отправке формы, и если он возвращает true (запрос успешно выполняется), форма не отправляется.

Я получаю только то, что запрос MySQL не выполняется, и даже если яудалите запрос и поместите return true на страницу artistdo.php, return false в ajax не останавливает отправку формы, но вызывает вызов alert("Success");, однако, если я поставлю return false в autoHide() функция, но за пределами AJAX, форма не отправляется правильно.Вот что у меня есть:

Страница формы:

<head>
    function autoHide() {
        $.ajax({
            'url': '/artistdo.php',
            'type': 'GET',
            'dataType': 'json',
            'data': {
                cmd: 'autoHideProduct'
            },
            'success': function () {
                alert("Success");
                return false;
            }
        });
    }
</head>

<body>
  <form action="http://off-site/form.php" method="post" 
        onSubmit="return autoHide()">
    <input type="submit" value="submit"
           onMouseOver="this.style.cursor='pointer'">
  </form>

И страница artistdo.php (Это упрощенная версия для удобства чтения):

if($get['cmd'] == 'autoHideProduct') {
    $query = mysql_query("UPDATE products SET house='0'");

    if ($query) {
        return true;
    } else {
        return false;
    }

Итак, если я полностью удаляю весь запрос MySQL со страницы artistdo.php и заменяю его только на return true;, форма все равно отправляет, что заставляет меня думать, что проблема в AJAX, поскольку *Страница 1021 * определенно возвращает true, и вызывается alert("Success");.Если я переместу return true за пределы вызова AJAX, форма не будет отправлена ​​правильно.

Надеюсь, это имеет смысл ...

Спасибо за любую помощь!

Ответы [ 4 ]

2 голосов
/ 14 декабря 2011

Вы можете использовать метод .data(), чтобы связать метаданные с формой, которая позволит вам узнать, следует ли вам их отправлять или нет:

<head>
    <script type="text/javascript">
        $(function() {
            $('#myform').submit(function() {
                if ($(this).data('shouldSubmit')) {
                    return true;
                }

                $.ajax({
                    url: '/artistdo.php',
                    type: 'GET',
                    dataType: 'json',
                    context: this,
                    data: { cmd: 'autoHideProduct' },
                    success: function (result) {
                        if (result) {
                            $(this)
                                .data('shouldSubmit', true)
                                .submit();
                        }
                    }
                });

                return false;
            });
        });
    </script>
</head>

<body>
    <form action="http://off-site/form.php" method="post" id="myform">
        <!-- Form fields -->
        <input type="submit" value="submit" onMouseOver="this.style.cursor='pointer'">
    </form>
</body>
0 голосов
/ 14 декабря 2011

Первая проблема, учитывая текущую структуру кода, состоит в том, что вызов $.ajax является асинхронным, что означает, что он выполняется, а затем браузер переходит к следующему оператору и позволяет вызову $.ajax завершить «в фоновом режиме». , Вот почему, когда вы помещаете оператор return false после вызова $.ajax, форма не отправляется, а не помещает возвращаемое значение false в функцию успеха вызова $.ajax.

Я не думаю, что то, что вы хотите сделать, действительно возможно, если вы не создадите какие-то глобальные переменные. Возможно ли вам изменить способ заполнения формы?

0 голосов
/ 14 декабря 2011

Я думаю, что проблема в этой строке

    if($get['cmd'] == 'autoHideProduct') {

это должно быть похоже на

    if($_GET['cmd'] == 'autoHideProduct') {
0 голосов
/ 14 декабря 2011

если я правильно вас понял, это может вам чем-то помочь

$('form').submit(function (event)
{
    event.preventDefault();
    //handle the rest of the logic
}

Это остановит отправку формы, вам следует вызвать вашу функцию и отправить форму, если возвращено значение true.

...