Если вы только что добавили опцию выбора в форму и хотите запустить событие изменения, я обнаружил, что требуется setTimeout, иначе jQuery не подхватит вновь добавленное поле выбора:

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

<select id="single">
    <option>Single</option>
    <option>Single2</option>
</select>

<script>
    $(function() {
        $(":input#single").change(function() {
           /* Logic here does not execute when val() is used */
        });
    });

    $("#single").val("Single2");
</script>

Ответы на вопрос(9)

Я считаю, что вы можете вручную вызвать событие изменения сtrigger():

$("#single").val("Single2").trigger('change');

Хотя почему он не срабатывает автоматически, я понятия не имею.

 Triynko30 нояб. 2016 г., 20:42
Вызов .change () является сокращением для вызова .trigger ('change').
 Maneesh Kumar19 сент. 2013 г., 13:16
Я не могу заставить это работать, также $ ("# single"). Val ("Single2"). Change (); Я динамически создаю выпадающий список и меняю его значение (у меня это нормально работает) Но когда я пытаюсь вызвать изменения, у меня это не работает.
 iono05 сент. 2016 г., 10:27
@Juhana Я думаю, что бесконечный цикл гораздо легче заметить, диагностировать и исправить, чем val (), который таинственным образом не запускает привязки «изменения».
 JJJ28 июн. 2014 г., 12:21
«Бит» запоздал, но он не срабатывает автоматически, потому что это приведет к бесконечным циклам. Думать$('#foo').change(function() { $( this ).val( 'whatever' ); });
$(":input#single").trigger('change');

обытием chainSelect, мне нужно передать 3 значения по URL и по умолчанию выбрать все выпадающий список. Я использовал это

$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');

И первое событие сработало.

 Denis V13 сент. 2013 г., 20:57
Я надеюсь, вы никогда не делаете это в реальном мире. Само собой разумеется, что $ _GET [«что угодно»] нельзя доверять.

когда захотите, чтобы изменение значения также вызывало изменение

$.fn.valAndTrigger = function (element) {
    return $(this).val(element).trigger('change');
}

а также

$("#sample").valAndTirgger("NewValue");

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

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        this.trigger("change");
        return originalVal.call(this, value);
    };
})(jQuery);

Образец вhttp://jsfiddle.net/r60bfkub/

 Bhargav Nanekalva23 мая 2017 г., 17:04
Мой браузер жалуется на слишком много рекурсии, есть какое-то исправление для этого?
 Kamafeather24 янв. 2018 г., 18:31
Вы слушаетеchange-включение элемента управления и выполнение обратного вызова, который (прямо или косвенно) снова вызываетchangeСобытие над тем же контролем. Я предлагаю вам использовать другое имя для события, которое вы запускаете вручную (например,explicit.change), чтобы он не вызывалchange- событие, предотвращает зацикливание, и все же позволяет реагировать на событие.

отел подключиться к событию изменения метабокса загрузки файла.

Поэтому, если вы не можете изменить код, который вызывает изменение (в данном случае сценарий CMB2), используйте код ниже. Триггер вызывается ПОСЛЕ установки значения, в противном случае ваш EventHandler изменения будет работать, но значение будет предыдущим, а не установленным.

Вот код, который я использую:

(function ($) {
    var originalVal = $.fn.val;
    $.fn.val = function (value) {
        if (arguments.length >= 1) {
            // setter invoked, do processing
            return originalVal.call(this, value).trigger('change');
        }
        //getter invoked do processing
        return originalVal.call(this);
    };
})(jQuery);
 jwebb14 сент. 2018 г., 05:51
Я имею в виду, @ user2075039, что если на странице есть несколько входов, использующих функцию jQuery val (), и вы не хотите связывать обработчик пользовательских изменений со ВСЕМИ, а только с одним из них?
 jwebb20 июл. 2018 г., 17:33
Это хорошо, но можете ли вы показать, как вы можете ограничить его одним конкретным входом?
 user207503913 сент. 2018 г., 16:07
@jwebb Не совсем уверен, что ты имеешь в виду? Мы переопределяем функцию jQuery val (). Вы привязываете обработчик события изменения к определенному входу.

вы можете указать свое собственное событие.

$('input.test').on('value_changed', function(e){
    console.log('value changed to '+$(this).val());
});

чтобы вызвать событие на заданном значении, вы можете сделать

$('input.test').val('I am a new value').trigger('value_changed');

когда пользователь нажимает на опцию.

http://api.jquery.com/change/

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

 user286728816 мар. 2016 г., 16:51
Если под «немедленно» вы подразумеваете «всякий раз, когда нажимается клавиша на входе», вы ищете события onkeyup, onkeypress и onkeydown, а не onchange.
 Dan Nissenbaum12 апр. 2015 г., 00:01
Каковы альтернативы для других типов элементов? Я хочу, чтобы событие 'change' сработало немедленно дляinput элементы, а не когда элемент теряет фокус. Вы знаете?
Решение Вопроса

change Событие требует фактического события браузера, инициированного пользователем, а не через код JavaScript.

Сделайте это вместо этого:

$("#single").val("Single2").trigger('change');

или же

$("#single").val("Single2").change();
 Dustin Poissant19 нояб. 2016 г., 14:56
Я согласен, что это правильный ответ, но это абсолютно отстой и разрушает то, что я пытаюсь сделать.
 BKSpurgeon26 июл. 2016 г., 08:41
@ user113716 вы бы знали, как это сделать, не зная значений?
 Satanand Tiwari29 мая 2017 г., 13:39
это не работает для меня.
 Pankaj14 нояб. 2014 г., 09:51
Привет, делаю это обновление выпадающего. но вызывается onChange () рекурсивно.
 Jess08 окт. 2015 г., 16:04
Я копаю этот ответ. Это работает, но разве нет лучшего способа с jQuery? Я уверен, что мы ВСЕ будем помнить делать это каждый раз, когда мы меняем значение, для которого настроен обработчик изменений (сарказм). Каркасы, которые используют привязку данных, могут решить эту проблему лучше?

бытие изменения, я обнаружил, что требуется setTimeout, иначе jQuery не подхватит вновь добавленное поле выбора:

window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);

$(":input#single").trigger('change');
 user11371612 янв. 2011 г., 19:41
Да, но вам не нужно делать отдельный выбор DOM для этого с$(":input#single"), На самом деле вы действительно не должны. Просто цепочка после.val(), Вы можете использовать.trigger('change') или же.change(), Они точно такие же.

Ваш ответ на вопрос