ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer

Не ловит евент submit из подключенного js, куда копать?

Задача: Словить срабатывание формы на страничке.
Есть следующий код:
$(document).ready(function () {
    $(document).on('submit','form',function(e){
          alert('wtf?');
     })
})

во внешне подключаемом js есть код следующего содержания, срабатывающий по клику на определенный элемент:
h.redirect = function (a, b) {
        var c = k.createElement("form");
        c.action = b;
        c.method = "post";
        c.target = "_top";
        c.style.display = "none";
        var d = k.createElement("input");
        d.type = "hidden";
        d.name = "token";
        d.value = a;
        c.appendChild(d);
        k.body.appendChild(c);
        c.submit()
    }

Внимание вопрос: При c.submit() ничего не ловится, не растет кокос не выходит алерт, но форма срабатывает и субмит происходит. Как словить евент, или хоть объясните почему такая лажа? Неужели c.submit() не создает евента?

UPD: Всем спасибо, я тупой лось, не посмотрел ни код толком, ни фак где описан коллбэк без субмита.
  • Вопрос задан
  • 540 просмотров
Решения вопроса 1
lazalu68
@lazalu68
Salmon
Вообще это не очень круто, что сторонний скрипт позволяет себе такие вольности типа непосредственного вызова submit, или может он какой специфичный. Такой подход не оставляет другого выбора, кроме декорирования:

(() => {
    var old_submit = HTMLFormElement.prototype.submit;

    HTMLFormElement.prototype.submit = function() {
        var form = this,
            args = Array.prototype.slice.call(arguments),
            submit_event = new Event('submit', {
                bubbles: true,
                cancelable: true
            });

        submit_event.original_submit = function() {
            old_submit.apply(form, args);
        };

        form.dispatchEvent(submit_event);
    }
})();

$(() => {
    var my_form = $( 'form' )[0];

    $( document )
        .on('submit', 'form', function(e) {
            alert('wtf?');
            e.originalEvent.original_submit();
        })
        .on('click', 'button', function() {
            my_form.submit();
        });
})


Суть в том, чтобы при вызове сабмита выкидывать (bubbling) объект ивента в котором и лежит ссылка на оригинальный сабмит, который является единственным способом послать форму. Это ужас, кошмар и ад, и я бы так никогда не стал делать, но чо-то ничего лучше не придумал.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы