【问题标题】:Unique popup window using window.open in an iframe在 iframe 中使用 window.open 的唯一弹出窗口
【发布时间】:2016-12-21 07:13:25
【问题描述】:

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

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

更新:

Mike 通过为 iFrame 源添加沙箱属性成功修复了 Webkit 浏览器的行为。现在window.open 方法可以按预期工作,并且不会为同一window.name 的同一窗口创建新实例。

但是,Mike 仍然没有使用 Firefox。如果有人可以为此提供解决方法,将不胜感激。

下面视频中带有 sanboxed 属性的 iFrame 的 Webkit 浏览器行为。

看到父级,即使在刷新时仍然可以检测到已经打开的同名弹出窗口。 https://youtu.be/z5_xXRjY8Ow

下面视频中带有 sanboxed 属性的 iFrame 的 Firefox 行为。

刷新父窗口时,浏览器无法检测到已打开的弹出窗口,并使用相同的window.name 创建另一个弹出窗口实例。 https://youtu.be/uHaDveW1Sd0

有没有办法让 Firefox 像 Webkit 浏览器一样工作?

更新:

Mike 发现在 window.open 中使用空白 url 在 firefox 中表现正常。 不过还是怎么解决哈哈。

更新:

约翰尼来了! er Mike 表示另一个测试用例。 尝试使用 webkit 浏览器和 firefox。 打开弹出窗口后,刷新页面然后打开另一个弹出窗口 webkit 浏览器只会有一个你的窗口实例,但是 firefox 会创建一个新的。 console.log(window.name) 在打开的弹出窗口中,您将获得“Mike”作为窗口名称 https://bug1295839.bmoattachments.org/attachment.cgi?id=8782242

【问题讨论】:

  • Mike 应该提供一个minimal reproducible example
  • 我在 Firefox 中的行为与在 Chrome 中的行为相同,只是位置上有一个小例外:Chrome 窗口在屏幕的左上角弹出,而在 Firefox 中,窗口在 iframe 上方弹出。在 Win10 电脑上测试。
  • Mike 添加了视频参考,以便您可以看到所需的参考。使用 fiddle 创建 iframe 的行为并没有达到预期
  • 我是迈克的强烈愿望,希望将第三人称引用更改为单数...等等。
  • 哈哈对不起老板,迈克认为迈克有严重的非法主义问题

标签: javascript firefox


【解决方案1】:
【解决方案2】:

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

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

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

函数注入示例:

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>

【讨论】:

  • @Michael Rosales,如果答案正确,请采纳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多