我有一个html页面,表单文本输入具有onkeydown属性,如下所示:
<DOCTYPE !html>
<html>
<head>
<title>Lookup User</title>
</head>
<body>
<form method="POST">
<strong>Last Name: </strong><input type="text" id="lname" onkeydown="lookup_user(this.value)" />
</form>
<span id="test"></span>
<script type="text/javascript" src="lookup_user.js"></script>
</body>
</html>
当键被按下时,页面向服务器发出异步请求以搜索用户。javascript文件是
function lookup_user (lname) {
var xmlhttp;
if (lname=='') {
document.getElementById('lname').innerHTML = '';
return;
}
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
else {
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
// generally preferred to place onreadystatechange before open so that it detects readyState 0-4 instead of 1-4
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
document.getElementById("test").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open('POST', 'lookup_user.php', true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send('lname='+lname);
}
这几乎可以很好地工作,除了它没有检测到第一个按键按下。
例如,如果在输入表单中,我键入"D",它不会搜索用户。当我输入第二个字符时,它会搜索第二个之前的字符,不包括第二个。如果我想查找"Daisy",并在输入框中键入"Daisy",它会搜索"Dais"。只有当我按下另一个键时,它才会查找"Daisy"。
为什么会这样?
onkeydown
事件工作正常。
当按下某个键时,事件按以下顺序启动;keydown
、keypress
、keyup
。
onkeydown
事件在按键之后但在将字符放入DOM之前触发。
由于事件触发时该字符尚未放入DOM中,因此表单文本输入中不会包含该字符。
例如:onkeydown
事件可用于限制字符输入到表单中。
另一方面:onkeyup
事件是在用户释放密钥和修改DOM之后触发的。
也许onkeyup
事件更适合您的应用程序。