我有一个打开窗口的iFrame(url
,uniqueID
,windowparams
)。
iFrame位于单页应用程序中,并托管在另一台服务器中。
每次刷新或更改页面,然后返回IFrame页面,然后尝试启动相同的window.open
。它不是刷新已打开的窗口,而是创建同一窗口的实例。在检查每个弹出窗口的window.name
后,它会返回与其uniqueID
相同的window name
。如果将URL设置为空白,则其行为与预期一致。但是当设置了一个url时,它会创建一个新的窗口实例。
window.open
在销毁时的表现如此? Mike通过添加iFrame源的沙箱属性成功修复了Webkit浏览器的行为。现在,window.open
方法按预期工作,而不是创建同一window.name
的同一窗口的新实例。
但是,迈克仍然没有运气。如果有人可以为此工作,我们将非常感激。
以下视频中具有sanboxed属性的iFrame的Webkit浏览器行为。
看到父级,即使刷新仍然可以检测到已经打开了同名的弹出窗口。 https://youtu.be/z5_xXRjY8Ow
以下视频中具有sanboxed属性的iFrame的Firefox行为。
刷新父窗口时,浏览器无法检测到已打开的弹出窗口,并使用相同的
window.name
创建弹出窗口的另一个实例。 https://youtu.be/uHaDveW1Sd0
是否有解决办法使Firefox的行为与Webkit浏览器类似?
Mike发现在window.open中使用空白URL在firefox中正常运行。 但仍然如何解决这个问题。
这是约翰尼!呃Mike意味着另一个测试案例。
尝试使用webkit浏览器和firefox。
打开弹出窗口后,刷新页面然后打开另一个弹出窗口
webkit浏览器只有一个窗口实例,但firefox会创建一个新窗口。
在打开的弹出窗口中console.log(window.name)
,您将获得Mike'作为窗口名称
https://bug1295839.bmoattachments.org/attachment.cgi?id=8782242
答案 0 :(得分:1)
我在您的代码中看到了几个问题:
您正在调用嵌套在另一个函数中的函数来关闭窗口,该函数永远不会被触发,因为此时父函数不可调用。
function openWin(){
/* code */
}
function closeWin(){
/* code */
}
为了确保浏览器兼容性以关闭Window,我强烈建议在父窗口中设置并调用生成的弹出窗口中的可注入函数
注入函数的示例:
myWindow.document.write(
"<p>This is 'myWindow'</p>"
+"<script>"
+"function closeWindow()\{" // sample injected function
+"window.close();"
+"\}<\/script>"
);
完整示例:
<!DOCTYPE html>
<html>
<body>
<button onclick="openWin()">Open "myWindow"</button>
<button onclick="closeWin()">Close "myWindow"</button>
<script>
var myWindow;
function openWin() {
myWindow = window.open("", "myWindow", "width=200,height=100");
myWindow.document.write(
"<p>This is 'myWindow'</p>"
+"<script>"
+"function closeWindow()\{" // sample injected function
+"window.close();"
+"\}<\/script>"
);
}
function closeWin() {
if(!myWindow.closeWindow) {
setTimeout(closeWin,1000); // repeat if function not found
} else {
myWindow.closeWindow();
}
}
</script>
</body>
</html>
答案 1 :(得分:0)