jquery と ajax を使用して MS-Dos エミュレーション ウィンドウを作成しようとしています。うまく機能しますが、単語を入力するかEnterキーを押すと、スクリプトの表示が1文字遅すぎます(最初のプレスでは文字が表示されず、次のキーダウンごとに、現在の文字ではなく、ユーザーが入力した前の文字が表示されます)。
これが私のスクリプトの簡略版です:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/terminal.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript">
$(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("<li class='user'>--- ><span>"+request+"</span></li>");
$('#log').append("<li class='sys' >SYS ><span>"+response+"</span></li>");
$('#field').val('');
}
}
});
}
});
});
</script>
</head>
<body>
<ul id="log">
<li class='sys'>Sys ><span>Identification required</span></li>
</ul>
<ul id="realtime">
<li id="live-space">
<span class="user-line">--- ></span>
<textarea type="text" id="field"></textarea>
<div>
<span id="instruct"></span><div id="cursor">_</div>
</div>
</li>
</ul>
</body>
</html>
これを変更すると、必要なときに「keyDown」が起動されると確信しています
$("#instruct").html(request);
これに
$("#instruct").html(request+'x');
...「x」は最初のキーダウンの直後に表示されますが、「リクエスト」コンテンツは次のキーダウンまで遅れます (たとえば、「a」と入力すると、「x」のみが表示され、入力すると「b」の直後、「ax」などが表示されます...)。
したがって、キーダウンを発射することではなく、適切なタイミングで適切なキャラクターを選択することが重要です.
私は何を間違っていますか?
ありがとうございました。