html <input type = “text” /> zdarzenie onchange nie działa

88

Próbuję zrobić jakiś eksperyment. Chcę, aby za każdym razem, gdy użytkownik wpisze coś w polu tekstowym, zostanie to wyświetlone w oknie dialogowym. Użyłem onchangewłaściwości event, aby to się stało, ale to nie działa. Nadal muszę nacisnąć przycisk przesyłania, aby to zadziałało. Czytałem o AJAX i myślę, żeby się o tym dowiedzieć. Czy nadal potrzebuję AJAX, aby działał, czy wystarczy prosty JavaScript? Proszę pomóż.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}
Newbie Coder
źródło
4
możesz wysłać „this” zamiast identyfikatora, więc nie musisz dzwonić do getElementById
remi bourgarel
Tak ... dzięki, zrobiłem to, co powiedział mi Ash Burlaczenko ...
Newbie Coder
Dzięki JQuery, ładne rozwiązanie zaproponowane tutaj: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Odpowiedzi:

127

onchangejest uruchamiany tylko wtedy, gdy kontrola jest zamazana. Spróbuj onkeypresszamiast tego.

Ignacio Vazquez-Abrams
źródło
19
Nie działa w przypadku wykrywania zmian po
wklejeniu
19
To właśnie rozwiązało mój problem. Wolę onkeyupjednak, ponieważ otrzymuje nową wartość w input('element.value')
stealthjong
4
Zauważyłem również, że "keypress" nie podnosi się po naciśnięciu klawisza Backspace, przynajmniej podczas używania jquery. „keyup” jest podnoszony po naciśnięciu i zwolnieniu klawisza Backspace. „Wejście” rozwiązuje ten problem, a także działa przy kopiowaniu i wklejaniu i myślę, że jest to właściwe rozwiązanie w tym przypadku (jak użytkownik „99 problemów - składnia to nie jeden”, wskazuje poniżej).
Patrick Finnigan
4
„onkeypres”, „onkeyup” itp. nie jest rozwiązaniem, gdy chce się wywołać funkcję tylko wtedy, gdy tekst się zmienił ! W tym przypadku kluczowe wydarzenia generują niepotrzebny ruch. (Bardzo dziwne, że ta odpowiedź została wybrana jako rozwiązanie, zwłaszcza przy tak małej liczbie głosów! Nie głosuję przeciw, ponieważ nie lubię tylko głosować przeciw odpowiedziom. Wolę podać powód (y), dlaczego tak jest nie OK - to jest bardziej pomocne!)
Apostolos
W przypadku HTML ≥5 lub jQuery ≥1,7 poniżej znajdują się inne rozwiązania, które również obsługują wklejanie ze schowka.
user202729
41

