当前位置: 首页 > 面试题库 >

JavaScript如何检测浏览器后退按钮事件-跨浏览器

酆君墨
2023-03-14
问题内容

您如何确定用户是否按下浏览器中的“后退”按钮?

您如何使用#URL系统在单页Web应用程序内强制使用页内后退按钮?

到底为什么浏览器后退按钮不触发自己的事件!?


问题答案:

(注意:根据Sharky的反馈,我提供了用于检测退格的代码)

因此,我经常在SO上看到这些问题,并且最近遇到了我自己控制后退按钮功能的问题。在为我的应用程序寻找最佳解决方案(带哈希导航的单页)几天后,我提出了一个简单的,跨浏览器,无库的系统来检测后退按钮。

大多数人建议使用:

window.onhashchange = function() {
 //blah blah blah
}

但是,当用户使用更改位置哈希值的页内元素时,也会调用此函数。当用户单击并且页面前进或后退时,这并不是最佳的用户体验。

为了让您大致了解我的系统,我在用户移动界面时用以前的哈希填充数组。看起来像这样:

function updateHistory(curr) {
    window.location.lasthash.push(window.location.hash);
    window.location.hash = curr;
}

非常简单。我这样做是为了确保跨浏览器支持以及对较旧浏览器的支持。只需将新的哈希传递给函数,它将为您存储它,然后更改哈希(然后将其放入浏览器的历史记录中)。

我还利用了一个页面内后退按钮,该按钮可使用lasthash数组在页面之间移动用户。看起来像这样:

function goBack() {
    window.location.hash = window.location.lasthash[window.location.lasthash.length-1];
    //blah blah blah
    window.location.lasthash.pop();
}

因此,这会将用户移回最后一个哈希,并从数组中删除最后一个哈希(我现在没有前进按钮)。

所以。如何检测用户是否使用了页面内后退按钮或浏览器按钮?

最初,我查看了window.onbeforeunload,但无济于事-仅在用户要更改页面时才调用。在使用哈希导航的单页应用程序中不会发生这种情况。

因此,经过进一步的挖掘,我看到了有关尝试设置标志变量的建议。在我的案例中,这个问题是我会尝试设置它,但是由于所有内容都是异步的,因此并不总是及时为哈希更改中的if语句设置它。.onMouseDown并非总是在click中被调用,并且将其添加到onclick不会足够快地触发它。

这是我开始查看document和之间的区别的时候window。我的最终解决方案是使用设置标志document.onmouseover,并使用禁用它document.onmouseleave

发生的情况是,当用户的鼠标位于文档区域内(阅读:呈现的页面,但不包括浏览器框架)时,我的布尔值设置为true。鼠标离开文档区域后,布尔值将翻转为false

这样,我可以将其更改window.onhashchange为:

window.onhashchange = function() {
    if (window.innerDocClick) {
        window.innerDocClick = false;
    } else {
        if (window.location.hash != '#undefined') {
            goBack();
        } else {
            history.pushState("", document.title, window.location.pathname);
            location.reload();
        }
    }
}

您会注意到的支票#undefined。这是因为如果我的数组中没有可用的历史记录,它将返回undefined。我用它来询问用户是否要使用window.onbeforeunload事件离开。

简而言之,对于不一定使用页内后退按钮或数组来存储历史记录的用户:

document.onmouseover = function() {
    //User's mouse is inside the page.
    window.innerDocClick = true;
}

document.onmouseleave = function() {
    //User's mouse has left the page.
    window.innerDocClick = false;
}

window.onhashchange = function() {
    if (window.innerDocClick) {
        //Your own in-page mechanism triggered the hash change
    } else {
        //Browser back button was clicked
    }
}

那里有。一种简单的,由三部分组成的html" target="_blank">方法,用于检测关于哈希导航的后退按钮使用情况与页内元素的关系。

$(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();
            }
        }
    });
});


 类似资料:
  • 问题内容: 如何禁用浏览器的“后退”按钮(跨浏览器)? 问题答案: 这个问题是非常相似,这一个 … 您需要强制缓存过期才能正常工作。将以下代码放在页面代码后面。

  • 问题内容: 如何找到浏览器的Javascript引擎版本以及对ECMAScript 6的支持? 我只是想知道浏览器的版本,而不是引擎的版本。 问题答案: 特征检测 我建议您使用 功能检测, 而不要使用启发式方法检测浏览器的引擎。为此,您可以简单地 在语句中包装一些代码,或使用一些语句。 例如: 为什么功能检测比浏览器/引擎检测更好? 在大多数情况下,有多种原因可以使特征检测成为最佳选择: 您不必依

  • 问题内容: 我在www.darknovagames.com上运行了基于浏览器的游戏。最近,我一直在努力使用CSS重新格式化该网站,试图让其所有页面都根据HTML标准进行验证。 我一直在想着要在页面左侧放置AJAX导航菜单的想法(而不是每次都将用户带到一个单独的页面,而是需要重新加载标题和导航栏,而这几乎是不会改变的),我知道如果这样做,我可能会破坏浏览器中的“前进/后退”按钮。我的问题是,我应该继

  • 问题内容: 是否可以使用浏览器中的“历史记录后退”按钮检测到用户进入了页面?最好是我想使用angular.js检测到此动作。 我不想使用角度布线。如果用户提交表单,并且在成功提交到服务器并进行重定向之后,它也应该起作用,如果用户使用浏览器的“后退”按钮返回到表单,则也应该是可行的。 问题答案: 这是Angular的解决方案。 我正在使用运行块来启动它。首先,我将实际位置存储在$ rootScope

  • 问题内容: 我正在用php做在线测验应用程序。我想限制用户再次参加考试。我尝试了以下脚本,但是它停止了我的计时器。我该怎么办? 我已经包含了源代码。计时器存储在cdtimer.js中 我有一个考试计时器,该计时器从 mysql 值中获取考试时间。计时器相应地启动,但是当我放入用于禁用后退按钮的代码时,计时器停止。我怎么了 问题答案: 有许多原因导致禁用后退按钮无法真正起作用。最好的选择是警告用户:

  • 问题内容: 对于所有主流浏览器(IE浏览器除外),由于后退按钮操作导致页面加载时JavaScript 事件不会触发-仅在页面首次加载时触发。 有人可以指出一些解决该问题的示例跨浏览器代码(Firefox,Opera,Safari,IE等)吗?我对Firefox的事件很熟悉,但不幸的是Opera和Safari都没有实现这一功能。 问题答案: 伙计们,我发现JQuery仅具有一种作用:当按下后退按钮时