首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止回退键导航?

如何防止回退键导航?
EN

Stack Overflow用户
提问于 2009-09-29 22:08:52
回答 33查看 230.6K关注 0票数 289

在IE上,我可以使用(非常不标准的,但正在工作的) jQuery来完成这个任务。

代码语言:javascript
运行
复制
if ($.browser.msie)
    $(document).keydown(function(e) { if (e.keyCode == 8) window.event.keyCode = 0;});

但是,是否有可能以一种在Firefox上工作的方式,或者以跨浏览器的方式来获得奖金呢?

请记录在案:

代码语言:javascript
运行
复制
$(document).keydown(function(e) { if (e.keyCode == 8) e.stopPropagation(); });

什么都不做。

代码语言:javascript
运行
复制
$(document).keydown(function(e) { if (e.keyCode == 8) e.preventDefault(); });

解决了这个问题,但是在页面上使backspace键不可用,这比最初的行为更糟糕。

编辑:我这么做的原因是我创建的不是一个简单的网页,而是一个大型的应用程序。仅仅因为你在错误的地方按下了后置空间就失去了10分钟的工作,这是令人难以置信的恼人的。防止错误与恼人用户的比率应该在1000/1以上,方法是防止后退键导航回来。

EDIT2:我是,不是试图阻止历史导航,只是意外。

EDIT3:@brentonstrines的评论(因为这个问题很流行):这是一个长期的“修复”,但是您可以支持在webkit中更改此行为的铬错误

EN

回答 33

Stack Overflow用户

回答已采纳

发布于 2010-05-04 19:11:48

这段代码解决了这个问题,至少在IE和Firefox中是这样的(还没有测试过其他浏览器,但如果这个问题在其他浏览器中存在,我就给它一个合理的机会)。

代码语言:javascript
运行
复制
// 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;
        }
    }
});
票数 341
EN

Stack Overflow用户

发布于 2011-11-21 20:49:46

此代码可在所有浏览器上工作,并在没有窗体元素时或在窗体元素禁用的情况下吞下backspace键。它也是有效的,当它在输入的每个键上执行时,这是很重要的。

代码语言:javascript
运行
复制
$(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();
            }
        }
    });
});
票数 66
EN

Stack Overflow用户

发布于 2014-04-08 23:00:36

这里的其他答案已经证明,如果没有允许使用Backspace的白名单元素,就不可能做到这一点。这个解决方案并不理想,因为白名单不像仅仅文本区域和文本/密码输入那么简单,而是反复被发现是不完整的,需要更新。

然而,由于抑制backspace功能的目的仅仅是防止用户意外丢失数据,所以卸载前解决方案是一个很好的解决方案,因为模式弹出是令人惊讶的--当模式弹出作为标准工作流的一部分被触发时,它们是不好的,因为用户习惯在不读取数据的情况下删除它们,而且它们很烦人。在这种情况下,模式弹出只能作为一种罕见和令人惊讶的操作的替代,因此是可以接受的。

问题是,每当用户从页面导航(例如单击链接或提交表单时),onbeforeunload模式就不能弹出,而且我们不希望在卸载之前开始对特定的onbeforeunload条件进行白名单或黑名单。

广义解的理想折衷组合如下:跟踪是否按下了后退空间,只有在卸载前弹出该模型。换言之:

代码语言:javascript
运行
复制
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中,并从您不希望用户意外丢失数据的任何页面调用它。

请注意,onbeforeunload模式只能触发一次,因此如果用户再次按退空间,该模式将不会再次触发。

请注意,这不会触发哈希更改事件,但是在这种情况下,您可以使用其他技术来防止用户意外丢失数据。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1495219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档