#javascript #jquery
#javascript #jquery
Вопрос:
Существует множество вопросов по SO, в которых спрашивается, почему метод jQuery ‘submit ()’ НЕ запускает событие отправки.
Я спрашиваю прямо противоположное: почему jQuery запускает событие отправки при вызове метода отправки и как это обойти?
Вот простой JSFiddle, показывающий проблему: https://jsfiddle.net/vncu675x /
$(function () {
var i = 0;
$("form").find(":submit").text(Math.random());
$("form").submit(function (e) {
e.preventDefault();
if (confirm("Are you sure? " i )) {
$("form").submit();
}
});
});
<html>
<head>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js"></script>
</head>
<body>
<form action="/">
<button type="submit">Submit</button>
</form>
</body>
</html>
Я думаю, что это вопрос jQuery, потому что чистая реализация JavaScript работает так, как ожидалось.
Комментарии:
1. Мне кажется, что это плохой дизайн. Не могли бы вы показать нам предполагаемое использование, чтобы, возможно, мы могли порекомендовать вам другой способ решения вашей проблемы. Или вам на 100% НУЖНО использовать jQuery
.submit()
в рекурсивном вызове?2. Поскольку метод submit() постоянно запускает событие отправки, и при событии отправки вы вызываете метод confirm(), не используйте .submit() для метода.
3. Вероятно, есть обман (по крайней мере, в комментариях) — использование:
$("form")[0].submit();
вы вызываете jquery submit, который (что неудивительно) вызывает событие) — вместо этого вызовите встроенную отправку javascript в форме4. @MauriceNino, это почти то же самое использование: когда пользователь отправляет форму, если на странице отображается какое-либо предупреждение, предупреждение о подтверждении снова отобразит предупреждение для двойной проверки. На самом деле мне не нужен этот конкретный дизайн, это именно то, что я обычно делал в те дни, и, похоже, он больше не работает.
5. @freedomn-m ваше решение, похоже, работает, если вы хотите опубликовать ответ, я, вероятно, пометлю его как решение.
Ответ №1:
Строка
$("form").submit();
это то же $("form").trigger("submit")
самое, что и — ie, он вызывает событие отправки, которое является событием, которое вы обрабатываете.
Вместо этого используйте встроенное событие отправки js, преобразуя объект jquery в объект DOM:
$("form")[0].submit();
Несмотря на то, что они имеют одно и то же имя ( submit
), две функции предназначены для разных типов, поэтому имеют разные действия.
Обновленный фрагмент:
$(function () {
var i = 0;
$("form").find(":submit").text(Math.random());
$("form").submit(function (e) {
e.preventDefault();
if (confirm("Are you sure? " i )) {
$("form")[0].submit();
}
});
});
<html>
<head>
<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.5.1.min.js"></script>
</head>
<body>
<form action="/">
<button type="submit">Submit</button>
</form>
</body>
</html>