beforeunload event 当浏览器窗口关闭或者刷新时触发

2020-11-26 11:02:24

我再删除localStorage的时候,显示删除成功了,刷新后发信又出现了,并且还是原来的,我就想肯定是关闭的时候,浏览器又触发了存储变量到localStorage


找了半天,发现 

window.addEventListener('beforeunload', ()

就是检测浏览器窗口关闭和刷新的,还以为是检测上传图片呢。哎

下面介绍下beforeunload


参考地址 Window: beforeunload event


当浏览器窗口关闭或者刷新时,会触发beforeunload事件。当前页面不会直接关闭,可以点击确定按钮关闭或刷新,也可以取消关闭或刷新。

BubblesNo
CancelableYes
InterfaceEvent
Event handler propertyonbeforeunload

事件使网页能够触发一个确认对话框,询问用户是否真的要离开该页面。如果用户确认,浏览器将导航到新页面,否则导航将会取消。

根据规范,要显示确认对话框,事件处理程序需要在事件上调用preventDefault()

但是请注意,并非所有浏览器都支持此方法,而有些浏览器需要事件处理程序实现两个遗留方法中的一个作为代替:

  • 将字符串分配给事件的returnValue属性

  • 从事件处理程序返回一个字符串。

某些浏览器过去在确认对话框中显示返回的字符串,从而使事件处理程序能够向用户显示自定义消息。但是,此方法已被弃用,并且在大多数浏览器中不再支持。

为避免意外弹出窗口,除非页面已与之交互,否则浏览器可能不会显示在beforeunload事件中创建的提示,甚至根本不会显示它们。

将事件处理程序/监听器加到window或 documentbeforeunload事件后,将阻止浏览器使用内存中的页面导航缓存,例如Firefox的Back-Forward缓存WebKit的Page Cache

HTML规范指出在此事件中调用window.alert()window.confirm()以及window.prompt()方法,可能会失效。更多详细信息,请参见HTML规范

示例

HTML规范指出作者应该使用 Event.preventDefault() 而非 Event.returnValue,然而,不是所有浏览器都支持这么做。

window.addEventListener('beforeunload', (event) => {   // Cancel the event as stated by the standard.   event.preventDefault();   // Chrome requires returnValue to be set.   event.returnValue = ''; });

规范

规范状态注释
HTML Living Standard
beforeunload
Living Standard
HTML5
beforeunload
RecommendationInitial definition

浏览器兼容性

Update compatibility data on GitHub


DesktopMobile

ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung Internet
beforeunload eventFull support1Full support12Full support1Full support4Full support12Full support3Full support1Full support18Full support4Full support12Full support1Full support1.0
Custom text supportDeprecatedNon-standardNo support? — 51No supportNoNo support? — 44Full supportYesNo support? — 38No support? — 9No support? — 51No support? — 51No support? — 44No support? — 41No supportNoNo support? — 5.0
Activation using event.returnValue = "string";DeprecatedFull support30Full support12Full supportYesFull supportYes??Full supportYesFull supportYesFull supportYesFull supportYesNo supportNoFull supportYes
Activation using event.preventDefault()No supportNoNo support12 — 79Full supportYesFull support9No supportNoFull support11No supportNoNo supportNoFull supportYesNo supportNoNo supportNoNo supportNo
Activation using return "string";DeprecatedFull support1Full support12Full support1Full supportYesFull support12Full support3Full supportYesFull supportYesFull supportYesFull supportYesNo supportNoFull supportYes

What are we missing?

Legend

  • Full support 

  • Full support

  • No support 

  • No support

  • Compatibility unknown 

  • Compatibility unknown

  • Non-standard. Expect poor cross-browser support.

  • Non-standard. Expect poor cross-browser support.

  • Deprecated. Not for use in new websites.

  • Deprecated. Not for use in new websites.


  • 2017-03-15 07:43:19

    NodeJS服务器”热部署“代码,实现动态调试

    如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一部份,都必须终止Node.js 再重新运行才会奏效。这是因为 Node.js 只有在第一次引用到某部份时才会去解析脚本文件,以后都会直接访问内存,避免重复载入,而 PHP 则总是重新读取并解析脚本(如果没有专门的优化配置)。

  • 2017-03-16 13:37:58

    mysql中如何使用INSERT一次性插入多条记录

    看到这个标题也许大家会问,这有什么好说的,调用多次INSERT语句不就可以插入多条记录了吗!但使用这种方法要增加服务器的负荷,因为,执行每一次 SQL服务器都要同样对SQL进行分析、优化等操作。

  • 2017-03-18 20:17:09

    Linux上vi(vim)编辑器使用教程

    vi(vim)是上Linux非常常用的编辑器,很多Linux发行版都默认安装了vi(vim)。vi(vim)命令繁多但是如果使用灵活之后将会大大提高效率。vi是“visual interface”的缩写,vim是vi IMproved(增强版的vi)。在一般的系统管理维护中vi就够用,如果想使用代码加亮的话可以使用vim。下面vps侦探整理一下vi的使用教程:包含vi的基本介绍、使用模式、文件的打开关闭保存、插入文本或新建行、移动光标、删除、恢复字符或行、搜索等等,算是一篇比较适合新手学习vi的教程。

  • 2017-03-20 17:31:55

    Nodejs express 获取url参数,post参数的三种方式

    127.0.0.1:3000/index,这种情况下,我们为了得到index,我们可以通过使用req.params得到,通过这种方法我们就可以很好的处理Node中的路由处理问题,同时利用这点可以非常方便的实现MVC模

  • 2017-03-20 17:33:55

    forever守护nodejs进程

    这样可以正常启动应用,但是如果断开客户端连接,应用也就随之停止了。也就是说这样的启动方式没有给应用一个守护线程。