window.open打开谷歌标签页,beforeunload事件仅document.write后生效问题
问题原因与解决办法
核心限制:浏览器同源策略
你打开的谷歌页面和当前页面域名不同,浏览器的同源策略会禁止脚本对跨域窗口的事件、DOM进行操作,所以直接给myWindow绑定beforeunload事件根本不会生效。为什么
document.write后能正常工作?
调用myWindow.document.write("test")会清空新窗口里的谷歌页面,替换成和当前页面同源的内容。这时候新窗口的文档和当前页面属于同一源,同源策略的限制就解除了,事件监听自然能正常触发。替代方案
如果需要监听这个跨域窗口的关闭状态,不能直接用beforeunload,可以试试这两种方法:- 定时检查窗口的
closed属性:var myWindow = window.open("https://www.google.com/", '_blank'); const checkInterval = setInterval(() => { if (myWindow.closed) { alert("closing"); console.log("closing"); clearInterval(checkInterval); } }, 500); - 要是新窗口的页面是你能控制的,还可以用
postMessage做跨域通信,让新窗口在关闭前主动给父页面发消息。
- 定时检查窗口的
内容的提问来源于stack exchange,提问作者junaidp
相关产品推荐
相关产品推荐

