Preventdefault внутри, если заставляет форму не отправляться, когда if false

Использование этого кода для получения форм с определенным классом и обработки определенных действий:

$('.stripe_payment').submit(function(e) {
    var frm = $(this);
    var token_input = $('#' + frm.attr('token_input'));

    console.log("submit");

    console.log( $(token_input).val() );

    if($(token_input).val() == "") {
        console.log("empty tk");

        var handler = StripeCheckout.configure({
            key: 'pk_test_kOFWqH1EnP8UcrS3AqCYd4mQ',
            image: 'https://stripe.com/img/documentation/checkout/marketplace.png',
            locale: 'auto',
            token: function(token) {
                if(token.id) {
                    $(token_input).val(token.id);
                    $(frm).submit();
                    return true;
                }
            }
        });
        // Open Checkout with further options:
        handler.open({
            name: 'Integra Telecommunications Ltd',
            description: '2 widgets',
            zipCode: true,
            currency: 'gbp',
            amount: 2000
        });
        e.preventDefault();
    }

    // Close Checkout on page navigation:
    window.addEventListener('popstate', function() {
        handler.close();
    });
});

и моя HTML-форма:

<form id="topup_form" class="stripe_payment" token_input="stripe_token" method="post" action="/telecoms/sms/balance?ac=<?php echo $account["sequence"]; ?>">
<input type="text" id="stripe_token" />
<input type="submit" name="submit" id="topup_submit" class="btn btn-default pull-right" value="Order Credits" />
</form>

При отправке формы обработчик открывается нормально, и я ввожу данные.

Затем token.id возвращается и заполняется в поле ввода в форме, но $(frm).submit(); не отправляет форму в обычном режиме.

Я пробовал заменить $(frm).submit(); на $(this).submit();, а также заменить return true; на return false;, но все тот же

если if ложный, то я не хочу предотвращать дефолт. я хочу использовать только preventdefault, если значение token_input пустое

charlie 13.09.2018 20:14

хм, я имею в виду, что хочу preventDefault, если token_input пуст, а если он не пуст, то отправить HTML-форму

charlie 13.09.2018 20:21

это правильно, preventDefault должен произойти, когда if истинно (if($(token_input).val() == "") {)

charlie 13.09.2018 20:24

проверить, что if($(token_input).val() == "") { верен?

charlie 13.09.2018 20:25

это правда, когда форма отправляется впервые, console.log("empty tk"); отображается в консоли, которая находится внутри if. тогда, когда предполагается, что $(frm).submit(); вызывается, он не отображается в консоли

charlie 13.09.2018 20:27

так что я знаю, что инструкция if работает. это просто $(frm).submit();, который не работает

charlie 13.09.2018 20:28

Хорошо, значит, в первый раз, когда он попадает в if, работает ли handler, но затем отправка в методе токена не работает, верно?

Taplar 13.09.2018 20:29
$(token_input).val(token.id); работает и заполняет ввод, но $(frm).submit(); ничего не делает
charlie 13.09.2018 20:30

Вы видите вывод console.log("submit"); во второй раз, как только он вернет токен?

Taplar 13.09.2018 20:31

да, это появляется снова во второй раз, как и значение token_input, а console.log("empty tk"); не отображается

charlie 13.09.2018 20:34

Это говорит о том, что отправка работает. Отсутствие пустого tk показывает, что if ложно. Таким образом, если форма не отправляется, то это может означать, что есть еще что-то, что мешает отправке формы, а не этот блок кода, который у вас есть.

Taplar 13.09.2018 20:35

Попробуйте сделать frm.get(0).submit(). Это должно выполнить отправку в базовой форме, а не в объекте jQuery с формой, что должно привести к тому, что все обработчики отправки для формы, которую jQuery обошли.

Taplar 13.09.2018 20:36

только что получил это: Uncaught TypeError: frm.get(...).submit is not a function

charlie 13.09.2018 20:38

Что ж, странно. Что вы увидите в консоли, если сделаете console.log(frm.get(0))?

Taplar 13.09.2018 20:39

Я проверю - $('#topup_submit').click();, похоже, работает, это кнопка, но это не вариант, потому что идентификатор кнопки не всегда будет одинаковым

charlie 13.09.2018 20:40
console.log(frm.get(0)) возвращает форму HTML
charlie 13.09.2018 20:41

Да, я ожидал этого, поэтому не понимаю, почему он может подумать, что метод отправки не определен.

Taplar 13.09.2018 20:41

Позвольте нам продолжить обсуждение в чате.

charlie 13.09.2018 20:42
0
18
16
0

Другие вопросы по теме