我很难找到一个非JQUERY的答案。感谢Stas让我走上正轨。
Chrome: 如果您不需要跨浏览器支持,则可以仅使用黑名单,而无需将其列入白名单。此纯JS版本适用于Chrome,但不适用于IE。不确定FF。
在Chrome浏览器(2014年中期,版本36)中,似乎没有针对输入或可编辑内容的按键<BODY>
。这样就可以使用黑名单,我更喜欢将其列入白名单。IE使用最终点击目标-因此它可能是div或其他任何东西。这使得它在IE中毫无用处。
window.onkeydown = function(event) {
if (event.keyCode == 8) {
//alert(event.target.tagName); //if you want to see how chrome handles keypresses not on an editable element
if (event.target.tagName == 'BODY') {
//alert("Prevented Navigation");
event.preventDefault();
}
}
}
跨浏览器: 对于纯JavaScript,我发现Stas的答案是最好的。再添加一个针对contenteditable的条件检查,使其对我有效*:
document.onkeydown = function(e) {stopDefaultBackspaceBehaviour(e);}
document.onkeypress = function(e) {stopDefaultBackspaceBehaviour(e);}
function stopDefaultBackspaceBehaviour(event) {
var event = event || window.event;
if (event.keyCode == 8) {
var elements = "HTML, BODY, TABLE, TBODY, TR, TD, DIV";
var d = event.srcElement || event.target;
var regex = new RegExp(d.tagName.toUpperCase());
if (d.contentEditable != 'true') { //it's not REALLY true, checking the boolean value (!== true) always passes, so we can use != 'true' rather than !== true/
if (regex.test(elements)) {
event.preventDefault ? event.preventDefault() : event.returnValue = false;
}
}
}
}
*请注意,IE [edit:和Spartan / TechPreview]具有使表相关元素不可编辑的“功能” 。如果您单击其中之一,然后按Backspace键,它将向后导航。如果您没有可编辑<td>
的,这不是问题。