Najlepszy sposób na śledzenie onchange podczas wpisywania w input type = "text"?

Z mojego doświadczenia, input type="text" onchange Zdarzenie zwykle występuje dopiero po opuszczeniu (blur) kontrolki.

Czy istnieje sposób, aby zmusić przeglądarkę do wyzwalania onchange za każdym razem, gdy textfield zmienia się zawartość? Jeśli nie, to jaki jest najbardziej elegancki sposób śledzenia tego "ręcznie"?

Używanie zdarzeń onkey* nie jest wiarygodne, ponieważ można kliknąć prawym przyciskiem myszy pole i wybrać opcję Wklej, co spowoduje zmianę pola bez wprowadzania klawiatury.

Czy setTimeout jest jedynym sposobem?.. Brzydki: -)

Author: Jonatas Walker, 2009-02-22

17 answers

Aktualizacja:

Zobacz kolejna odpowiedź (2015).


Oryginał 2009 Odpowiedź:

Więc chcesz, aby onchange event odpalił na keydown, blur, i wklej? To magia.

Jeśli chcesz śledzić zmiany podczas ich wpisywania, użyj "onkeydown". Jeśli chcesz przechwycić operacje wklejania za pomocą myszki, użyj "onpaste" (IE, FF3) oraz "oninput" (FF, Opera, Chrome, Safari1).

1złamane na <textarea> na Safari. Użycie textInput zamiast

 284
Author: Crescent Fresh,
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
2017-05-23 11:54:59

These days listen for oninput. It feels like onchange bez konieczności utraty skupienia na elemencie. Jest to HTML5.

Jest obsługiwany przez wszystkich (nawet mobilnych), z wyjątkiem IE8 i poniżej. Dla IE dodaj onpropertychange. Używam go tak:

const source = document.getElementById('source');
const result = document.getElementById('result');

const inputHandler = function(e) {
  result.innerHTML = e.target.value;
}

source.addEventListener('input', inputHandler);
source.addEventListener('propertychange', inputHandler); // for IE8
// Firefox/Edge18-/IE9+ don’t fire on <select><option>
// source.addEventListener('change', inputHandler); 
<input id="source">
<div id="result"></div>
 724
Author: Robert Siemer,
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
2020-03-30 00:36:13

Poniższy kod działa mi dobrze z Jquery 1.8.3

HTML: <input type="text" id="myId" />

Javascript / JQuery:

$("#myId").on('change keydown paste input', function(){
      doSomething();
});
 51
Author: Amrit Pal Singh,
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-03-21 17:54:19

Javascript jest tutaj nieprzewidywalny i zabawny.

  • onchange występuje tylko wtedy, gdy rozmyjesz pole tekstowe
  • onkeyup & onkeypress nie zawsze występuje przy zmianie tekstu
  • onkeydown występuje przy zmianie tekstu (ale nie można śledzić wycinania i wklejania za pomocą kliknięcia myszką)
  • onpaste & oncut występuje z naciśnięciem klawisza, a nawet kliknięciem prawym przyciskiem myszy.

Więc, aby śledzić zmiany w textboxie, musimy onkeydown, oncut i onpaste. W wywołaniu zwrotnym tego zdarzenia, Jeśli zaznaczysz wartość pole tekstowe nie otrzymasz zaktualizowanej wartości, ponieważ wartość jest zmieniana po wywołaniu zwrotnym. Tak więc rozwiązaniem jest ustawienie funkcji timeout z timeoutem 50 mili-sekund (lub może być krótszy), aby śledzić zmianę.

To jest brudny hack, ale to jedyny sposób, jak zbadałem.

Oto przykład. http://jsfiddle.net/2BfGC/12/
 45
Author: Sanket Sahu,
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
2012-07-05 06:51:52

onkeyup dzieje się po wpisaniu na przykład i nacisnąć t gdy unoszę palec akcja dzieje się, ale na keydown akcja dzieje się, zanim cyfra znak t

Mam nadzieję, że to jest pomocne dla kogoś.

Więc onkeyup jest lepsze, gdy chcesz wysłać to, co właśnie wpisałeś.

 14
Author: Fernando André,
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-02-26 14:11:33

Myślę, że w 2018 roku lepiej będzie wykorzystać wydarzenie input.

-

