Подтвердить что ты не робот

Должен jQuery $(form).submit(); не запускать onSubmit в теге формы?

У меня есть следующее:

<script type="text/javascript">
function CancelFormButton(button) {
    $(button.form).submit();
}
</script>

<form onsubmit="alert('here');">
<input type="button" value="Cancel" onClick="CancelFormButton(this);" />
</form>

Когда я нажимаю кнопку "Отмена", onsubmit из тега формы не запускается.

Эта строка вместо этого отправляет форму успешно: $(button.form).submit();, но пропускает alert('here'); внутри onsubmit в теге формы.

Является ли это правильным или я делаю что-то неправильно?

Кстати, в этом случае я хочу эту функциональность, но мне просто интересно, запущу ли я проблему в браузере, где запускается onsubmit.

4b9b3361

Ответ 1

Извините, неправильно понял ваш вопрос.

Согласно Javascript - захват onsubmit при вызове form.submit():

Недавно меня спросили: "Почему событие form.onsubmit увольняется, когда я отправить мою форму с помощью javascript?"

Ответ: в настоящее время браузеры не придерживайтесь этой части html Спецификация. Событие только срабатывает когда он активируется пользователем - и не срабатывает при активации код.

(выделено курсивом).

Примечание: ", активированный пользователем" также включает нажатие кнопок отправки (возможно, включая поведение отправки по умолчанию из ключа ввода, но я этого не пробовал). Я уверен, что это не срабатывает, если вы (с кодом) нажмете кнопку отправки.

Ответ 2

Этот будет устранять проблему, обнаруженную @Cletus.

function submitForm(form) {
    //get the form element document to create the input control with
    //(this way will work across windows in IE8)
    var button = form.ownerDocument.createElement('input');
    //make sure it can't be seen/disrupts layout (even momentarily)
    button.style.display = 'none';
    //make it such that it will invoke submit if clicked
    button.type = 'submit';
    //append it and click it
    form.appendChild(button).click();
    //if it was prevented, make sure we don't get a build up of buttons
    form.removeChild(button);
}

Будет работать во всех современных браузерах.
Будет работать через вкладки/порожденные дочерние окна (да, даже в IE и 9).
И в ваниле!

Просто передайте ссылку DOM элементу формы и убедитесь, что все подключенные слушатели, onsubmit и (если это не предотвращено тогда), наконец, отправьте форму.

Ответ 3

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

$("form").submit(function(e){
    e.preventDefault();
});

а затем выполните некоторую проверку на входе. Если код может запускать обработчики отправки, вы никогда не сможете включить

$("form").submit()

внутри этого обработчика, потому что это приведет к бесконечному циклу (вызывается обработчик SAME, предотвращает отправку, проверку и повторную передачу). Вы должны иметь возможность вручную отправить форму внутри обработчика отправки без запуска того же обработчика.

Я понимаю, что это НЕ ОТВЕТИТ прямо, но есть много других ответов на этой странице о том, как эту функцию можно взломать, и я почувствовал, что это нужно указать (и это слишком долго для комментария).

Ответ 4

Мое простое решение:

$("form").children('input[type="submit"]').click();

Это работа для меня.

Ответ 5

Попробуйте вызвать() событие в вашей функции:

$("form").trigger('submit'); // and then... do submit()

Ответ 6

Вместо

$("form").submit()

попробуйте это

 $("<input type='submit' id='btn_tmpSubmit'/>").css('display','none').appendTo('form');
 $("#btn_tmpSubmit").click();

Ответ 7

trigger ('submit') не работает. Неисправность метода onSubmit не запускается. для меня работает следующий код: при использовании этого кода вызывается метод Submit:

$("form").find(':submit').click();

Ответ 8

Я нашел этот вопрос serval несколько лет назад.

Недавно я попытался "переписать" метод отправки. ниже мой код
window.onload= function (){
for(var i= 0;i<document.forms.length;i++){
    (function (p){
        var form= document.forms[i];
        var originFn= form.submit;
        form.submit=function (){
            //do something you like
            alert("submitting "+form.id+" using submit method !");
            originFn();
        }
        form.onsubmit= function (){
            alert("submitting "+form.id+" with onsubmit event !");
        }
    })(i);


}

}

<form method="get" action="" id="form1">
<input type="submit" value="提交form1" />
<input type="button" name="" id="" value="button模拟提交1" onclick="document.forms[0].submit();" /></form>

Это было сделано в IE, но не удалось в других браузерах по той же причине, что и "cletus"

Ответ 9

Самое простое решение для решения этой проблемы - создать "временный" ввод с типом отправки и триггером:

var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");