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>
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();
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.
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ę.
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ę.
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');
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/
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');
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);
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.
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);
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