在iframe中使用window.open的唯一弹出窗口

时间:2016-08-15 03:40:52

标签: javascript firefox

我有一个打开窗口的iFrame(urluniqueIDwindowparams)。 iFrame位于单页应用程序中,并托管在另一台服务器中。 每次刷新或更改页面,然后返回IFrame页面,然后尝试启动相同的window.open。它不是刷新已打开的窗口,而是创建同一窗口的实例。在检查每个弹出窗口的window.name后,它会返回与其uniqueID相同的window name。如果将URL设置为空白,则其行为与预期一致。但是当设置了一个url时,它会创建一个新的窗口实例。

  • iFrame window.open在销毁时的表现如此?
  • 我尝试在本地运行iFrame源,即使刷新后窗口打开也正常。
  • 我在IE,Firefox和Chrome中尝试过,它返回了相同的行为。

更新

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

2 个答案:

答案 0 :(得分:1)

我在您的代码中看到了几个问题:

  1. 您正在调用嵌套在另一个函数中的函数来关闭窗口,该函数永远不会被触发,因为此时父函数不可调用。

    function openWin(){
         /* code */
    }
    function closeWin(){
         /* code */
    }
    
  2. 为了确保浏览器兼容性以关闭Window,我强烈建议在父窗口中设置并调用生成的弹出窗口中的可注入函数

  3. 注入函数的示例:

    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)