Służy .on('input'...do monitorowania każdej zmiany danych wejściowych (wklejanie, kluczowanie itp.) Z jQuery 1.7 i nowszych.

Dla wejść statycznych i dynamicznych:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

Tylko dla wejść statycznych:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle ze statycznym / dynamicznym przykładem: https://jsfiddle.net/op0zqrgy/7/

rybo111
źródło
U mnie to zadziałało idealnie - dzięki. Uwaga dla innych - nie zapomnij o wykonaniu powyższego kodu w swoim onLoad lub czymś, co spowoduje „rozpoczęcie” monitorowania.
Robert Penridge,
Za późno na komentarz, ale ... Dlaczego sugerujesz użycie jQuery, skoro odpowiadający użytkownik pokazuje zwykły JavaScript?
Andrés Morales
@ AndrésMorales Jest to powszechna biblioteka, do której wiele aplikacji ma natychmiastowy dostęp i którą można łatwo dodać do tych, które go nie mają. Oczywiście ta odpowiedź nie dotyczy tych aplikacji, które nie mogą (lub nie chcą) używać jQuery.
rybo111
@ rybo111 Dokładnie! jQuery jest popularną i szeroko używaną biblioteką, ale bezpośrednio łączy w moim mózgu z pytaniem memowym o „zsumowanie dwóch liczb przy użyciu JavaScript” i najbardziej pozytywną odpowiedzią na temat używania jQuery do tego celu. Tak nie jest, ale wiele osób nie potrafi oddzielić JavaScript od jQuery.
Andrés Morales
@ AndrésMorales Zwróć uwagę, że moja odpowiedź dotyczy „wklejania, używania klucza itp.”. Pamiętam, że rozwiązanie jQuery było wygodne, gdy odpowiadałem na to pytanie (7 lat temu!).
rybo111
30

Sprawdzanie naciśnięć klawiszy jest tylko częściowym rozwiązaniem, ponieważ można zmienić zawartość pola wejściowego za pomocą kliknięć myszą. Jeśli klikniesz prawym przyciskiem myszy pole tekstowe, uzyskasz opcje wycinania i wklejania, których możesz użyć do zmiany wartości bez naciskania klawisza. Podobnie, jeśli autouzupełnianie jest włączone, możesz kliknąć lewym przyciskiem myszy w polu i wyświetlić listę rozwijaną wcześniej wprowadzonego tekstu, a także wybrać jedną z opcji za pomocą kliknięcia myszą. Funkcja zalewkowania naciśnięć klawiszy nie wykryje żadnego z tych typów zmian.

Niestety, nie ma zdarzenia „zmiany”, które natychmiast zgłasza zmiany, przynajmniej o ile wiem. Ale jest rozwiązanie, które działa we wszystkich przypadkach: skonfiguruj zdarzenie czasowe za pomocą metody setInterval ().

Załóżmy, że Twoje pole wejściowe ma identyfikator i nazwę „miasto”:

<input type="text" name="city" id="city" />

Mieć zmienną globalną o nazwie „miasto”:

var city = "";

Dodaj to do inicjalizacji swojej strony:

setInterval(lookForCityChange, 100);

Następnie zdefiniuj funkcję lookForCityChange ():

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

W tym przykładzie wartość „city” jest sprawdzana co 100 milisekund, co można dostosować do własnych potrzeb. Jeśli chcesz, użyj funkcji anonimowej zamiast definiowania lookForCityChange (). Należy pamiętać, że kod, a nawet przeglądarka może udostępniać początkową wartość pola wejściowego, więc możesz zostać powiadomiony o „zmianie”, zanim użytkownik cokolwiek zrobi; odpowiednio dostosuj kod.

Jeśli pomysł zdarzenia czasowego, które ma miejsce co dziesiątą część sekundy, wydaje się niezręczny, możesz zainicjować licznik czasu, gdy pole wejściowe otrzyma fokus i zakończyć je (za pomocą clearInterval ()) po rozmyciu. Nie wydaje mi się, aby można było zmienić wartość pola wejściowego bez uzyskania fokusu, więc włączanie i wyłączanie timera w ten sposób powinno być bezpieczne.

Ważka
źródło
1
Jeśli nie można zmienić wartości pola wejściowego bez uzyskania ostrości, a rozmycie pojawia się, gdy element traci ostrość, dlaczego po prostu nie szukać zmian w onblur?
Pakman
Czy chcesz podjąć działanie, gdy pole wejściowe ulegnie zmianie, czy też straci fokus po zmianie? Jeśli chcesz działać natychmiast, nie możesz czekać na onblur.
Dragonfly
@Pakman To przyzwoite rozwiązanie w niektórych przypadkach. Ale jeśli chcesz wyszukiwać w trakcie pisania - bardzo fajna funkcja IMO (dlaczego użytkownik miałby szukać rzeczy, skoro komputer może to zrobić o wiele szybciej i bez nudy?) - lub cokolwiek innego, co naprawdę musi się zdarzyć, gdy tekst się zmieni, dlaczego nie miałbyś być w stanie?
Dag
Tak smutne, że do tego doszło.
Chuck Batson,
1
@ChuckBatson Ta odpowiedź pochodzi z 2012 roku. Zauważyłem, że opublikowałeś swój komentarz w 2016 roku. Zobacz moją odpowiedź, jeśli używasz jQuery, teraz jest to niezwykle łatwe.
rybo111
26

HTML5 definiuje oninputzdarzenie, aby złapać wszystkie bezpośrednie zmiany. mi to pasuje.

Soufiane ELH
źródło
1
działa również z kontrolką pokrętła type = "number" (z którą onkeypress nie działa).
Bob
13

onchange występuje tylko wtedy, gdy zmiana elementu wejściowego zostanie zatwierdzona przez użytkownika, w większości przypadków jest to sytuacja, gdy element traci fokus.

jeśli chcesz, aby Twoja funkcja uruchamiała się za każdym razem, gdy zmienia się wartość elementu, powinieneś użyć oninputzdarzenia - jest to lepsze niż zdarzenia klawisza w górę / w dół, ponieważ wartość można zmienić za pomocą myszy użytkownika, np. wkleić lub automatycznie wypełnić itp.

Przeczytaj więcej o wydarzeniu zmiany tutaj

Przeczytaj więcej o zdarzeniu wejściowym tutaj

99 problemów - Składnia to nie jedna
źródło
11

użyj następujących zdarzeń zamiast „onchange”

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
metaforce
źródło
6

Po pierwsze, co „nie działa”? Nie widzisz ostrzeżenia?

Również Twój kod może zostać uproszczony do tego

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}
Ash Burlaczenko
źródło
2

