Событие триггера после event.preventDefault

Я ловлю нажатия на кнопку отправки формы. Я делаю event.preventDefault(), чтобы отключить действие браузера по умолчанию, чтобы я мог делать свои вещи после нажатия кнопки. В этом случае я вызываю сервер AJAX. По ответу сервера я хочу выбрать, продолжить ли отправку формы или сделать что-то еще.

$inviteSubmitForm.find('input[name="accept"]').click(function(e){
    e.preventDefault();

    $.ajax({
        ...
        success  : function(data) {

            if (data.something) {
                ...
            } else {
                ...
            }

        }
    });
});

Проблема в том, что я не могу применить действие по умолчанию для нажатой кнопки, потому что логика находится в обратном вызове AJAX. Итак, return true просто завершите функцию обратного вызова - я не могу использовать этот простой трюк. Кроме того, перемещение e.preventDefault() запрещено, потому что форма отправляется немедленно.

Любые идеи?


person srigi    schedule 26.08.2011    source источник


Ответы (1)


триггер для отправки формы:

$inviteSubmitForm.find('input[name="accept"]').click(function(e){
    e.preventDefault();

    $.ajax({
        ...
        success  : function(data) {

            if (data.something) {
                // don't submit
            } else {
                $inviteSubmitForm.submit();
            }

        }
    });
});
person PeeHaa    schedule 26.08.2011
comment
Это решение в порядке и работает, но - у меня есть несколько кнопок отправки в форме. Если я хочу различать кнопки этим методом, я должен добавить ‹input type = hidden› с именем исходной кнопки отправки. Это все еще нормально, но я ищу систематическое чистое решение - переделать старое событие исходной кнопки. - person srigi; 26.08.2011
comment
@srigi: Зачем вам нужно скрытое поле ввода? Вы уже делаете: find('input[name="accept"]'), который должен быть только одной кнопкой типа. Также, если у вас будет одна и та же функция, обрабатывающая несколько кнопок, просто добавьте простой переключатель. Вы хотите, чтобы я добавил вам пример? - person PeeHaa; 26.08.2011
comment
Лично мне хотелось бы посмотреть, как с этим справиться на уровне событий. - person Diodeus - James MacFarlane; 26.08.2011
comment
@PeeHaa - если вы отправляете форму с помощью Javasctipt, кнопки отправки не отправляются на сервер, как в классической отправке HTML. Поэтому, если вы хотите различать, какая кнопка была нажата, вы должны эмулировать это, включив ‹input type = hidden› с именем исходной кнопки. Я думаю, что $inviteSubmitForm.append('<input type="hidden" name="accept" value="Accept">'); $inviteSubmitForm.submit(); - самое простое решение. - person srigi; 26.08.2011
comment
@Diodeus: И я хотел бы видеть, что я чертовски богат;) нех, серьезно. Не думайте, что есть .preventPreventDefautlt(). - person PeeHaa; 26.08.2011
comment
@srigi: или вы можете добавить имя кнопки отправки, которая была нажата, к URL-адресу, на который вы публикуете. Это помешает вам добавить дополнительную разметку в свой HTML-код. - person PeeHaa; 26.08.2011