Wykrywasz zmianę wejścia w jQuery?

359

W przypadku użycia jquery .changena inputzdarzeniu zostanie uruchomione tylko wtedy, gdy wejście utraci fokus

W moim przypadku muszę zadzwonić do serwisu (sprawdzić, czy wartość jest poprawna), jak tylko zmieni się wartość wejściowa. Jak mogłem to osiągnąć?

Banshee
źródło
3
jaki rodzaj wkładu? pole tekstowe? pole wyboru? radio? textarea? zobaczmy, co do tej pory wymyśliłeś
Patricia
Przepraszamy, jest to wpisanie tekstu tekstowego. I jak powiedziałem, próbowałem zmiany, ale nie uruchamia się tak, jak potrzebuję (dla każdej zmiany tekstu na wejściu). Próbowałem również keydown, ale aby to zadziałało, będę musiał zachować ostrożność, jeśli dane wejściowe są „brudne”, czy nie.
Banshee
2
jeśli naciskają klawisz, zmieni się to w 99% przypadków, zawsze możesz sprawdzić klucze, których nie ma w module obsługi zdarzeń.
Patricia

Odpowiedzi:

545

AKTUALIZACJA dla wyjaśnienia i przykładu

przykłady: http://jsfiddle.net/pxfunc/5kpeJ/

Metoda 1. inputzdarzenie

W nowoczesnych przeglądarkach wykorzystaj to inputwydarzenie. To zdarzenie zostanie uruchomione, gdy użytkownik pisze w polu tekstowym, wkleja, cofa, w zasadzie za każdym razem, gdy wartość zmienia się z jednej wartości na drugą.

W jQuery zrób to w ten sposób

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

wychodząc z jQuery 1,7, wymienić bindw on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Metoda 2. keyupzdarzenie

W starszych przeglądarkach należy użyć keyupzdarzenia (będzie ono uruchamiane po zwolnieniu klawisza na klawiaturze, to zdarzenie może dać rodzaj fałszywie dodatniego, ponieważ po zwolnieniu „w” wartość wejściowa jest zmieniana i keyupzdarzenie jest uruchamiane, ale także gdy Klawisz „shift” jest zwolniony, keyupzdarzenie jest uruchamiane, ale nie wprowadzono żadnych zmian w danych wejściowych.). Również ta metoda nie jest uruchamiana, jeśli użytkownik kliknie prawym przyciskiem myszy i wklei z menu kontekstowego:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Metoda 3. Timer ( setIntervallub setTimeout)

Aby obejść ograniczenia keyup, możesz ustawić zegar, aby okresowo sprawdzał wartość wejścia w celu ustalenia zmiany wartości. Możesz użyć setIntervallub, setTimeoutaby wykonać to sprawdzenie timera. Zobacz zaznaczoną odpowiedź na to pytanie SO: zmiana zdarzenia w polu tekstowym jQuery lub zobacz skrzypce dla działającego przykładu użycia focusi blurzdarzeń do uruchomienia i zatrzymania stopera dla określonego pola wejściowego

MikeM
źródło
Czy możesz wyjaśnić więcej na temat tego rozwiązania? Jak uzyskać aktualną wartość? Jak mogę to uruchomić tylko wtedy, gdy zostaną wprowadzone zmiany w bieżącej wartości?
Banshee
zdarzenie wejściowe? w jQuery (jeszcze) nie ma zdarzenia wejściowego ... stackoverflow.com/q/11189136/104380
vsync
W przypadku metody 2 zwykle wiążę się zarówno z modyfikacją, jak i zmianą. W ten sposób w sytuacjach, gdy wprowadzanie danych odbywa się bez naciśnięcia klawisza (np. Wklejanie), przynajmniej wywoła zdarzenie, gdy wejście straci fokus.
rspeed
1
@AdiDarachi MutationObserver będzie śledzić zmiany w elementach DOM. Jednak użytkownik zmieniający dane w polu wejściowym nie wyzwala zmiany MutationObserver ... Konfiguruję przypadek testowy, tylko zmiana kodu JS na atrybut innerTextlub value(symulowanie danych wejściowych użytkownika) wyzwoli zdarzenie MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (zobacz logowanie zdarzeń MutationObserver w pliku console.log). Czy masz inny przypadek testowy, na który mogę spojrzeć?
MikeM
1
nie działa to, gdy skrypt zmienia wartość
FalcoGer
189

Jeśli masz HTML5:

  • oninput (odpala tylko wtedy, gdy zmiana faktycznie nastąpi, ale robi to natychmiast)

W przeciwnym razie należy sprawdzić wszystkie te zdarzenia, które mogą wskazywać na zmianę wartości elementu wejściowego:

  • onchange
  • onkeyup( nie keydown lub keypressjako wartość wejściowa nie będzie jeszcze zawierać nowego naciśnięcia klawisza)
  • onpaste (gdy obsługiwane)

I może:

  • onmouseup (Nie jestem tego pewien)
