Dlaczego Zdarzenie jQuery change nie uruchamia się, gdy ustawiam wartość select za pomocą val()?

Logika procedury obsługi zdarzeń change() nie jest uruchamiana, gdy wartość jest ustawiona przez val(), ale działa, gdy użytkownik wybierze wartość za pomocą myszy. Dlaczego?

<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>
Author: jnuK, 2011-01-12

9 answers

Ponieważ zdarzenie change wymaga rzeczywistego zdarzenia przeglądarki zainicjowanego przez użytkownika, a nie za pomocą kodu javascript.

Zrób to zamiast:

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

Lub

$("#single").val("Single2").change();
 549
Author: user113716,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-16 05:01:57

Wierzę, że można ręcznie uruchomić zdarzenie zmiany za pomocą trigger():

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

Chociaż dlaczego nie odpala automatycznie, nie mam pojęcia.

 43
Author: David Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 18:32:04

O ile mogę przeczytać w API. zdarzenie jest wywoływane tylko wtedy, gdy użytkownik kliknie na opcję.

Http://api.jquery.com/change/

Dla pól wyboru, checkboxów i przyciski radiowe, zdarzenie zostanie wywołane natychmiast, gdy użytkownik dokonuje zaznaczanie za pomocą myszki, ale dla inne typy elementów zdarzenia to odroczony do czasu, aż element straci skup się.

 8
Author: Marnix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 18:34:15

Dodanie tego fragmentu kodu po Val() wydaje się działać:

$(":input#single").trigger('change');
 8
Author: Eric Belair,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-12 18:38:19

Aby to ułatwić dodaj niestandardową funkcję i wywołaj ją, gdy chcesz, aby zmiana wartości również wyzwalała zmianę

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

I

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

Lub możesz nadpisać funkcję val, aby zawsze wywoływać zmianę, gdy val zostanie wywołane

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

Próbka w http://jsfiddle.net/r60bfkub/

 6
Author: Alireza Fattahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-29 05:57:30

Jeśli nie chcesz mieszać z domyślnym zdarzeniem zmiany, możesz podać swoje własne Zdarzenie

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

Aby wywołać zdarzenie na ustawionej wartości, możesz wykonać

$('input.test').val('I am a new value').trigger('value_changed');
 3
Author: codingrhythm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-13 22:57:33

Napotkałem ten sam problem podczas korzystania z CMB2 z WordPressem i chciałem podłączyć się do zdarzenia zmiany uploadu pliku metabox.

Więc jeśli nie jesteś w stanie zmodyfikować kodu, który wywołuje zmianę (w tym przypadku skrypt CMB2), użyj poniższego kodu. Wyzwalacz jest wywoływany po ustawieniu wartości, w przeciwnym razie twoja zmiana eventHandler będzie działać, ale wartość będzie poprzednią, a nie ustawioną.

Oto kod, którego używam:

(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);
 2
Author: user2075039,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-01 10:24:00
$(":input#single").trigger('change');
To zadziałało na mój scenariusz. Mam 3 combo & wiązać z chainselect zdarzenia, muszę przekazać 3 wartości przez url & domyślnie Wybierz wszystko rozwijane. Użyłem tego
$('#machineMake').val('<?php echo $_GET['headMake']; ?>').trigger('change');

I pierwsze zdarzenie zadziałało.

 1
Author: Prashant Patil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-27 16:48:51

Jeśli właśnie dodałeś opcję select do formularza i chcesz wywołać zdarzenie change, znalazłem setTimeout jest wymagany, w przeciwnym razie jQuery nie odbierze nowo dodanego pola select:

window.setTimeout(function() { jQuery('.languagedisplay').change();}, 1);
 0
Author: Dave Hilditch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-24 12:18:59