我怎样才能防止退格键导航回来?
在IE上,我可以用(非常不标准的,但工作正常的)jQuery来做到这一点
if ($.browser.msie)
$(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});
但是有可能以Firefox的方式工作,或者以跨浏览器的方式获得奖金?
作为记录:
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });
什么也没做。
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });
解决了这个问题,但在页面上显示退格键不可用,这比原来的行为更糟糕。
编辑:我这样做的原因是,我不是创建一个简单的网页,而是一个大型应用程序。 仅仅因为你在错误的地方将退格按下而失去了10分钟的工作是令人难以置信的烦恼。 通过防止退格键导航返回,防止错误与恼人用户的比率应该高于1000/1。
编辑2:我不是想阻止历史导航,只是意外。
EDIT3:@brentonstrines评论(因为这个问题非常受欢迎,所以在这里提出):这是一个长期的'修复',但是你可以抛出对Chromium bug的支持来改变webkit中的这种行为
这段代码解决了这个问题,至少在IE和Firefox中(没有测试过任何其他的代码,但是如果问题在其他浏览器中存在的话,我会给它一个合理的工作机会)。
// Prevent the backspace key from navigating back.
$(document).unbind('keydown').bind('keydown', function (event) {
if (event.keyCode === 8) {
var doPrevent = true;
var types = ["text", "password", "file", "search", "email", "number", "date", "color", "datetime", "datetime-local", "month", "range", "search", "tel", "time", "url", "week"];
var d = $(event.srcElement || event.target);
var disabled = d.prop("readonly") || d.prop("disabled");
if (!disabled) {
if (d[0].isContentEditable) {
doPrevent = false;
} else if (d.is("input")) {
var type = d.attr("type");
if (type) {
type = type.toLowerCase();
}
if (types.indexOf(type) > -1) {
doPrevent = false;
}
} else if (d.is("textarea")) {
doPrevent = false;
}
}
if (doPrevent) {
event.preventDefault();
return false;
}
}
});
此代码适用于所有浏览器,当不在表单元素上时,或者如果表单元素被禁用| readOnly,则会吞下退格键。 它也是有效的,当它在键入的每个键上执行时都很重要。
$(function(){
/*
* this swallows backspace keys on any non-input element.
* stops backspace -> back
*/
var rx = /INPUT|SELECT|TEXTAREA/i;
$(document).bind("keydown keypress", function(e){
if( e.which == 8 ){ // 8 == backspace
if(!rx.test(e.target.tagName) || e.target.disabled || e.target.readOnly ){
e.preventDefault();
}
}
});
});
这里的其他答案已经证实,如果没有将Backspace允许的元素列入白名单,就不能做到这一点。 这种解决方案并不理想,因为白名单并不像textareas和文本/密码输入那么简单,但是反复发现它不完整并且需要更新。
但是,由于抑制退格功能的目的仅仅是为了防止用户意外丢失数据,因此beforeunload解决方案是一个很好的解决方案,因为模式弹出窗口令人惊讶 - 当作为标准工作流程的一部分触发时,模式弹出窗口不好,因为用户习惯于在没有阅读的情况下解雇他们,而且他们很烦人。 在这种情况下,模式弹出窗口只会作为罕见和令人惊讶的操作的替代方式出现,因此可以接受。
问题在于,无论何时用户离开页面(例如单击链接或提交表单时),都不会弹出onbeforeunload模式,并且我们不希望启动白名单或列入特定onbeforeunload条件的黑名单。
对于一般化解决方案来说,权衡的理想组合如下:跟踪是否按下退格键,如果是,则只弹出onbeforeunload模式。 换一种说法:
function confirmBackspaceNavigations () {
// http://stackoverflow.com/a/22949859/2407309
var backspaceIsPressed = false
$(document).keydown(function(event){
if (event.which == 8) {
backspaceIsPressed = true
}
})
$(document).keyup(function(event){
if (event.which == 8) {
backspaceIsPressed = false
}
})
$(window).on('beforeunload', function(){
if (backspaceIsPressed) {
backspaceIsPressed = false
return "Are you sure you want to leave this page?"
}
})
} // confirmBackspaceNavigations
这已经过测试,可用于IE7 +,FireFox,Chrome,Safari和Opera。 只需将这个函数放到你的global.js中,并从任何你不希望用户意外丢失数据的页面调用它。
链接地址: http://www.djcxy.com/p/41383.html上一篇: How can I prevent the backspace key from navigating back?