Почему событие изменения jquery не запускается, когда я устанавливаю значение select с помощью val()?

Логика в обработчике событий 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>

Ответ 1

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

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

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

или

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Ответ 4

Добавление этой части кода после работы val():

$(":input#single").trigger('change');

Ответ 5

Чтобы упростить добавление пользовательской функции и вызвать ее, когда вы хотите, чтобы изменение значения также вызывало изменение

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

Ответ 6

Если вы не хотите смешивать с событием изменения по умолчанию, вы можете предоставить свое собственное событие

$('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');

Ответ 7

Я столкнулся с той же проблемой при использовании CMB2 с Wordpress и хотел подключиться к событию изменения файла uploadox exchange.

Поэтому, если вы не можете изменить код, вызывающий изменение (в данном случае CMB2 script), используйте код ниже. Триггер вызывается ПОСЛЕ того, как значение установлено, в противном случае ваше изменение 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);

Ответ 8

$(":input#single").trigger('change');

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

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

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

Ответ 9

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

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