Jak opisuje Specyfikacja WHATWG ( https://html.spec.whatwg.org/multipage/indices.html#event-input-input):

Wywołane w kontrolkach, gdy użytkownik zmienia wartość (Zobacz też zmiana zdarzenia )

-

Oto przykład jak z niego korzystać:

<input type="text" oninput="handleValueChange()">
 11
Author: Patrick Hillert,
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-06-19 09:28:56

Miałem podobny wymóg(pole tekstowe w stylu Twittera). Używane onkeyup i onchange. onchange zajmuje się operacjami wklejania myszy podczas utraty ostrości z pola.

[Update] w HTML5 lub nowszym, użyj oninput, aby uzyskać aktualizacje modyfikacji znaków w czasie rzeczywistym, jak wyjaśniono w innych odpowiedziach powyżej.

 8
Author: Mohnish,
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-08-11 13:55:58

Jeśli używasz tylko Internet Explorer, możesz użyć tego:

<input type="text" id="myID" onpropertychange="TextChange(this)" />

<script type="text/javascript">
    function TextChange(tBox) {
        if(event.propertyName=='value') {
            //your code here
        }
    }
</script>
Mam nadzieję, że to pomoże.
 7
Author: RolandDeschain,
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
2010-05-19 10:52:32

Jest dość bliskie rozwiązanie (nie naprawiaj wszystkich sposobów wklejania), ale większość z nich:

Działa zarówno dla wejść, jak i dla tekstów:

<input type="text" ... >
<textarea ... >...</textarea>

Zrób tak:

<input type="text" ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >
<textarea ... onkeyup="JavaScript: ControlChanges()" onmouseup="JavaScript: ControlChanges()" >...</textarea>

Jak już mówiłem, nie wszystkie sposoby wklejania zdarzenia fire na wszystkich przeglądarkach... najgorsze niektórzy nie odpalają żadnego zdarzenia w ogóle, ale zegary są straszne, aby być używane do takich.

Ale większość sposobów wklejania odbywa się za pomocą klawiatury i / lub myszy, więc zwykle onkeyup lub onmouseup są uruchamiane po wklejeniu, również onkeyup jest uruchamiany podczas pisania na klawiaturze.

Upewnij się, że Twój kod kontrolny nie zajmuje dużo czasu... w przeciwnym razie użytkownik dostaje słabe impresion.

Tak, sztuczka polega na strzelaniu na klawiszu i myszy... ale uważaj oba mogą być zwolnione, więc weź pod uwagę takie!!!
 4
Author: z666zz666z,
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
2012-03-29 09:20:44

Proszę, oceń następne podejście używając JQuery:

HTML:

<input type="text" id="inputId" />

Javascript (JQuery):

$("#inputId").keyup(function(){
        $("#inputId").blur();
        $("#inputId").focus();
});

$("#inputId").change(function(){
        //do whatever you need to do on actual change of the value of the input field
});
 4
Author: Alex Uke,
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
2013-02-08 17:31:35

"wejście" zadziałało.

var searchBar  = document.getElementById("searchBar");
searchBar.addEventListener("input", PredictSearch, false);
 4
Author: Sam,
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-01-19 19:54:40

Możesz użyć keydown, keyup i keypress wydarzenia, jak również.

 3
Author: Gumbo,
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
2009-02-22 13:49:41

Aby śledzić każdy spróbuj tego przykładu, a wcześniej całkowicie zmniejszyć szybkość mrugania kursora do zera.

<body>
//try onkeydown,onkeyup,onkeypress
<input type="text" onkeypress="myFunction(this.value)">
<span> </span>
<script>
function myFunction(val) {
//alert(val);
var mySpan = document.getElementsByTagName("span")[0].innerHTML;
mySpan += val+"<br>";
document.getElementsByTagName("span")[0].innerHTML = mySpan;
}
</script>

</body>

Onblur: Zdarzenie generuje przy wyjściu

Onchange: Zdarzenie generuje przy wyjściu, jeśli zostaną wprowadzone zmiany w inputtext

Onkeydown: Zdarzenie generuje przy każdym naciśnięciu klawisza (również dla długiego trzymania klawisza)

Onkeyup: Zdarzenie generuje przy każdym wydaniu klucza

Onkeypress: taki sam jak onkeydown (lub onkeyup), ale nie reaguje na ctrl, backsace, alt inne

 3
Author: Venkat,
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-04-01 21:24:07

2018 tutaj, to jest to, co robię:

$(inputs).on('change keydown paste input propertychange click keyup blur',handler);
Jeśli możesz wskazać wady w tym podejściu, byłbym wdzięczny.
 3
Author: a20,
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-04-15 23:32:01

Metoda 1: Dodaj detektor zdarzeń dla input:

element.addEventListener("input", myFunction);

 

Metoda 2: Zdefiniuj właściwość oninput za pomocą JavaScript:

element.oninput = function()
{
    myFunction();
};

 

Metoda 3: Zdefiniuj właściwość oninput za pomocą HTML:

<input type="text" oninput="myFunction();">
 3
Author: Pikamander2,
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
2019-11-05 04:06:31

Użyj oninput zamiast onchange.

Indeks.html

<html>
  <head>
    <title>title here</title>
    <script src="index.js"></script>
  </head>
  <body>
    <input oninput="onclickhandler(this)"></input>
  </body>
</html>

Skrypt.js

function onclickhandler(e) {
  console.log(e.value);
}

 1
Author: Khushwant kodecha,
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
2021-01-15 05:05:24

Robert Siemer addEventListener nie jest obsługiwany w IE8 .

" starsze wersje IE wspierały równoważny, zastrzeżony EventTarget.metoda attachEvent ()." https://developer.mozilla.org/it/docs/Web/API/Element/addEventListener

 0
Author: bpolelli,
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
2019-08-17 05:30:00