Istnieje wiele <input type="text">
możliwości zmiany wartości a , w tym:
- naciśnięcia klawiszy
- kopiuj wklej
- zmodyfikowany za pomocą JavaScript
- automatycznie uzupełniane przez przeglądarkę lub pasek narzędzi
Chcę, aby moja funkcja JavaScript była wywoływana (z bieżącą wartością wejściową) przy każdej zmianie. I chcę, aby to zostało wywołane od razu, nie tylko wtedy, gdy sygnał wejściowy traci ostrość.
Szukam najczystszego i najbardziej niezawodnego sposobu na zrobienie tego we wszystkich przeglądarkach (najlepiej przy użyciu jQuery).
javascript
jquery
html
Dustin Boswell
źródło
źródło
Odpowiedzi:
Ten kod jQuery przechwytuje natychmiastowe zmiany dowolnego elementu i powinien działać we wszystkich przeglądarkach:
źródło
input
to wydarzenie HTML5, które moim zdaniem powinno obejmować wszystkie nowoczesne przeglądarki ( odniesienie MDN ).keyup
powinien złapać resztę, choć z niewielkim opóźnieniem (input
jest uruchamiany po naciśnięciu klawisza).propertychange
jest zastrzeżonym zdarzeniem stwardnienia rozsianego i nie jestem pewien, czypaste
jest to faktycznie konieczne.document.getElementById('txtInput').value = 'some text';
input
zdarzenia tutaj stwierdza, że nie jest uruchamiany, gdy zawartość jest modyfikowana za pomocą JavaScript. Jednakonpropertychange
zdarzenie wywołuje modyfikację za pośrednictwem JS (patrz tutaj ). Więc ten kod będzie działał, gdy zawartość zostanie zmodyfikowana za pomocą JS w IE, ale nie będzie działać w innych przeglądarkach.Wymyślne rozwiązanie w czasie rzeczywistym dla jQuery> = 1.9
jeśli chcesz również wykryć zdarzenie „kliknięcie”, po prostu:
jeśli używasz jQuery <= 1.4, po prostu użyj
live
zamiaston
.źródło
Niestety myślę, że
setInterval
wygrywa nagrodę:To najczystsze rozwiązanie, tylko w 1 linii kodu. Jest również najbardziej niezawodny, ponieważ nie musisz się martwić o różne wydarzenia / sposoby
input
mogą przynieść wartość.Wady stosowania „setInterval” wydają się nie mieć zastosowania w tym przypadku:
źródło
Powiązanie z
oninput
wydarzeniem wydaje się działać dobrze w większości rozsądnych przeglądarek. IE9 też to obsługuje, ale implementacja jest błędna (zdarzenie nie jest uruchamiane podczas usuwania znaków).W jQuery w wersji 1.7+
on
metoda jest przydatna do powiązania ze zdarzeniem takim jak to:źródło
oninput
wydarzenie nie działa zinput[type=reset]
edycją javascript, jak widać w tym teście: codepen.io/yukulele/pen/xtEpbOdpowiedź z 2017 r . : zdarzenie wejściowe robi dokładnie to w przypadku nowszych wersji niż IE8.
źródło
input
zdarzenie nie wykrywa zmian JS.Niestety nie ma wydarzenia lub zestawu wydarzeń spełniających podane kryteria. Z naciśnięciem klawisza oraz kopiowaniem / wklejaniem można obsługiwać
keyup
zdarzenie. Zmiany w JS są trudniejsze. Jeśli masz kontrolę nad kodem, który ustawia pole tekstowe, najlepiej jest zmodyfikować go, aby bezpośrednio wywołać twoją funkcję lub wywołać zdarzenie użytkownika w polu tekstowym:Jeśli nie masz kontroli nad tym kodem, możesz
setInterval()
„obserwować” pole tekstowe pod kątem zmian:Ten rodzaj aktywnego monitorowania nie wykrywa aktualizacji natychmiast, ale wydaje się być wystarczająco szybki, aby nie było zauważalnego opóźnienia. Jak zauważył DrLouie w komentarzach, to rozwiązanie prawdopodobnie nie skaluje się dobrze, jeśli trzeba oglądać wiele danych wejściowych. Zawsze możesz dostosować drugi parametr,
setInterval()
aby sprawdzać częściej lub rzadziej.źródło
myTextBox.value = 'foo';
. Żadne zdarzenia JavaScript nie obsługują tej sytuacji.input.onpropertychange
, a FF2 +, Opera 9.5, Safari 3 i Chrome 1 mogą sobie z tym poradzićinput.__defineSetter__('value', ...)
(co, chociaż jest udokumentowane jako niedziałające w węzłach DOM, mogę zweryfikować to działa). Jedyną rozbieżnością w stosunku do implementacji IE jest to, że IE odpala program obsługi nie tylko w ustawieniach programowych, ale także podczas kluczowych zdarzeń.Oto nieco inne rozwiązanie, jeśli nie masz ochoty na inne odpowiedzi:
Weź pod uwagę, że nie można polegać na kliknięciu i wprowadzeniu klucza, aby przechwycić wklej menu kontekstowego.
źródło
$("input[id^=Units_]").each(function() {
Dodaj ten kod gdzieś, to załatwi sprawę.
Znalazłem to rozwiązanie w val () nie powoduje zmiany () w jQuery
źródło
Stworzyłem próbkę. Niech to zadziała dla ciebie.
http://jsfiddle.net/utbh575s/
źródło
W rzeczywistości nie musimy konfigurować pętli do wykrywania zmian w języku Java. Już skonfigurowaliśmy wiele detektorów zdarzeń dla elementu, który chcemy wykryć. po prostu wywołanie dowolnego szkodliwego zdarzenia spowoduje, że praca będzie działać.
i często jest to dostępne tylko wtedy, gdy masz pełną kontrolę nad zmianami javascript w swoim projekcie.
źródło
Najlepszym sposobem jest pokrycie tych trzech baz, które sam wymieniłeś. Prosty: onblur,: onkeyup itp. Nie będzie działał tak, jak chcesz, więc po prostu je połącz.
KeyUp powinien obejmować pierwsze dwa, a jeśli JavaScript modyfikuje pole wprowadzania, cóż, mam nadzieję, że to twój własny JavaScript, więc po prostu dodaj wywołanie zwrotne w funkcji, która go modyfikuje.
źródło
Oto działający przykład, którego używam do implementacji wariantu autouzupełniania, który wypełnia selektor (listę) jqueryui, ale nie chcę, aby działał dokładnie tak samo jak autouzupełnianie jqueryui, które robi menu rozwijane.
źródło
BEZ JQUERY! (W każdym razie jest to trochę przestarzałe)
Edycja: usunąłem zdarzenia HTML. NIE używaj zdarzeń HTML ... zamiast tego używaj nasłuchiwania zdarzeń JavaScript.
źródło
Nie możesz po prostu użyć
<span contenteditable="true" spellcheck="false">
elementu zamiast<input type="text">
?<span>
(zcontenteditable="true" spellcheck="false"
atrybutami as) różni się<input>
głównie dlatego, że:<input>
.value
właściwości, ale tekst jest renderowany jakoinnerText
i stanowi część jego wewnętrznego ciała.<input>
ale nie jest, mimo że ustawisz atrybutmultiline="true"
.Aby uzyskać wygląd, możesz oczywiście nadać mu styl CSS, jednocześnie wpisując wartość jako
innerText
jaką można uzyskać dla zdarzenia:Tutaj jest skrzypce .
Niestety jest coś, co tak naprawdę nie działa w IE i Edge, czego nie mogę znaleźć.
źródło
Chociaż to pytanie zostało opublikowane 10 lat temu, uważam, że nadal wymaga ono pewnych ulepszeń. Oto moje rozwiązanie.
Jedynym problemem związanym z tym rozwiązaniem jest to, że nie uruchomi się, jeśli wartość zmieni się w stosunku do javascript
$('selector').val('some value')
. Możesz zmienić dowolne zdarzenie na selektor, zmieniając wartość z javascript.źródło
możesz zobaczyć ten przykład i wybrać, które wydarzenia Cię interesują:
źródło
Mogę spóźnić się na imprezę tutaj, ale czy nie możesz po prostu użyć zdarzenia .change (), które zapewnia jQuery.
Powinieneś być w stanie zrobić coś takiego ...
Zawsze możesz powiązać go z listą kontrolek za pomocą czegoś takiego jak ...
Aktywny segregator zapewnia obsługę wszystkich elementów istniejących na stronie teraz i w przyszłości.
źródło
To najszybszy i czysty sposób na zrobienie tego:
Używam Jquery ->
Dla mnie działa całkiem dobrze.
źródło