Logika w change()
module obsługi zdarzeń nie jest uruchamiana, gdy wartość jest ustawiona przez val()
, ale działa, gdy użytkownik wybiera wartość za pomocą myszy. Dlaczego to?
<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>
Wierzę, że możesz ręcznie uruchomić zdarzenie zmiany za pomocą
trigger()
:Choć nie uruchamia się automatycznie, nie mam pojęcia.
źródło
$('#foo').change(function() { $( this ).val( 'whatever' ); });
Wydaje się, że dodanie tego fragmentu kodu po val () działa:
źródło
$(":input#single")
. W rzeczywistości nie powinieneś. Po prostu połącz go za.val()
. Możesz użyć.trigger('change')
lub.change()
. Są dokładnie takie same.O ile mogę przeczytać w API. Zdarzenie jest uruchamiane tylko wtedy, gdy użytkownik kliknie opcję.
http://api.jquery.com/change/
źródło
input
elementów, a nie gdy element traci skupienie. Czy wiesz?Aby ułatwić dodanie niestandardowej funkcji i wywoływanie jej, kiedy tylko chcesz, zmiana wartości powoduje również zmianę
i
Lub można zastąpić funkcję val, aby zawsze wywoływała zmianę, gdy wywoływana jest val
Próbka na http://jsfiddle.net/r60bfkub/
źródło
change
-event nad kontrolką i wykonujesz wywołanie zwrotne, które (bezpośrednio lub pośrednio) ponownie wyzwalachange
-event nad tą samą kontrolką. Sugeruję, abyś użył innej nazwy dla zdarzenia, które wyzwalasz ręcznie (np.explicit.change
), Aby nie ponownie wyzwalałochange
-event, zapobiega pętli i nadal pozwala reagować na zdarzenie.Jeśli nie chcesz mieszać się z domyślnym zdarzeniem zmiany, możesz podać niestandardowe zdarzenie
aby wywołać zdarzenie przy ustawionej wartości, możesz to zrobić
źródło
Napotkałem ten sam problem podczas korzystania z CMB2 z Wordpress i chciałem przyłączyć się do zdarzenia zmiany metaboksu przesyłania plików.
Jeśli więc nie możesz 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 zmiana zdarzenia eventHandler będzie działać, ale wartość będzie poprzednia, a nie ustawiona.
Oto kod, którego używam:
źródło
this.selector
wewnątrz$.fn.val
funkcji przesłonięcia dla określonego selektora (będzie to zależało od tego, co jest używane dla selektora). To jest najlepsze, jakie znalazłem do robienia tego tylko dla określonych pól, jedynym problemem jest to, że musisz wiedzieć, czego używają dla selektoraTo zadziałało w moim skrypcie. Mam 3 kombinacje i powiązanie ze zdarzeniem chainSelect, muszę przekazać 3 wartości według adresu URL i domyślnie zaznacz wszystkie rozwijane. Użyłem tego
I pierwsze wydarzenie zadziałało.
źródło
Jeśli właśnie dodałeś opcję select do formularza i chcesz wywołać zdarzenie zmiany, znalazłem, że wymagany jest setTimeout, w przeciwnym razie jQuery nie odbierze nowo dodanego pola wyboru:
źródło