Отправка формы для внедрения HTML JS

#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 before interceptor(e) , должен вызываться внутри

3. итак, почему это работает? Вызов перехватчика выполняется синхронно. Почему вызов ее внутри interceptor непосредственно перед возвращением false сработает?