Должен ли 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>
Когда я нажимаю кнопку "Отмена", отправка из тега формы не запускается.
Вместо этого эта строка успешно отправляет форму: $(button.form).submit();
но пропускает alert('here');
внутри onsubmit в теге формы.
Это правильно или я делаю что-то не так?
Кстати, в данном случае мне нужна эта функциональность, но мне просто интересно, не столкнусь ли я с проблемой в браузере, где запускается onsubmit.
Решение
Извините, неправильно понял ваш вопрос.
Согласно Javascript - захват onsubmit при вызове form.submit () :
Меня недавно спросили: & Почему событие form.onsubmit срабатывает, когда я отправить мою форму, используя javascript? " Р>
Ответ: современные браузеры не придерживаться этой части HTML Спецификация. Событие только зажигает когда он активирован пользователем - и не срабатывает при активации код.
(выделение добавлено).
Примечание: " активировано пользователем " также включает нажатие кнопок отправки (возможно, включая поведение отправки по умолчанию с помощью клавиши ввода, но я не пробовал этого). Я полагаю, что это не сработает, если вы (с кодом) нажмете кнопку отправки.
Другие советы
Этот обходной путь исправит проблему, обнаруженную @Cletus.
function submitForm(form) {
//get the form element's 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 и (если это не будет предотвращено к тому времени), наконец, отправят форму.
Мое простое решение:
$("form").children('input[type="submit"]').click();
Это работа для меня.
Я полагаю, что в некоторых случаях разумно хотеть такого поведения, но я бы сказал, что код, не инициирующий отправку формы, должен (всегда) быть поведением по умолчанию. Предположим, вы хотите отследить отправку формы с помощью
$("form").submit(function(e){
e.preventDefault();
});
и затем сделайте некоторую проверку на входе. Если код может вызвать обработчики отправки, вы никогда не сможете включить
$("form").submit()
внутри этого обработчика, потому что это приведет к бесконечному циклу (будет вызываться один и тот же обработчик, предотвращающий отправку, проверку и повторную отправку). Вы должны иметь возможность вручную отправлять форму в обработчике отправки, не вызывая тот же обработчик.
Я понимаю, что это НЕ ОТВЕЧАЕТ на вопрос напрямую, но на этой странице есть много других ответов о том, как эту функциональность можно взломать, и я чувствовал, что на это нужно указать (и это слишком долго для комментария ). р>
триггер ('submit') не работает.из-за того, что метод onSubmit не запускается.следующий код работает для меня, вызывайте метод onSubmit при использовании этого кода :
$("form").find(':submit').click();
Попробуйте вызвать событие () в вашей функции:
$("form").trigger('submit'); // and then... do submit()
Вместо того, чтобы
$("form").submit()
попробуй это
$("<input type='submit' id='btn_tmpSubmit'/>").css('display','none').appendTo('form');
$("#btn_tmpSubmit").click();
Я нашел этот вопрос сервала много лет назад.
недавно я попытался "переписать" метод отправки.ниже приведен мой код
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, но не сработало в других браузерах по той же причине, что и "клетус".
Самое простое решение для обхода этой проблемы - создать «временный» ввод с типом отправки и щелчком триггера:
var submitInput = $("<input type='submit' />");
$("#aspnetForm").append(submitInput);
submitInput.trigger("click");