val () не вызывает change () в jQuery - PullRequest
312 голосов
/ 05 июля 2010

Я пытаюсь вызвать событие change в текстовом поле, когда я изменяю его значение кнопкой, но оно не работает. Проверьте эту скрипку .

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

Ответы [ 9 ]

406 голосов
/ 05 июля 2010

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

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

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

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

$("#mytext").trigger("change");
56 голосов
/ 14 сентября 2011

От превосходного предложения redsquare, это прекрасно работает:

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

$("#my-input").changeVal("Tyrannosaurus Rex");
27 голосов
/ 13 мая 2014

Вы можете очень легко переопределить функцию 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);

Рабочий пример: здесь

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

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

//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/

15 голосов
/ 21 сентября 2016

Вам нужно связать метод следующим образом:

$('#input').val('test').change();
13 голосов
/ 05 июля 2010

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

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

или:

$('#mytext').trigger('change');
8 голосов
/ 05 июля 2010

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

$("#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'), только если оно изменилось.

1 голос
/ 19 февраля 2019

По состоянию на февраль 2019 .addEventListener() в настоящее время не работает с jQuery .trigger() или .change(), вы можете проверить его ниже, используя Chrome или Firefox.

txt.addEventListener('input', function() {
  console.log('not called?');
})
$('#txt').val('test').trigger('input');
$('#txt').trigger('input');
$('#txt').change();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" id="txt">

Вы должны использовать .dispatchEvent() вместо.

txt.addEventListener('input', function() {
  console.log('it works!');
})
$('#txt').val('yes')
txt.dispatchEvent(new Event('input'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="text" id="txt">
1 голос
/ 20 июля 2016

С https://api.jquery.com/change/:

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

0 голосов
/ 10 мая 2019

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

$("#myInput").on("input", function() {
    // Print entered value in a div box
    $("#result").text($(this).val());
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...