Alnitak
źródło
@ anomik z mojego testu działa dla pól wyboru; oprócz IE / Edge. Mogą pojawić się inne wyjątki, ale mądrzej jest używać onchange dla tych typów danych wejściowych (IMHO).
HellBaby,
82

Dzięki HTML5 i bez użycia jQuery możesz użyć inputzdarzenia :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Będzie on uruchamiany przy każdej zmianie tekstu wejściowego.

Obsługiwane w IE9 + i innych przeglądarkach.

Wypróbuj na żywo w jsFiddle tutaj .

Drew Noakes
źródło
1
„zmiana” działa tylko przy rozmyciu, a nie przy zmianie tekstu. Użyj zdarzenia „input”, aby wykryć zmiany tekstu.
Dermot Doherty
14

Jak już sugerowali inni, rozwiązaniem w twoim przypadku jest wąchanie wielu zdarzeń .
Wtyczki wykonujące tę pracę często nasłuchują następujących zdarzeń:

$ wejście . on ( „zmiana keypown keupress keupress mousedown kliknij mouseup” , moduł obsługi );

Jeśli uważasz, że może pasować, można dodać focus, bluri inne imprezy też.
Sugeruję, aby nie przekraczać liczby zdarzeń do nasłuchiwania, ponieważ ładuje do pamięci przeglądarki dalsze procedury do wykonania zgodnie z zachowaniem użytkownika.

Uwaga: pamiętaj, że zmiana wartości elementu wejściowego za pomocą JavaScript (np. Za pomocą .val()metody jQuery ) nie spowoduje uruchomienia żadnego z powyższych zdarzeń.
(Odniesienie: https://api.jquery.com/change/ ).

Emanuele Del Grande
źródło
Polecam również dodanie fokusa, aby uniknąć problemów z autouzupełnianiem
binar
Widzę. Szukałem i wydaje się, że focusout jest obsługiwany tylko przez IE, a częściowo przez Chrome, czy mam rację?
Emanuele Del Grande
5
Jako łagodny dodatek, aby uruchomić zdarzenie z jQuery, możesz wywołać odpowiednią akcję po .val()np. Zdarzeniu zmiany w polu wejściowym, zrobiłbyś coś takiego ... $('#element').val(whatever).change()
techknowcrat
2

Jeśli chcesz, aby zdarzenie było uruchamiane za każdym razem, gdy coś ulegnie zmianie w elemencie, możesz użyć zdarzenia kluczowania .

Jivings
źródło
Okej, ale czy to nie jest mniej więcej to samo, co skrót klawiszowy? Będę musiał sam sprawdzić, czy dane wejściowe są „brudne”?
Banshee
@SnowJim, jeśli chcesz robić rzeczy tylko wtedy, gdy dane wejściowe faktycznie się zmieniają, musisz sam użyć onchangelub śledzić stan. keydownnie działa, ponieważ jest uruchamiany przed zmianą stanu wejścia.
Alnitak
@Alnitak dokładnie i dlatego zadaję pytanie tutaj. Onchange nie działa, jest wyrzucany tylko przy opuszczaniu wejścia.
Banshee
Słoń w pokoju oczywiście jest mobilny. Z pewnością nie przydadzą się żadne zdarzenia związane z klawiaturą lub myszą. : p
Askdesigners
@Askdesigners Zdarzenia Keyup / down powinny nadal działać w ten sam sposób na urządzeniach mobilnych.
Jivings
2

// .blur jest wyzwalany, gdy element traci fokus

$('#target').blur(function() {
  alert($(this).val());
});

// Aby wyzwalać ręcznie, użyj:

$('#target').blur();
Kszili
źródło
1
.change jest, jak powiedziałem, wyrzucany tylko wtedy, gdy wejście utraci fokus i wartość zostanie zmieniona, muszę uzyskać wyrównanie, gdy tylko zmieni się wejście (tekst) (jak tylko tekst w wejściu zostanie zmieniony). Rozmycie zostanie uruchomione tylko wtedy, gdy sygnał wejściowy straci ostrość.
Banshee
1

Są to zdarzenia jQuery jak keyup i naciśnięciu klawisza , który można wykorzystać do wprowadzania elementów HTML. Możesz dodatkowo użyć zdarzenia blur () .

programista
źródło
1
.change jest, jak powiedziałem, wyrzucany tylko wtedy, gdy wejście utraci fokus i wartość zostanie zmieniona, muszę uzyskać wyrównanie, gdy tylko zmieni się wejście (tekst) (jak tylko tekst w wejściu zostanie zmieniony). Rozmycie zostanie uruchomione tylko wtedy, gdy sygnał wejściowy straci ostrość.
Banshee
1
nie można wiarygodnie sprawdzić wartości wejściowej podczas keypresszdarzenia, ponieważ naciśnięty klawisz jeszcze nie zmieni tej wartości.
Alnitak
0

Obejmuje to każdą zmianę danych wejściowych za pomocą jQuery 1.7 i nowszych:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
źródło