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

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, dla pierwszego naciśnięcia klawisza, dostaję pusty ciąg do dziennika konsoli.

Author: synecdoche, 2012-01-10

7 answers

Dzieje się tak dlatego, że zdarzenia keypress są wywoływane przed nowy znak jest dodawany do value elementu (więc pierwsze zdarzenie keypress jest wywoływane przed dodaniem pierwszego znaku, podczas gdy value jest nadal puste). Zamiast tego należy użyć keyup, która jest wywoływana po dodaniu znaku.

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

$('#dSuggest').keypress(function() {
    var dInput = this.value;
    console.log(dInput);
    $(".dDimension:contains('" + dInput + "')").css("display","block");
});
 133
Author: lonesomeday,
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-01-09 21:18:26

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

Należy zamiast tego użyć zdarzenia "input" i zarejestrować się za pomocą metody .on. Jest to szybkie - bez opóźnienia keyup i rozwiązuje brakujący ostatni problem z naciśnięciem klawisza, który opisałeś.

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

Demo tutaj

 161
Author: gottlieb76,
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-10-16 13:45:37

Użyj .keyup zamiast klawiatury.

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

DEMO tutaj

Informacje o .keypress z jQuery docs,

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

 28
Author: Selvakumar Arumugam,
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-01-09 21:18:49

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);
       });
  });
 5
Author: parliament,
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-08-04 00:15:37

Dzieje się tak dlatego, że zdarzenie Keypress jest wywoływane przed dodaniem nowego znaku. 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ę dodać do tego, jeśli masz wiele pól tekstowych i musisz zrobić to samo na ich zdarzeniu keyup, możesz po prostu dać im wspólną klasę css (np.

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

To znacznie zmniejszy Kod, ponieważ nie musisz stosować zdarzenia keyup według id dla każdego pola tekstowego.

 3
Author: yogihosting,
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-12-19 11:59:09

Szukałem przykładu ES6 (żeby mógł przejść mój linter) Więc dla innych ludzi, którzy szukają tego samego:

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

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

 0
Author: MarvinVK,
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-12-27 13:35:32

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

$(element).on('input',function(){code})
 0
Author: Zuckerberg,
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-01-20 13:05:00