我想在你离开页面时显示一条消息(不是一个烦人的警报,只是一些告诉你等待的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会发生什么?
答案 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);
};
}());