我刚刚遇到了这种烦恼,并在寻找答案时发现了这个问题,所以这里是我的调查和解决方案的详细信息(嗯,解决方法)。
当按下退格键时,不会在黑莓浏览器中的or元素上触发keyup
and事件。但是,它将在事件处理程序绑定到时触发:keydown
input
textarea
document
$("#myInput").keydown(someFn); //Will not fire for backspace
$(document).keyup(someFn); //Will fire for backspace
为什么会这样,我完全不知道。该keyup
事件应该冒泡,确实如此,但由于按下退格键时它甚至不会触发,所以没有多大用处。
但是,我们还有另一个活动可供使用。黑莓浏览器支持该input
事件,并在元素值发生变化时正确触发(包括,幸运的是,当该变化是由于按下退格键时)。
因此,我们可以通过将事件处理程序绑定到keydown
和来解决问题input
。该keydown
事件将在 之前触发input
,除非按下退格键,在这种情况下keydown
不会触发。所以我们可以很容易地跟踪它:
function handler(e) {
if (e.keyCode === 8) {
alert("Backspace!"); //Backspace was pressed :)
}
}
var elem = document.getElementById("example");
elem.addEventListener("keydown", function (e) { //Bind to keydown event
this.keydownFired = true; //Remember that keydown fired in expando property
handler.call(this, e); //Call the event handler
}, false)
elem.addEventListener("input", function (e) { //Bind to input event
if (!this.keydownFired) { //Keydown didn't fire, must have pressed backspace
e.keyCode = 8; //Fix the event object
handler.call(this, e); //Call the event handler
}
delete this.keydownFired; //Clean up so we can handle next key press
}, false);
一些注意事项:
据我所知,这只是黑莓 6 浏览器中的一个问题。我已经测试了黑莓 5(物理设备和模拟器)和 7(模拟器),两者都会触发退格键的keydown
和keyup
事件。
这个“修复”几乎适用于我测试过的每一个浏览器(所以你可以使用它来正确支持 Blackberry 6 而不会破坏其他浏览器)除了 Opera Mobile(在版本 12 中测试),它出于某种原因喜欢触发input
事件有时两次。
这仅允许您在输入中有要删除的文本时检测退格键(否则input
事件不会触发)。这可能是剧本最大的败笔。
您可以在此处找到一个工作示例,但对于移动设备测试,加载嵌入式版本会更快。