2 回答
TA贡献1824条经验 获得超6个赞
根据mdn
使用说明
当一个窗口从另一个窗口打开时(使用 Window.open 或具有其目标属性集的链接),它维护对第一个窗口的引用作为 window.opener。如果当前窗口没有开启器,则此方法返回 null。
所以我希望window.open以自我为目标null,因此
window.opener !== window // 真
无论是错误还是有意 - FF68.0.1 和 Chrome75.0.3770.142 似乎没有同意
作为一种解决方法模拟_opener?
<!DOCTYPE html>
<html>
<head>
<title>Parcel Sandbox</title>
<meta charset="UTF-8" />
</head>
<body>
<div id="app"></div>
<button onclick="myFunction()">Try it</button>
<script>
function myFunction() {
window._opener = window.open("about:blank", "_self");
window._opener.document.write(
"blank\<script\>alert(window._opener !== window)\</script\>"
);
}
</script>
</body>
</html>
TA贡献1802条经验 获得超5个赞
引用 MDN:
如果同名的窗口已经存在,则strUrl加载到现有窗口中。在这种情况下,该方法的返回值是现有窗口并被strWindowFeatures忽略。提供空字符串strUrl是一种通过名称获取对打开窗口的引用而不更改窗口位置的方法。
所以当你做
window.open(url, '_self');
您实际上只是将当前的 window 设置为 this url,但 Window 对象不会更改。
btn.onclick = e => {
const wnd = window.open('', '_self'); // let's not change the url
console.log(window === wnd);
};
<button id="btn">click me</button>
所以你的代码片段实际上只是更新你当前的文档:
function myFunction() {
window.document.write(
"blank\<script\>alert(window.opener !== window)\</script\>"
);
}
<button onclick="myFunction()">Try it</button>
然而,奇怪的是 Firefox 确实将 更新openedWindow.opener
为任何窗口将window.open()
以其名称调用。
这确实是一个错误,并且是最终导致您出现问题的原因,因为它应该保持原状(null
在您的示例代码段中)。
但请注意,您尝试执行的核心操作(获取“原始父窗口实例的引用”)在此处无关紧要,因为您的代码片段中始终只有一个 Window。
添加回答
举报