JavaScript 监听器,“ keypress”不检测退格?

我用的是 keypress监听器。

addEventListener("keypress", function(event){


}

然而,这似乎并没有检测到一个擦除文本的退格..。

有没有不同的监听器,我可以用来检测这个?

184142 次浏览

试试 keydown而不是 keypress

键盘事件按以下顺序发生: keydownkeyupkeypress

退格的问题可能是,浏览器将在 keyup上导航回来,因此您的页面将看不到 keypress事件。

KeyPress 事件只针对字符(可打印)键调用,KeyDown 事件针对所有不可打印的键(如 ControlShiftAltBackSpace等)引发。

更新:

当按下一个键并且该键通常会产生一个字符值时,就会触发按键事件

参考

我写了一些东西,以防任何人遇到一个问题,即人们在认为他们是在一个表单字段中触发后退空间

window.addEventListener("keydown", function(e){
/*
* keyCode: 8
* keyIdentifier: "U+0008"
*/
if(e.keyCode === 8 && document.activeElement !== 'text') {
e.preventDefault();
alert('Prevent page from going back');
}
});

不同浏览器的 keypress事件可能不同。

我创建了一个 Jsfiddle来比较 Chrome 和 Firefox 上的键盘事件(使用 JQuery 快捷键)。取决于你使用的浏览器是否会触发 keypress事件——退格键在 Firefox 上会触发 keydown/keypress/keyup,但在 Chrome 上只会触发 keydown/keyup

单键点击事件触发

浏览器

  • 当浏览器注册一个键盘输入时(启动 keypress)

  • 如果没有键盘输入,则为 keydown/keyup(使用 alt、 shift、 backspace、箭头键测试)

  • keydown只是为了标签?

火狐浏览器

  • 当浏览器注册一个键盘输入时,keydown/keypress/keyup也为退格键、箭头键、制表符(所以这里即使没有输入也会触发 keypress)

  • keydown/keyup换档


这并不奇怪,因为根据 https://api.jquery.com/keypress/的数据:

注意: 由于按键事件不被任何官方报道 规范,使用时遇到的实际行为可能 浏览器、浏览器版本和平台之间存在差异。

W3C (http://www.w3.org/TR/DOM-Level-3-Events/#event-type-keypress)不赞成使用 keypress 事件类型

在本规范中定义了 keypress 事件类型,以供参考 和完整性,但本规范不赞成使用此 在编辑上下文时,作者可以订阅 而不是 before input 事件。


最后,为了回答你的问题,你应该使用 keyup或者 keydown来检测 Firefox 和 Chrome 之间的退格。


试试这里:

$(".inputTxt").bind("keypress keyup keydown", function (event) {
var evtType = event.type;
var eWhich = event.which;
var echarCode = event.charCode;
var ekeyCode = event.keyCode;


switch (evtType) {
case 'keypress':
$("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
break;
case 'keyup':
$("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<p>");
break;
case 'keydown':
$("#log").html($("#log").html() + "<b>" + evtType + "</b>" + " keycode: " + ekeyCode + " charcode: " + echarCode + " which: " + eWhich + "<br>");
break;
default:
break;
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<input class="inputTxt" type="text" />
<div id="log"></div>

我的数字控制:

function CheckNumeric(event) {
var _key = (window.Event) ? event.which : event.keyCode;
if (_key > 95 && _key < 106) {
return true;
}
else if (_key > 47 && _key < 58) {
return true;
}
else {
return false;
}
}


<input type="text" onkeydown="return CheckNumerick(event);" />

试试看

退格键代码是8

Key = = = “ Backspace”

更新和更干净: 使用 event.key。没有更多的任意数字代码!

note.addEventListener('keydown', function(event) {
const key = event.key; // const {key} = event; ES6+
if (key === "Backspace") {
// Do something
}
});

Mozilla 文档

支援的浏览器

改为使用 keyup/keydown/before 输入事件之一。

基于 这个参考,不推荐使用按键。

当键产生字符值时触发 keypress 事件 生成字符值的键的示例包括 字母、数字和标点符号键 产生一个字符值是修饰键,如 Alt,Shift,Ctrl, 或者梅塔。

如果您使用“ before input”,请注意它是 浏览器兼容性。“ before input”和其他两个之间的区别在于,当输入值即将更改时,会触发“ before input”,因此对于不能更改输入值的字符,不会触发(例如 shift、 ctr、 alt)。

我也有同样的问题,通过使用 keyup 解决了。

我正在尝试 keydown和 Backspace 没有被捕获。切换到 keyup为我工作。

addEventListener("keyup", function(event){


}

作为参考,以防有人使用 .on来动态生成内容。

$("body").on( "keyup", ".my-element", function(evt) {
// Do something
});