#javascript #html #forms #addeventlistener #event-listener
#javascript #HTML #формы #addeventlistener #прослушиватель событий
Вопрос:
У меня есть приложение, которое вводит прослушиватель событий html для отправки. Мы хотим выполнить небольшую проверку, а затем вызвать исходную отправку. По какой-то причине мы продолжаем получать «перехватчик (evt)», вызываемый в рекурсивном вызове, используя следующее. Какие мысли?
// SUBMIT OVERRIDES
HTMLFormElement.prototype._submit = HTMLFormElement.prototype.submit;
HTMLFormElement.prototype.submit = interceptor;
console.log("AddEventListener SUBMIT override");
window.addEventListener('submit', function submit_el(e) {
console.log("PK submit calling JS interceptor");
e.preventDefault();
interceptor(e);
}, false);
function interceptor(evt) {
frm = evt ? evt.target : this;
if (!frm.onsubmit || (frm.onsubmit() !== false)) {
// DO SOME STUFF....
console.log("Calling the real form submit which should not call the listener");
frm._submit(); //form submission
console.log("Calling the real form submit - COMPLETED");
}
return false;
}
Ответ №1:
Вы всегда отменяете событие, когда вы вызываете исходную функцию onsubmit, вы также запускаете прослушиватель событий и делаете то же самое, что и в первый раз, попробуйте переместиться e.preventDefault();
перед return false;
внутри функции-перехватчика
вы также можете создать флаг, который указывает, должна ли выполняться исходная функция onsubmit или событие должно быть отменено
Комментарии:
1. «попробуйте переместить e.preventDefault(); перед возвращением false» разве не факт, что e.preventDefault() вызывается перед вызовом «interceptor(e)», вызывающего его перед возвращением false? Не понимаю, в чем заключается предложение.
2. Я пытался сказать, что
e.preventDefault()
should not be called beforeinterceptor(e)
, должен вызываться внутри3. итак, почему это работает? Вызов перехватчика выполняется синхронно. Почему вызов ее внутри interceptor непосредственно перед возвращением false сработает?