2014-10-22 15 views
4

У нас есть один из тех сценариев, где вы предпочитаете, чтобы событие запускалось только при выходе из поля ввода. Это связано с тем, что событие приводит к «обратной передаче», такой как запрос ajax, который, в свою очередь, обновляет поля ввода. Событие изменения начнет бесконечный цикл.событие jQuery change-and-then-blur

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

То, что я ищу, это своего рода событие «изменить-и-то-размытости», который выстреливает если поле изменилось, но только когда он остается (размытыми).

Я считаю, что jQuery не имеет этого из коробки. Есть ли простой способ расширить его для этого?

Обновление - Я только что попытался воспроизвести проблему бесконечного цикла в простой jsfiddle - безрезультатно.

Применяется нокаут, а также jQuery autoNumeric и пользовательское автоматическое нонизование. Значения обновляются с помощью ko.mapping. Но даже при включении всех этих моих jsfiddle, похоже, отлично работает с простым событием jQuery change: http://jsfiddle.net/a1tbxnpp/

+0

Я полностью не понял вашу проблему ... Событие изменения вызывается только один раз, если вы хотите быть уверенным, что поля не сфокусированы, просто проверьте, сосредоточено ли оно ... http://api.jquery.com/ focus-selector/Но событие изменения произошло главным образом, когда поле размыто. – Loenix

+0

@ Loenix - вы совершенно правы. Я обновил свой вопрос. Я не могу «отменить» его, поскольку у него уже есть ответ. Я также не могу закрыть его с немедленным эффектом. – chiccodoro

+0

, пожалуйста, проверьте это [http://stackoverflow.com/questions/16710227/intercept-value-changes-within-blur-event](http://stackoverflow.com/questions/16710227/intercept-value-changes-within -blur-event) –

ответ

2

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

+0

довольно поздно upvote от моего :-) – chiccodoro

1

Ну ... отвечая на мой собственный вопрос, я просто попытался следующим, и это похоже на работу в первую очередь:

$(":input").each(function() { 
    var $el = $(this), 
     oldValue = $el.val(); 

    $el.focus(function() { 
     oldValue = $el.val(); 
    }); 

    $el.blur(function() { 
     var newValue = $el.val(); 
     if (oldValue != newValue) { 
      $el.trigger('changeblur'); 
     } 
    }); 
}); 

Я думаю, что нет простого ответа, чем ...

+0

Это работает, но для элементов, которые создаются «на лету», мы должны сделать что-то вроде этого: 'var inputOldValue; $ ('body'). on ('focus', 'input, textarea, select', function() {inputOldValue = $ (this) .val();}); $ (this) .val()) {$ (this) .trigger ('changeBlur');}}); 'И я использовал' 'input, textarea, select'' здесь вместо '': input'', потому что первый был быстрее последнего. – artificis

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