我再删除localStorage的时候,显示删除成功了,刷新后发信又出现了,并且还是原来的,我就想肯定是关闭的时候,浏览器又触发了存储变量到localStorage
找了半天,发现
window.addEventListener('beforeunload', ()
就是检测浏览器窗口关闭和刷新的,还以为是检测上传图片呢。哎
下面介绍下beforeunload
参考地址 Window: beforeunload event
当浏览器窗口关闭或者刷新时,会触发beforeunload事件。当前页面不会直接关闭,可以点击确定按钮关闭或刷新,也可以取消关闭或刷新。
Bubbles | No |
---|---|
Cancelable | Yes |
Interface | Event |
Event handler property | onbeforeunload |
事件使网页能够触发一个确认对话框,询问用户是否真的要离开该页面。如果用户确认,浏览器将导航到新页面,否则导航将会取消。
根据规范,要显示确认对话框,事件处理程序需要在事件上调用preventDefault()
。
但是请注意,并非所有浏览器都支持此方法,而有些浏览器需要事件处理程序实现两个遗留方法中的一个作为代替:
将字符串分配给事件的
returnValue
属性从事件处理程序返回一个字符串。
某些浏览器过去在确认对话框中显示返回的字符串,从而使事件处理程序能够向用户显示自定义消息。但是,此方法已被弃用,并且在大多数浏览器中不再支持。
为避免意外弹出窗口,除非页面已与之交互,否则浏览器可能不会显示在beforeunload
事件中创建的提示,甚至根本不会显示它们。
将事件处理程序/监听器加到window
或 document
的beforeunload
事件后,将阻止浏览器使用内存中的页面导航缓存,例如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 | Recommendation | Initial definition |
浏览器兼容性
Update compatibility data on GitHub
1 | 12 | 1 | 4 | 12 | 3 | 1 | 18 | 4 | 12 | 1 | 1.0 |
? — 51 | No | ? — 44 | Yes | ? — 38 | ? — 9 | ? — 51 | ? — 51 | ? — 44 | ? — 41 | No | ? — 5.0 |
30 | 12 | Yes | Yes | ? | ? | Yes | Yes | Yes | Yes | No | Yes |
No | 12 — 79 | Yes | 9 | No | 11 | No | No | Yes | No | No | No |
1 | 12 | 1 | Yes | 12 | 3 | Yes | Yes | Yes | Yes | No | Yes |
What are we missing? Full support No support Compatibility unknown Non-standard. Expect poor cross-browser support. Deprecated. Not for use in new websites.Legend