Jak Mogę dostać jquery.val () po zdarzeniu keypress?

Mam:

$(someTextInputField).keypress(function() {
  alert($(this).val());
});

Teraz alert zawsze zwraca wartość przed naciśnięciem klawisza (np. pole jest puste, wpisuję 'a' i alert daje mi ". Potem wpisuję " b "i alarm daje mi "a"...). Ale chcę wartość po naciśnięciu klawisza-Jak mogę to zrobić ?

Tło: chcę włączyć przycisk, gdy tylko pole tekstowe zawiera co najmniej jeden znak. Więc uruchamiam ten test na każdym zdarzeniu klawiatury, ale używając zwracanej val() wynik jest zawsze o krok w tył. Korzystanie z Zdarzenie change () nie jest dla mnie opcją, ponieważ wtedy przycisk jest wyłączony, dopóki nie opuścisz pola tekstowego. Jeśli jest na to lepszy sposób, to cieszę się, że to słyszę!

Author: Jörg Brenninkmeyer, 2010-06-17

6 answers

Zmień keypress na keyup:

$(someTextInputField).on("keyup", function() {
  alert($(this).val());
});

keypress jest wywoływane po naciśnięciu klawisza, {[2] } jest wywoływane po zwolnieniu klawisza.

 136
Author: Hooray Im Helping,
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-10-24 14:29:18

Dziwne, że nikt nie wspomniał o zdarzeniu js "input":

$(someTextInputField).on('input', function() {
  alert($(this).val());
});

Zalecane.

Https://developer.mozilla.org/en-US/docs/Web/Events/input

 50
Author: billynoah,
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
2014-08-07 00:50:10

Zamiast klawiatury użyj keyup.

 8
Author: Kris van der Mast,
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-08-24 15:56:19

Alternatywnie można użyć zdarzenia keydown z timeoutem równym 0.

W ten sposób zmiany zostaną zastosowane natychmiast, zamiast być zastosowane, gdy użytkownik przestanie trzymać klucz.

$(someTextInputField).on("keydown", function() {
  setTimeout(function($elem){
    alert($elem.val());
  }, 0, $(this));
});
 4
Author: David Oliveros,
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
2014-01-26 04:07:19

Możesz chcieć podłączyć obsługę zdarzenia onchange zamiast używać któregokolwiek z kluczowych zdarzeń.

$(someTextInputField).change(function() {
    alert($(this).val());
});

Użycie Edit > Paste lub kliknięcie prawym przyciskiem myszy i wklej spowoduje wywołanie zdarzenia zmiany, ale nie zdarzenia kluczowego. Uwaga niektóre przeglądarki mogą symulować kluczowe Zdarzenie na wklejce (choć nie znam żadnego), ale nie można liczyć na Takie zachowanie.

 3
Author: Stephen P,
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-06-17 16:49:41

Spróbuj czegoś takiego:

$('#someField').keypress(function() {
  setTimeout(function() {
    if ($('#someField').val().length > 0)
      $('#theButton').attr('disabled', false);
  }, 1);
});

To po prostu wprowadza limit czasu, tak że po zakończeniu pętli zdarzenia" klawiatura", kod zostanie uruchomiony niemal natychmiast po tym. Tak krótki interwał czasowy (nawet jeśli zaokrąglony przez przeglądarkę) nie będzie zauważalny.

edit - albo ty możesz użyć "keyup", jak wszyscy mówią, choć jego semantyka jest inna.

 3
Author: Pointy,
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-01-01 14:28:08