JQuery trap submit()

В настоящее время я использую jquery, чтобы заблокировать отправку формы и показать пользователям диалог для подтверждения. Если пользователь нажимает "да", форма должна быть отправлена. Если пользователь не нажал, закройте диалоговое окно.

Все это работает хорошо, но для одной проблемы: когда пользователь нажимает "да", это снова запускает тот же код, и диалог снова открывается.

$("#myform").submit(function (event) {
    if (something) {
        var $dialog = $('<div></div>').dialog({
            buttons: {
                "OK": function () {
                    $dialog.dialog('close');
                    $("#myform").submit();
                    return;
                },
                Cancel: function () {
                    $(this).dialog("close");
                }
            }
        });
        $dialog.dialog('open');
        event.preventDefault();
        return false;
    } else {
        $("#myform").submit();
    }
});

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

Ответ 1

Потому что, когда вы submit формы, событие submit запускается снова и, следовательно, обработчик события. Вы должны unbind обработчик события submit, когда пользователь говорит OK. Попробуйте это

$("#myform").submit(function (event) {
    if (something) {
        var $dialog = $('<div></div>').dialog({
            buttons: {
                "OK": function () {
                    $dialog.dialog('close');
                    //Check this line - unbinding the submit event handler
                    $("#myform").unbind('submit').submit();
                    return;
                },
                Cancel: function () {
                    $(this).dialog("close");
                }
            }
        });
        $dialog.dialog('open');
        event.preventDefault();
        return false;
    } else {
        $("#myform").submit();
    }
});

Ответ 2

Вы должны вернуть false, если OK:

$("#myform").submit(function (event) {
    if (something) {
        var $dialog = $('<div></div>').dialog({
            buttons: {
                "OK": function () {
                    $dialog.dialog('close');
                    $("#myform").submit();
                    return false; // <=== not just return;
                },
                Cancel: function () {
                    $(this).dialog("close");
                }
            }
        });
        $dialog.dialog('open');
        event.preventDefault();
        return false;
    } else {
        $("#myform").submit();
    }
});

Или удалите инструкцию по отправке:

buttons: {
"OK": function () {
    $dialog.dialog('close');
    //$("#myform").submit();  <-- delete it
    return;
},

Ответ 3

Я бы сделал something либо глобальное пространство имен, либо значение из некоторого скрытого ввода, например:

var something = nameSpaced.something ||  $('#hiddenInput').val(); //your choice
if (something) {
    ...
} ...

Ваша логика должна нормально работать.

Ответ 4

Вместо использования объекта jQuery для отправки формы вы можете использовать элемент DOM, на который объект jQuery ссылается для отправки формы. Это обходит обработчик события jQuery. Ваша функция OK будет выглядеть так:

"OK": function () {
    $dialog.dialog('close');
    $("#myform").get(0).submit(); // use the underlying DOM element to sumbit
    return false;
},