2013-07-13 2 views
5

Как я могу запустить кусок кода, как только форма была сброшена?Выполнить код, как только форма была сброшена

Событие resetдо поля формы возвращаются к значениям по умолчанию. Так, например:

$('form').on('reset', function(e) { 
    $('input').val('a value that should be set after the form has been reset'); 
}); 

Это не будет работать. (Demo)

Как reset пожаров событий до того, как браузер обрабатывает поведение сброса вида по умолчанию, приведенный выше код просто устанавливает входной-х value перед действием на reset мероприятия по умолчанию происходит, восстановление значения на вход на его значение по умолчанию. Это имеет смысл, так как я мог бы позвонить e.preventDefault(), чтобы отменить сброс формы.

В моем случае использования необходимо выполнить код, как только форма была сброшена. В простых случаях setTimeout будет достаточно:

$('form').on('reset', function(e) { 
    setTimeout(function() { 
     $('input').val('yay it works now'); 
    }, 0); 
}); 

Это работает, как setTimeout выполнит когда-нибудь в будущем, после того, как reset закончил бульканье и браузер обработал свое действие по умолчанию.

Однако, это теряет синхронность. Как только я должен программно сбросить форму и манипулировать ею из другого места, все идет по канализации.

$('form').on('reset', function(e) { 
    setTimeout(function() { 
     $('input').val("reset'd value"); 
    }, 0); 
}); 

//somewhere in another module.. 
$('form').trigger('reset'); 
$('input').val('value after resetting the form'); 

(Demo)

Конечно, все должно происходить синхронно, но только мое обращение reset события выталкиваются асинхронно работать в будущем, таким образом, он заканчивает работать после все текущей синхронной груды кода, когда он должен был запускаться сразу после сброса формы.

Solutions Я думал о:

  • Используйте еще один setTimeout для запуска после setTimeout. Это слишком уродливо, и я отказываюсь прыгать в ад. setTimeout.
  • Внедрите оболочку для сброса формы, которая либо выполняет функцию обратного вызова, либо возвращает объект обещания. Однако это немного переборщило.

Если существует только событие afterreset .. Ну, я пропустил что-то или решения выше моих единственных вариантов?


Я наткнулся на эти вопросы во время поиска:

Но их названия (имхо) немного вводит в заблуждение, видя, как те, на самом деле очень далекий от моей проблемы.

+0

Невозможно «обработать» событие, как только браузер завершит действие по умолчанию, верно? Это довольно уныло. –

+0

Просто из любопытства, какой прецедент подскажет вам сделать это? – Blender

+0

@Blender У меня есть экземпляры [Select2] (http://ivaynberg.github.io/select2/). Я хочу установить свои данные в значения по умолчанию, когда форма сбрасывается, однако соответствующие элементы 'select' будут иметь свой сброс selectIndex после того, как я установил данные Select2. ': (' –

ответ

1

В вашем случае, я думаю, вы просто назначили значение по умолчанию для своего текстового поля. По мере сброса формы браузер автоматически сбросит его до значения по умолчанию.

<form> 
    <input value="Abc" type="text"/> 
    <input type="reset" /> 
</form> 

Проверьте demo.

+0

Да, я думал об этом. Мой случай использования немного сложнее, но я попробую это. –

+0

@ Fabrício Matté: фактически, когда вы устанавливаете значение по умолчанию в своем HTML, браузер присваивает этому значению специальное поле 'defaultValue' вместо' value'. Проверьте эту ссылку http://jsfiddle.net/5YKRk/1/. Попробуйте установить значение 'document.getElementById (" test "). Value =" Abc ";' вы увидите разницу –

+0

Я знаю свойство 'defaultValue' для ввода текста, моя реальная проблема связана с элементами' select', хотя , –

Смежные вопросы