Val() не вызывает change() в jQuery
Я пытаюсь вызвать событие change
в текстовом поле, когда я изменяю его значение с помощью кнопки, но это не работает. Проверьте эту скрипту.
Если вы введете что-то в текстовые поля и щелкните в другом месте, запускается change
. Однако, если вы нажмете кнопку, значение текстового поля будет изменено, но change
не будет запускаться. Почему?
Ответы
Ответ 1
onchange
срабатывает только тогда, когда пользователь вводит во вход, а затем вход теряет фокус.
Вы можете вручную вызвать событие onchange
, используя после установки значения:
$("#mytext").change(); // someObject.onchange(); in standard JS
В качестве альтернативы вы можете trigger использовать событие:
$("#mytext").trigger("change");
Ответ 2
От redsquare отличное предложение, это работает хорошо:
$.fn.changeVal = function (v) {
return this.val(v).trigger("change");
}
$("#my-input").changeVal("Tyrannosaurus Rex");
Ответ 3
Вы можете очень легко переопределить функцию 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/
Ответ 4
Вам нужно связать метод следующим образом:
$('#input').val('test').change();
Ответ 5
Нет, вам может потребоваться запустить его вручную после установки значения:
$('#mytext').change();
или
$('#mytext').trigger('change');
Ответ 6
Похоже, что события не пузырятся. Попробуйте следующее:
$("#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')
, только если он изменился.
Ответ 7
Из https://api.jquery.com/change/:
Событие change
отправляется элементу при изменении его значения. Это событие ограничено <input>
элементами, <textarea>
и <select>
. Для флажков выбора, флажков и переключателей событие запускается немедленно, когда пользователь делает выбор с помощью мыши, но для других типов элементов событие откладывается до тех пор, пока элемент не теряет фокус.
Ответ 8
По состоянию на .addEventListener()
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">
Ответ 9
Я знаю, что это старая ветка, но для других пользователей приведенные выше решения, возможно, не так хороши, как следующие, вместо проверки событий change
, проверки input
событий.
$("#myInput").on("input", function() {
// Print entered value in a div box
$("#result").text($(this).val());
});