Chrome在标签页(或浏览器)关闭时的onbeforeunload事件

10

我正在尝试在用户离开(关闭)浏览器或页面时运行函数,我已经让它在所有浏览器中正常工作,除了Chrome。

如果我离开页面,Chrome可以成功地运行函数,但如果我关闭标签或完全关闭浏览器,则不会运行函数。

我在最后运行的函数创建一个图像并向服务器发送一些数据(类似于任何分析报告),例如:img.src="url?data=yyy"。这个图像是使用js动态创建的。

有人能指出可能的问题吗? 我已经缩小到以下几个原因:

1)当标签页关闭时,我没有使用正确的事件(即没有使用beforeunload)

2)Chrome实际上运行了该函数,但图像由于浏览器/页面关闭而没有被发送。

感谢任何帮助。

这是示例代码:

if(window.addEventListener){
   window.addEventListener("beforeunload", page_unload, false);         
}
function page_unload(){
    var img     = new Image();
    var img_src = "http://www.myurl.com?data=yyy"
    img.src = img_src;
}

每个 Chrome 标签页都在自己的进程中运行,对吧?因此,如果你有一些在标签页关闭时运行的东西,即使它运行了,包含运行代码的进程也会停止。否则,你可能会看到一堆挂起的 Chrome 标签页仍然打开,这是我从未见过的。 - Paul Nikonowicz
1
每个选项卡都是一个独立的进程,因此与该进程相关的任何代码也应该随之结束。Firefox 可以优雅地处理这种情况,并且可以满足我的需求,所以我希望在 Chrome 方面可能错过了一些东西。 - Nik
3
你想要做的事情是不可能的。onbeforeunload事件只能用于弹出一个对话框,以鼓励用户留在你的页面上(通过返回提示文本),当事件触发时,你已经没有时间来发起HTTP请求。 - user149341
嗯,说得也有道理。你知道为什么Firefox能在这种情况下工作而其他浏览器不能吗?让我感到困扰的是一个可以工作而另一个却不能... - Nik
我认为这是因为进程没有死亡,所以Firefox更优雅地处理标签页关闭。在这种情况下,“优雅”与“复杂”是同义词。 - Paul Nikonowicz
@user1394625,听起来你的问题与 Chrome 的关闭速度有关。也许你可以缩小发送内容的大小。你发送的图片有多大?你是否尝试过发送像素图像来测试是否能够成功传输? - hitautodestruct
1个回答

0

我在Chrome浏览器上遇到了相关问题,并使用jQuery解决了它:

$(window).unload( function() {
   //Call your function
   page_unload();
});

由于某些原因,jQuery的卸载事件在某些情况下比JavaScript的beforeunload事件更好地在Chrome中工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接