Napotkałem problemy polegające na tym, że Safari nie uruchamiało zdarzeń „onchange” w polu wprowadzania tekstu. Użyłem zdarzenia "change" jQuery 1.7.2 i to też nie działało. Skończyło się na tym, że użyłem zdarzenia textchange ZURBa. Działa z mysimi zdarzeniami i może odpalać bez opuszczania pola:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});
James Moberg
źródło
2

Kilka uwag, które IMO są ważne:

  • elementy wejściowe nie emitują zdarzenia „zmień”, dopóki nie nastąpi działanie UŻYTKOWNIKA ENTER lub rozmycie czekają, JEST prawidłowe zachowanie .

  • Zdarzenie, którego chcesz użyć, to "input"(„ oninput ”). Oto dobrze wykazana różnica między nimi: https://javascript.info/events-change-input

  • Te dwa zdarzenia sygnalizują dwa różne gesty / momenty użytkownika (zdarzenie „wejście” oznacza, że ​​użytkownik pisze lub porusza się po opcjach listy wyboru, ale nadal nie potwierdził zmiany. „Zmiana” oznacza, że ​​użytkownik zmienił wartość (wprowadzając lub zamazując nasz)

  • Nasłuchiwanie kluczowych wydarzeń, takich jak wiele tutaj zalecanych, jest w tym przypadku złą praktyką. (jak ludzie modyfikujący domyślne zachowanie ENTER na wejściach) ...

  • jQuery nie ma z tym nic wspólnego. To wszystko w standardzie HTML.

  • Jeśli masz problemy ze zrozumieniem DLACZEGO jest to poprawne zachowanie, być może jest to pomocne, jako eksperyment, użyj edytora tekstu lub przeglądarki bez myszy / podkładki, tylko klawiatury.

Moje dwa centy.

rakbero
źródło
1

onkeyup działał dla mnie. onkeypress nie uruchamia się po naciśnięciu spacji.

Bishnu Paudel
źródło
co, gdy wklejana jest wartość? Używam „onpaste” do wywołania zdarzenia
Louis
1

Lepiej jest używać onchange(event)z <select>. Z <input>możesz skorzystać z poniższego wydarzenia:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
Bhavin Patel
źródło
-3

spróbuj onpropertychange. działa tylko dla IE.

jack jiao
źródło
6
Dlaczego ktoś miałby rozważać nieruchomość, która działa tylko w NIEAKTUALNEJ PRZEGLĄDARCE, która została porzucona przez programistę? Głosuj przeciw.
Sod Almighty