给定keydown
浏览器中的事件,我如何预测该键事件是否会导致字符输入?例如,按左箭头不输入字符,但a按键输入 A(除非ctrl或alt向下)。
我不需要知道将输入什么字符,只需要知道按键事件是否会导致输入。
我的目标是 Chrome。如果您的解决方案在 IME 中有效,则可以加分。
注意:我问的是keydown
事件,而不是像keypress
or之类的下游事件oninput
。
给定keydown
浏览器中的事件,我如何预测该键事件是否会导致字符输入?例如,按左箭头不输入字符,但a按键输入 A(除非ctrl或alt向下)。
我不需要知道将输入什么字符,只需要知道按键事件是否会导致输入。
我的目标是 Chrome。如果您的解决方案在 IME 中有效,则可以加分。
注意:我问的是keydown
事件,而不是像keypress
or之类的下游事件oninput
。
有一个 HTML 5 事件:input
. MDN:https ://developer.mozilla.org/en-US/docs/Web/Reference/Events/input 。除此之外没有合适的解决方案。
好的,我想我有一个解决方案。我不知道它有多好,但它确实有效。看看:http: //jsfiddle.net/tLPsL/
它基本上是保存输入的值onkeydown
并将其签入onkeyup
.
$('#sattar').keydown(function() {
window.SATTAR = $(this).val();
});
$('#sattar').keyup(function() {
if(window.SATTAR !== $(this).val()) {
alert("changed");
}
});
[更新]
用这个
$(document).keydown(function(event){
console.log(event.which);
});
并根据您的需要使用 ascii 值过滤 event.which 的值,并排除带有不需要的按钮出现的数字
例如(此示例演示仅接受小写字母):
$(document).keydown(function(event){
var x = event.which;
if (x <= 90 && x >=65) console.log('accepted');
else console.log('not accepted');
});
[更新]:
如果您不喜欢这种方法,您可以使用另一个检测到任何文本字段或文本区域的输入的方法:
$('input,textarea').change(function(){
console.log('input detected!');
});
$(document).keyup(function(event){
var x = $(event.target);
if (x[0].nodeName == 'INPUT' || x[0].nodeName == 'TEXTAREA'){ //you can filter the backspace if you don't want to consider it a change on the input by anding it with the whole argument here using the key number explained above
x.blur().focus();
}
});
注意:第一种方法适用于所有语言,因为相同的键盘键用于输入不同字符,但它们仍然可以键入。
我在这个网站上看到了字符 keydata 列表。
- 为了使其跨平台和跨浏览器,我建议你观看这个网站- 你可以在这里
测试 keydown 事件。
-Jquery 还建议使用 key ,因为它可以规范化 keycode 和 charcode(我认为这对跨浏览器部分很有用,但我没有找到像我之前发布的 keycode 那样的表格),请参阅此处的详细信息。
最后,一个个人的想法:我这样说不会显得粗鲁,所以请尝试理解,你有 3 个清晰有效的答案,你应该有兴趣改进细节以使其按你的需要工作,特别是因为,由于许多原因(例如时间、硬件问题、没有人付钱给我们、自由职业者网站在其他地方等等),帮助您的人可能无法完成您的全部工作。
考虑到你的需要,我写了这段代码,记住组合键很难处理,所以,你应该在重用之前测试这个例子。小提琴
<!DOCTYPE html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
$(document).keydown(
function(event){
if(event.target!='[object HTMLBodyElement]'){//Are we in an input?
if(!event.ctrlKey && !event.altKey){//Are we using a combo ctrl or alt?
if(event.keyCode==13 || event.keyCode==8 || event.keyCode==32 || (event.keyCode>45 && event.keyCode<91) || event.keyCode==188 || (event.keyCode>189 && event.keyCode<193) || (event.keyCode>218 && event.keyCode<222)){
//It is a char?
document.getElementById('valid').innerHTML+=event.keyCode+' ';
document.getElementById('idlast').innerHTML=event.target.id;
}
}
}
}
);
</script>
</head>
<body>
<input id="a" type="text"></input>
<textarea id="b">a</textarea>
<div id="c" contenteditable="true">a</div>
<div id="d" style="width:200px;height:200px;background-color:red">a</div>
last keydown in: <span id="idlast"></span><br>
for keypress in input:<span id="valid"></span><br>
</body>
</html>
首先,如果焦点位于不是输入(textarea,contenteditable...)的对象上,则您的目标是正文。因此,如果目标是身体,请确保您没有在某处写作。
然后我建议你看看这个例子,keypress 可能对你的目标有用,因为它似乎没有注册不是输入的键。
<!DOCTYPE html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script>
$(document).keypress(
function(event){
if(event.target!='[object HTMLBodyElement]'){
document.getElementById('valid').innerHTML=document.getElementById('valid').innerHTML+event.keyCode+' ';
document.getElementById('idlast').innerHTML=event.target.id;
}else{
document.getElementById('out').innerHTML=document.getElementById('out').innerHTML+event.keyCode+' ';
}
}
);
$(document).keydown(function(e){document.getElementById('down').innerHTML=document.getElementById('down').innerHTML+e.keyCode+' ';});
</script>
</head>
<body>
<input id="a" type="text"></input>
<textarea id="b">a</textarea>
<div id="c" contenteditable="true">a</div>
<div id="d" style="width:200px;height:200px;background-color:red">a</div>
last keypress input id: <span id="idlast"></span><br>
for keypress in input:<span id="valid"></span><br>
for keypress out:<span id="out"></span><br>
for keydown:<span id="down"></span><br>
</body>
</html>