2010-07-05 3 views
251

Я пытаюсь вызвать событие change в текстовом поле, когда я меняю его значение кнопкой, но он не работает. Проверьте this fiddle.val() не вызывает изменение() в jQuery

Если вы введете что-то в текстовых полях и щелкните в другом месте, то запускается change. Однако, если вы нажмете кнопку, значение текстового поля будет изменено, но change не активируется. Зачем?

+2

возможно дубликат (http://stackoverflow.com/questions/ 2247386/jquery-textbox-valxxxx-not-cause-change-to-fire) – 2012-06-04 17:40:31

+0

Сам заголовок ответил на мой вопрос. Подтверждено в ** [.change()] (https://api.jquery.com/change/) ** желтый "Примечание: изменение значения элемента ввода с использованием JavaScript с использованием .val(), например, т огонь события ". –

ответ

331

onchange только срабатывает, когда пользователь вводит на вход, а затем вход теряет фокус.

Вы можете вручную вызвать onchange событие, используя после установки значения:

$("#mytext").change(); // someObject.onchange(); in standard JS 

В качестве альтернативы, вы можете trigger событие с помощью:

$("#mytext").trigger("change"); 
+0

Есть ли причина, по которой ребята jQuery не реализовали это? – Ergec

+1

Не реализовал что? – GenericTypeTea

+15

не стесняйтесь расширять jquery и добавлять функцию valWithChange, которая будет делать то, что вы хотите. Это не может быть действием по умолчанию столько раз, что вы не хотите, чтобы инициирование события зависало от автоматического изменения значения, только когда пользователь взаимодействует с элементом – redsquare

12

Нет вы, возможно, потребуется запустить его вручную после установки значение:

$('#mytext').change(); 

или:

$('#mytext').trigger('change'); 
7

Похоже, что события не пузырятся. Попробуйте следующее:

$("#mybutton").click(function(){ 
    var oldval=$("#mytext").val(); 
    $("#mytext").val('Changed by button'); 
    var newval=$("#mytext").val(); 
    if (newval != oldval) { 
    $("#mytext").trigger('change'); 
    } 
}); 

Надеюсь, это поможет.

Я попробовал просто обычный старый $("#mytext").trigger('change') без сохранения старого значения, а .change срабатывает, даже если значение не изменилось. Вот почему я сохранил предыдущее значение и вызвал $("#mytext").trigger('change'), только если он изменился.

+0

Удивленно это не было больше голосов, так как это текущая эффективная реализация изменения элемента HTML. – vol7ron

50

С отличным предложением RedSquare, это прекрасно работает:

$.fn.changeVal = function (v) { 
    return $(this).val(v).trigger("change"); 
} 

$("#my-input").changeVal("Tyrannosaurus Rex"); 
+3

Вам не нужно обертывать 'this':' return this.val (v) .trigger ("change"); ' –

21

Вы можете очень легко переопределить функцию val, чтобы вызвать изменение, заменив его прокси к исходному val функции.

просто добавить этот код где-то в документе (после загрузки JQuery)

(function($){ 
    var originalVal = $.fn.val; 
    $.fn.val = function(){ 
     var result =originalVal.apply(this,arguments); 
     if(arguments.length>0) 
      $(this).change(); // OR with custom event $(this).trigger('value-changed'); 
     return result; 
    }; 
})(jQuery); 

Рабочий пример: here

(Обратите внимание, что это всегда будет вызывать change когда val(new_val) называется, даже если значение Didn Фактически это изменилось.)

Если вы хотите активировать изменение ТОЛЬКО при фактическом изменении значения, используйте его:

//This will trigger "change" event when "val(new_val)" called 
//with value different than the current one 
(function($){ 
    var originalVal = $.fn.val; 
    $.fn.val = function(){ 
     var prev; 
     if(arguments.length>0){ 
      prev = originalVal.apply(this,[]); 
     } 
     var result =originalVal.apply(this,arguments); 
     if(arguments.length>0 && prev!=originalVal.apply(this,[])) 
      $(this).change(); // OR with custom event $(this).trigger('value-changed') 
     return result; 
    }; 
})(jQuery); 

Живой пример для этого: http://jsfiddle.net/5fSmx/1/

+3

Хм, ненужное утиное исправление, я думаю :-p. Может быть лучше, поскольку [прокомментирован redsquare] (http://stackoverflow.com/questions/3179385/val-doesnt-trigger-change-in-jquery#comment3273526_3179392), дать такой функции другое имя, чем '.val() '. – binki

+1

Если вы переименуете его, вы должны изменить существующий код - таким образом, ваш существующий код будет продолжать работать. –

+3

Но тогда весь код, написанный с правильным определением '.val()' в виду, внезапно начнет производить сторону -эффекты: -p. – binki

0

От https://api.jquery.com/change/:

change событие посылается к элементу, когда его значение изменяется.Это событие ограничено <input> элементами, <textarea> боксами и <select> элементами. Для флажков выбора, флажков и переключателей событие немедленно запускается, когда пользователь делает выбор с помощью мыши, но для других типов элементов событие откладывается до тех пор, пока элемент не теряет фокус.

10

Вы должны приковать метод, как это: [? JQuery textbox.val ('хххх') не вызывает изменений в огонь]

$('#input').val('test').change(); 
+0

<3 для цепочки! –

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