jQuery pobiera wartość wejściową po naciśnięciu klawisza

129

Mam następującą funkcję:

$(document).ready(function() {
    $("#dSuggest").keypress(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Z jakiegoś powodu, przy pierwszym naciśnięciu klawisza, otrzymuję pusty ciąg znaków do dziennika konsoli.

Albo Weinberger
źródło

Odpowiedzi:

156

Dzieje się tak, ponieważ keypresszdarzenia są uruchamiane przed dodaniem nowego znaku do valueelementu (więc pierwsze keypresszdarzenie jest uruchamiane przed dodaniem pierwszego znaku, podczas gdy znak valuejest nadal pusty). Zamiast tego powinieneś użyć keyup, który jest uruchamiany po dodaniu postaci.

Zauważ, że jeśli twój element #dSuggestjest taki sam, jak input:text[name=dSuggest]możesz, możesz znacznie uprościć ten kod (a jeśli tak nie jest, posiadanie elementu o takiej samej nazwie jak idinny element nie jest dobrym pomysłem).

$('#dSuggest').keypress(function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});
samotny dzień
źródło
2
Działa, ale po usunięciu jquery 2.x jest to nieaktualne, ponieważ odpowiedź poniżej przy użyciu opcji on i input jest najlepszym sposobem, aby to zrobić teraz.
Piotr Kula
1
@ppumkin: Tylko dlatego, że jQuery 2 jest niedostępny, nie oznacza, że ​​ludzie nie muszą wspierać IE8 i niższych. I nie widzę w dokumentach niczego, co sugerowałoby rzeczywistą obsługę tego inputtypu zdarzenia.
cookie monster
7
Poprawiasz, powinni przestać wspierać IE, punkt. Większość "obejść" w jQuery 1.x dotyczy przeglądarki IE, więc nazwa powinna zostać zmieniona na jQuerIE.
Piotr Kula
188

Zdając sobie sprawę, że jest to dość stary post, i tak udzielę odpowiedzi, ponieważ zmagałem się z tym samym problemem.

Zamiast tego należy użyć "input"zdarzenia i zarejestrować się przy użyciu .onmetody. Jest to szybkie - bez opóźnień keyupi rozwiązuje brakujący ostatni problem związany z naciśnięciem klawisza, który opisujesz.

$('#dSuggest').on("input", function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});

Demo tutaj

Frederik Gottlieb
źródło
26
Powinno to być zaznaczone jako poprawna odpowiedź - wpisanie klucza może rozwiązać problem z brakującymi znakami, ale problematyczne jest określenie, czy znak został faktycznie zapisany (a klucz nie był na przykład „tab” lub „home”). +1 dla Ciebie
Nashi
Problem polega na tym, że nie jest obsługiwany w starych przeglądarkach, a IE9 nie reaguje na usunięte znaki.
PhoneixS
33

Użyj .keyupzamiast naciśnięcia klawisza.

Użyj $(this).val()lub po prostu, this.valueaby uzyskać dostęp do bieżącej wartości wejściowej.

DEMO tutaj

Informacje o .keypressz jQuery Docs,

Zdarzenie keypress jest wysyłane do elementu, gdy przeglądarka zarejestruje wejście klawiatury. Jest to podobne do zdarzenia keydown, z wyjątkiem przypadku powtórzeń klucza. Jeśli użytkownik naciśnie i przytrzyma klawisz, zdarzenie keydown jest wyzwalane raz, ale oddzielne zdarzenia naciśnięcia klawisza są wyzwalane dla każdego wstawionego znaku. Ponadto klawisze modyfikujące (takie jak Shift) wywołują zdarzenia keydown, ale nie zdarzenia keypress.

Selvakumar Arumugam
źródło
5
keyupjest zbyt wolny, a klawisz można nacisnąć i przytrzymać bez zwolnienia i coś musi się wydarzyć. lepiej używać keydownz niewielkim limitem czasu, więc wartość faktycznie się zmienia.
vsync
jedyną wadą, jaką znalazłem, jest to, że jeśli użytkownik naciśnie jednocześnie więcej niż jeden znak na klawiaturze, nie zarejestruje się on poprawnie.
vsync
5

Musisz przerwać wątek wykonawczy, aby umożliwić aktualizację danych wejściowych.

  $(document).ready(function(event) {
       $("#dSuggest").keypress(function() {
           //Interrupt the execution thread to allow input to update
               setTimeout(function() {
                   var dInput = $('input:text[name=dSuggest]').val();
                   console.log(dInput);
                   $(".dDimension:contains('" + dInput + "')").css("display","block");
               }, 0);
       });
  });
parlament
źródło
1
keyupopóźnienie jest zbyt wolne do niektórych celów, a także nie powoduje automatycznego filtrowania klawiszy modyfikujących. To faktycznie działa lepiej dla mnie.
Albert Bori
najlepsza odpowiedź. keyup - wolno i nie może przechwytywać znaków takich jak @ przy naciśniętym dwóch klawiszach.
Roma Rush
4

Dzieje się tak, ponieważ Keypresszdarzenie jest uruchamiane przed dodaniem nowej postaci. Zamiast tego użyj zdarzenia „keyup”, które będzie działać idealnie w Twojej sytuacji.

$(document).ready(function() {
    $("#dSuggest").keyup(function() {
        var dInput = $('input:text[name=dSuggest]').val();
        console.log(dInput);
        $(".dDimension:contains('" + dInput + "')").css("display","block");
    });
});

Chcę do tego dodać, jeśli masz wiele pól tekstowych i musisz zrobić to samo na ich zdarzeniu keyup, możesz po prostu nadać im wspólną klasę css (np. Commoncss) i zastosować takie zdarzenie keyup.

$(document).ready(function() {
    $(".commoncss").keyup(function() {
        //your code
    });
});

znacznie zmniejszy to ilość kodu, ponieważ nie musisz stosować zdarzenia keyup według identyfikatora dla każdego pola tekstowego.

yogihosting
źródło
3

Szukałem przykładu ES6 (aby mógł przejść przez mój linter) Więc dla innych osób, które szukają tego samego:

$('#dSuggest').keyup((e) => {
    console.log(e.currentTarget.value);
});

Użyłbym również keyup, ponieważ otrzymujesz bieżącą wartość, która jest wypełniona.

MarvinVK
źródło
1

Po prostu użyj limitu czasu, aby wykonać połączenie; limit czasu zostanie wywołany po zakończeniu stosu zdarzeń (tj. po wywołaniu domyślnego zdarzenia)

$("body").on('keydown', 'input[type=tel]', function (e) {
    setTimeout(() => {
        formatPhone(e)
    }, 0)
});
Smonge
źródło
0

Myślę, że potrzebujesz poniższego prototypu

$(element).on('input',function(){code})
Zuckerberg
źródło
0

jQuery pobiera wartość wejściową po naciśnięciu klawisza

https://www.tutsmake.com/jquery-keypress-event-detect-enter-key-pressed/

i = 0;  
$(document).ready(function(){  
    $("input").keypress(function(){  
        $("span").text (i += 1);  
    });  
}); 
<!DOCTYPE html>  
<html>  
<head>  
<title>jQuery keyup() Method By Tutsmake Example</title> 
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
</head>  
<body>  
Enter something: <input type="text">  
<p>Keypresses val count: <span>0</span></p>  
</body>  
</html>  

Deweloper
źródło