Почему событие изменения jquery не срабатывает, когда я устанавливаю значение выбора с помощью val ()? - PullRequest
364 голосов
/ 12 января 2011

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

570 голосов
/ 12 января 2011

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

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

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

или

$("#single").val("Single2").change();
44 голосов
/ 12 января 2011

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

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

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

9 голосов
/ 12 января 2011

Добавление этого фрагмента кода после того, как val (), кажется, работает:

$(":input#single").trigger('change');
8 голосов
/ 12 января 2011

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

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

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

6 голосов
/ 29 сентября 2015

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

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

3 голосов
/ 14 ноября 2014

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

$('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');
2 голосов
/ 01 декабря 2016

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

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

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

(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);
1 голос
/ 24 июля 2015

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

window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);
1 голос
/ 27 декабря 2011
$(":input#single").trigger('change');

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...