Keydown处理前一个字符而不是当前字符

我尝试使用jquery和ajax创建一个MS-Dos仿真窗口。 它工作得很好但是当我输入一个单词或按回车键时,脚本显示的时间太晚了(第一次按下时没有显示任何字符,对于每个下一个keydown,它显示用户键入的前一个字符而不是当前字符)。

这是我的脚本的简化版本:

      $(document).ready(function() { //set cursor position $('#cursor').css('left','0px'); //focus on textfield $('#field').focus(); //On key down... $('#field').keydown(function(event) { request=$(this).val(); count=$(this).val().length; //Display chars as they come $("#instruct").html(request); // If "enter" is pressed if (event.which == 13) { event.preventDefault(); //clean user entry request=request.replace(/\n/g, ""); // Process user entry $.ajax({ type: "POST", url: "scripts/ajax/terminal.php", data: {command:request}, success: function(response) { // if user typed something before pressing "enter" if(response !='') { // update list by logging the previous entry, showing system response and clearing the textarea $('#log').append("
  • --- >"+request+"
  • "); $('#log').append("
  • SYS >"+response+"
  • "); $('#field').val(''); } } }); } }); });
    • Sys >Identification required
    • --- >
      _

    我确定“keyDown”应该被触发,因为当我改变它时

     $("#instruct").html(request); 

    进入这个

     $("#instruct").html(request+'x'); 

    …“x”将在第一次keydown后直接显示,而“request”内容将被延迟到下一次keydown(例如,如果我输入“a”,我只会看到“x”,当我输入“b”后立刻,我看到“斧头”等……)。

    所以这不是关于解雇keydown而是关于在正确的时间挑选正确的角色。

    我做错了什么?

    谢谢。

    工作演示

    在捕获字段之前没有更新字段的值,只需追加按下键的字符,但如果使用keydownString.fromCharCode(event.which)将返回大写字符,因此请使用keypress

     $('#field').on('keypress',function(event){ request=$(this).val() + String.fromCharCode(event.which); ... 

    或者你可以使用

     $('#field').on('keyup',function(event){ request=$(this).val(); // value is ready by now ... 

    但反馈显得较慢,因为您正在等待释放密钥

    这是关于时间的。 在keydown事件发生时,控件还没有收到字符 – 事实上,它甚至不确定它是否会收到它(因为你可以阻止keydownkeypress ,它只会在它之后添加)。 因此,当你阅读你的控制内容时,你做得太早了 – 这就像你决定去麦当劳时尝试吃汉堡包,而不是在你去支付它之后。

    您可以在此处阅读有关键盘事件的更多信息,并在此处的规范中进行更详细的介绍。

    解决方案:这不是keydown的意思。 尝试看看change事件是否适合您。 编辑:我的意思是,抓住角色,因为他们带来了change事件。 正如您所做的那样,使用keydown捕获Enter键。