jquery form submit() не работает внутри функции обратного вызова после предотвращения обычной отправки при использовании импровизированного

Я показываю запрос пароля вместо отправки формы, когда пользователь нажимает кнопку отправки формы. Я хочу, чтобы форма отправлялась, когда пользователь нажимает кнопку «ОК» в приглашении. Я использую импровизированный плагин jquery (пробовал как с версией 3.1, так и с версией 4.0.1). Я спешу и не понимаю, что не так с моим кодом, или я что-то полностью упускаю.

Вот мой код -

Пробная версия 1
HTML-часть

<form name="frmAddAdnetworkTemplate" id="frmAddAdnetworkTemplate" action="someAction">
  ...
  ...
  <input id="submit" type="submit" name="submit" value="Submit"  onclick="return promptPassword();" />
</form>

Часть JavaScript

function promptPassword()
{
   /*prepared passwordForm = some html; here */
   $.prompt(passwordForm,{ buttons: { Ok:, Cancel: false , submit: }, callback: submitPasswordPrompt, focus: 1});

   return false; //so as to not submit the form
}

function submitPasswordPrompt(value,m,form)
{
    $("form#frmAddAdnetworkTemplate").submit(); //this does not work - no js error as well
}

Но форма не отправляется.

Пробная версия 1.1 Вместо вызова submitPasswordPrompt при отправке

function promptPassword()
{
   $.prompt(passwordForm,{ buttons: 
                             { Ok: $("#frmAddAdnetworkTemplate").submit(), //this too does not work
                               Cancel: false }, 
                           focus: 1
                          });

}

Пробная версия 1.2

Я пробовал с preventDefault() -

HTML-часть

<input id="submit" type="submit" name="submit" value="Submit" onclick="promptPassword(event);"/>

Часть JavaScript

function promptPassword(e)
{
  e.preventDefault();
  $.prompt(passwordForm,{ buttons: { Ok: true, Cancel: false }, submit: submitPasswordPrompt});

  function submitPasswordPromptTest(e, value,m,form)
  {
     if(value)
     {
        $("#frmAddAdnetworkTemplate").submit(); //does not work
     }
  }

Пробная версия 2. Я также попытался вызвать $.prompt внутри документа document .ready, привязав его к событию click на кнопке отправки.

HTML-часть

<input id="submit" type="submit" name="submit" value="Submit" />

Часть JavaScript

$("#submit").click(function(){
   $.prompt(passwordForm,{ buttons: { Ok: $("#frmAddAdnetworkTemplate").submit(), Cancel: false }});
   return false;
});

Получил эту ошибку, когда попробовал $("#frmAddAdnetworkTemplate").off('submit').submit(); -

e[h] is not a function

введите здесь описание изображения


person Sandeepan Nath    schedule 05.03.2012    source источник
comment
Пожалуйста, обновите свой код с параметром action формы, чтобы избежать путаницы в будущем.   -  person tvanfosson    schedule 05.03.2012
comment
@tvanfosson - я также пытался сделать $(#frmAddAdnetworkTemplate).off('submit').submit(); как вы предложили, переключившись на jquery 1.7.1, но получил какую-то ошибку (прилагаю скриншот). Будет $(#frmAddAdnetworkTemplate).unbind('submit').submit(); значит то же самое? Я тоже так пробовал и безуспешно.   -  person Sandeepan Nath    schedule 05.03.2012
comment
Проблема в том, что у вас есть ввод с именем submit в вашей форме. Если вы назовете входную отправку, вы не сможете отправить свою форму с помощью form.submit. Ознакомьтесь со следующим вопросом/ответом Stackoverflow с лучшим объяснением: stackoverflow.com/questions/3553584/   -  person The Dog    schedule 25.05.2012


Ответы (3)


Смешивание встроенного Javascript с функциями и событиями jQuery затрудняет отслеживание.

Ваша попытка «Пробная версия 1.2» не работает, потому что в onclick="promptPassword(event);" не определена переменная «событие», а функция promptPassword() не принимает для нее никаких аргументов. Поэтому вы не можете использовать e.preventDefault(), поскольку e не определено (как объект jQuery).

Однако, используя jQuery, вы можете привязываться к событию формы submit, чтобы перехватывать все типы отправки. то есть при использовании клавиши Enter или нажатии кнопки отправки.

$(document).ready(function() {
    $('#myForm').submit(function(event) {
        var password = "password",
            promptText = "Password required",
            isAuthenticated = (password == prompt(promptText));

        if (!isAuthenticated) {
            event.preventDefault();
            //console.log("Invalid password");
        }
    });

});

Посмотреть демонстрацию.

person Stefan    schedule 05.03.2012
comment
@Stefan ... Прошу прощения, еще раз, я сделал ошибку при копировании, задавая вопрос. Переменная события была фактически определена в моем коде. Я исправил то же самое в своем коде. Однако ваш ответ помог мне понять, что мне не нужно каждый раз вызывать event.preventDefault() в начале, а затем вызывать form.submit() позже в зависимости от некоторых условий. Вместо этого я мог бы просто вызвать event.preventDefault() один раз в конце в зависимости от условия. Пожалуйста, проверьте этот мой вопрос - stackoverflow.com/q/9570592/351903. - person Sandeepan Nath; 05.03.2012

Проблема вызвана тем, что id="submit" по какой-то причине смешивается с отправкой HTML. У меня была эта проблема раньше, и ответ - изменить идентификатор и имя (чтобы быть в безопасности) на что-то другое:

<input id="my-form-submit" type="submit" name="my-form-submit" value="Submit" />
person Sam Battat    schedule 30.08.2012

Используйте свой идентификатор кнопки с отправкой

для моего снарио

$.prompt(msg, {
    buttons: btns,
    submit: function (v) {
        //this is simple pre submit validation, the submit function
        //return true to proceed to the callback, or false to take 
        //no further action, the prompt will stay open.
    },
    callback: function (e, v, m, f) {
        if (v) {
            $("#MainContent_HiddenFieldIsContinueWithSave").val('1');
            $("#MainContent_buttonSave").submit();
        }
        else { }
    }
});
person indsoft    schedule 16.10.2012