js如何监听窗口的关闭?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js如何监听窗口的关闭?相关的知识,希望对你有一定的参考价值。

beforeunload 和 unload 对chrome没用。。。公司又要求兼容chrome,折腾了两天了,都快崩溃了。。。

下面的代码兼容除 Opera 之外的任何浏览器。Opera 到现在最高版本为止对 onunload 的支持都是不完整的,对于 unbeforeunload 更是根本不支持。


<script type="text/javascript">
window.onbeforeunload = function(e)
    e = e || window.event;
    var msg = "您确定要离开此页面吗?";
     
    // IE
    e.cancelBubble = true;
    e.returnValue = msg;
     
    // Firefox
    if(e.stopPropagation)
        e.stopPropagation();
        e.preventDefault();
    
    
    // Chrome / Safari
    return msg;
;
</script>

追问

如果是onunload呢? 现在在做的东西 是考试界面,进入考试后,刷新,关闭都进行提交,我想的是onunload方法,但是 chrome上好像没效果。。。还是可以用别的方法代替的?求指教。。。

追答

你是想不出现任何提示直接提交表单吧?
据我所知,无论是使用 onunload 和 onbeforeunload 都无法做到兼容全部浏览器。

windown.onbefloreunload = function()
document.forms["test"].submit();
;

这段代码在 Chrome 中可以,但 Firefox, Safari 中都是无效的。就算可行,你也不能完全保证表单被完全提交,因为浏览器已经关闭,和服务器的连接可能还没建立就已经中断,也不能保证在提交失败的情况下给出提示。

所以我的建议还是手动提交,然后在 onbeforeunload 中添加一个变量来判断表单是否已经被提交,如果没有,刷新或离开时提示,反之直接退出。

追问

没。。。其实我想的是 跳出个
if(confirm(“离开将提交当前试卷,确定离开吗?”))
提交。。。

else
不提交



然后真正实现的话 可以用onbeforeunload 提示 onunload 进行提交操作

追答

不管是用那种方法,在浏览器关闭的瞬间提交表单是不现实的。

你只能做到先定义两个变量
1、formChanged = false,如果表单有变化,formChanged = true。
2、formSubmitted = false,当手动提交时,formSubmitted = true。

在离开页面的时候检查这两个变量

如果 formChanged = true 且 formSubmitted = false,提示用户,如果点击确认,返回手动提交,否则不提交直接离开页面。

如果 formChanged = true 或 false,且 formSubmitted = true,就不需要提示,可以直接离开。

所以结论就是用户必须手动提交表单。

追问

但是 这样的话 如果退出 不是又可以重新进入到这个页面了。。。
额,不过公司说限定用IE。。。分给你吧 谢了

参考技术A

js关闭浏览器窗口

js关闭浏览器窗口,不弹出提示框。支持ie6+,火狐,谷歌等浏览器。
<html>
<head />
<body>
<script type="text/javascript">
function closeWin()
    window.opener=null;//window的opener对象置为null
    window.open('','_self','');//本页面刷新
    window.close();//窗口关闭

</script>
<!--点击事件触发-->
<a onclick="closeWin()" href="#">logout</a>
</body>
</html>


参考技术B close 事件

Vue中监听窗口关闭事件,并在窗口关闭前发送请求


    mounted() {
      window.addEventListener('beforeunload', e => this.beforeunloadHandler(e))
      window.addEventListener('unload', e => this.unloadHandler(e))
    },
    destroyed() {
      window.removeEventListener('beforeunload', e => this.beforeunloadHandler(e))
      window.removeEventListener('unload', e => this.unloadHandler(e))
    },
    methods: {
      beforeunloadHandler(){
        this._beforeUnload_time=new Date().getTime();
      },
      unloadHandler(e){
        this._gap_time=new Date().getTime()-this._beforeUnload_time;
        debugger
        //判断是窗口关闭还是刷新
        if(this._gap_time<=5){
			//处理的事情
        }
      },
}

以上是关于js如何监听窗口的关闭?的主要内容,如果未能解决你的问题,请参考以下文章

监听浏览器关闭事件

如何监听子窗口关闭?

js关闭窗口的问题

为啥我的js关闭窗口没执行呢

如何在flutter web中监听(“关闭”事件)文件下载窗口?

js如何实现父窗口前端显示,如果父窗口关闭则重新打开