即时搜索功能落后一个按键


Instant Search function is one keystroke behind

我的网站上有一种使用即时搜索功能的"翻译"程序。我有一个文本区域

<textarea name="text" onkeydown="searchq();"></textarea>

它运行searchq()函数

function searchq() {
    var searchTxt = $("textarea[name='text']").val();
    $.post("translate.php", {text: searchTxt}, function(output){
        $("#translated").html(output);
    });
}

它将每个单词发送到translate.php

if(isset($_POST["text"])){
    $words = explode(' ',$_POST['text']);
    $i = 0;
    foreach($words as $word){
        // performs transformations on the words
        $output = $word . " ";
        echo($output);
        $i++;
    }
}

但是,如果你在我的网站上试用http://saaa.me/MattSpeak.html,你可以清楚地看到,如果你键入"y",什么都不会显示,只有当你键入下一个字母或空格时,"y"才会显示。即时翻译过程似乎落后了一个字符。是什么原因造成的(商标符号和"er"词尾是我在"翻译"中添加的内容)

我知道为什么这个问题不能正常工作,但不知道如何解决。如果能提供帮助,我将不胜感激。

keydown事件位于要添加的字符之前(甚至keypress事件也位于其之前)。如果您想响应正在键入的信件,请响应input,或者,对于较旧和/或有缺陷的浏览器(基本上是IE9和早期版本),请使用简短的setTimeout响应keypress

使用input:

$("textarea").on("input", function() {
  $("<p>").text($(this).val()).appendTo(document.body);
});
<textarea></textarea>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

keypresssetTimeout一起使用,以便添加字符:

$("textarea").on("keypress", function() {
  var $this = $(this);
  setTimeout(function() {
    $("<p>").text($this.val()).appendTo(document.body);
  }, 0);
});
<textarea></textarea>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>


我倾向于对一系列事件做出反应,并使用去抖动,所以我不会多次做出反应:

var lastSearch = null;
$("textarea").on("input keyup change", function() {
  var search = $(this).val();
  if (search !== lastSearch) {
    lastSearch = search;
    $("<p>").text(search).appendTo(document.body);
  }
});
<textarea></textarea>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>