javascript location.href onchange事件监听器?

时间:2010-10-24 19:35:23

标签: javascript jquery events navigation location

我想在你离开页面时显示一条消息(不是一个烦人的警报,只是一些告诉你等待的HTML),在思考它时我遇到了一些困难:

  • 当用户按下停止时 浏览器,取消导航 行动,我想要留言 程。

  • 无论何时点击任何链接,都会显示该消息。

  • 当点击的链接只打开另一个标签(忽略_blank目标)时,它不应该捕获

据说,解雇这个事件非常简单,就像

一样
$(document).unload(function()
{
    // display message
});
问题是,如果用户取消,该消息就不会消失。

可能的修复方法是:

$(window).unload(function()
{
    // display message

    setTimeout(function()
    {
        // hide message
    },5000);
});

但我想知道是否有一种更清洁的方式,即当用户取消导航时(或由于任何其他原因而失败),我可以隐藏消息。

编辑#2:

我刚注意到,使用上面的代码,在FF中,在页面离开之前不显示消息,此时如果用户按下Stop,他将收到about:blank。如果他在此之前按下Stop,则永远不会显示该消息。这正是我想要的。

在Internet Explorer中,消息永远不会显示,我假设是因为IE处理的内容不同。我想知道chrome会发生什么?

2 个答案:

答案 0 :(得分:2)

至于第一点:

  

当用户在浏览器中按下“停止”,取消导航操作时,我希望该消息消失。

我有一段时间the same question,而且我后来的研究支持的响亮的回应是,这是不可能的。一旦您开始请求新页面,就不可能以编程方式可靠地“返回”它。超时可能确实是唯一的出路。

另外两点应该相对简单:遍历每个链接(例如使用jQuery),并添加一个click事件打开确认窗口,然后返回false以便原始href未打开。对于内部链接执行此操作也应该相对容易(检查target属性,如果它是_blank,请保留链接。)

处理已经有click个事件的链接可能变得很困难,而其他事件会导致不同的页面,例如表单提交。

答案 1 :(得分:1)

这是一个适用于所有浏览器的解决方案。它使用document.readyState属性,该属性适用于除早期版本FireFox(适用于版本3.6.8)之外的所有浏览器。如果浏览器支持readyState属性,它将检查readyState是否已加载(浏览器将转到另一个页面)或是否已完成(或其他指示页面不在任何地方的内容)。如果浏览器不支持readyState,那么它将默认为您的解决方案。

(function(){
    var hideMessage=document.readyState?function(){
        setTimeout(function(){
            if(document.readyState=='loading'){
                hideMessage();
            }else{
                //hide message
            }
        },500);
    }:function(){
        // hide message
    }
    function displayMessage(){
        // display message
    }
    window.onbeforeunload=function(){
        displayMessage();
        setTimeout(hideMessage,document.readyState?10:5000);
    };
}());