窗口打开器的替代方案

20

我正在打开一个模态弹窗。然后,我使用 window.opener 访问父窗口的文本框和其他属性。在火狐浏览器中,它运行良好,但在 IE8 中不行。它会报错 'window.opener is null'。如何在两个浏览器中访问父窗口属性。


你尝试过window.parent.opener吗? - Shakti Singh
我尝试使用 window.parent.opener,但无法访问父文档对象。我将 parent.document 作为参数传递,并在弹出窗口中访问 parent.document,方法是使用 window.dialogArguments.parentDocumentObj,其中 parentDocumentObj 是包含文档的变量名称。 - dmay
5个回答

10

解决该问题的方法有两种: 注意: 如果使用 "showModalDialog","window.opener" 不被IE支持。

1) 使用 "window.open" 代替 "window.showModalDialog"

2) 如果你想要使用 "window.showModalDialog",请执行以下操作:

<script language="javascript" type="text/javascript">
    function YourFunction()
    {
        var opener = null;

        if (window.dialogArguments) // Internet Explorer supports window.dialogArguments
        { 
            opener = window.dialogArguments;
        } 
        else // Firefox, Safari, Google Chrome and Opera supports window.opener
        {        
            if (window.opener) 
            {
                opener = window.opener;
            }
        }       
        // write you code and refer "opener"
        window.close();
    }
</script>

8

您可以向showModalDialog函数传递参数。只需将window对象作为参数传递即可。

window.showModalDialog(theURL, window);

你可以使用dialogArguments从模态窗口中访问参数。请参见:http://msdn.microsoft.com/zh-cn/library/ms533723.aspx

var openerWindow = window.dialogArguments;

我应该注意到这在IE和FF中运行,并且可能在其他浏览器中也可以。 - Kaitnieks
3
showModalDialog方法已被Chromium 35 (2014年7月)弃用。请参考http://blog.chromium.org/2014/07/disabling-showmodaldialog.html和http://blog.chromium.org/2014/04/chrome-35-beta-more-developer-control.html。 - edigu

1
作为跨浏览器的替代方案,您可以在打开新窗口时为其赋予自定义属性:
var popup = window.open(...);
popup.isPopup = true;

然后,在所提到的页面中:

if (window.isPopup) {
  // Do something
}
else {
  // Not in a popup
}

如果用户重新加载新窗口,该属性将不再存在于窗口中。 - LuckyStarr

1

禁用Internet Explorer的“保护模式”,以便访问此对象。

步骤如下:

  1. 按Alt+T显示工具菜单
  2. 点击“Internet选项”
  3. 选择“安全”选项卡
  4. 确保所选区域包含您的站点。对于内部网站,通常是“本地内部网”区域。
  5. 取消选中“启用保护模式”
  6. 关闭所有IE选项卡和窗口,然后重新打开。

现在您应该能够访问window.opener对象了。


0
我会采取以下方法:
  1. 使用现有的JavaScript UI库,因为你不是第一个想要做这件事的人,如果没有找到
  2. 创建一个名为OpenWindow的函数,该函数会在浏览器中检测window.opener方法
例如:
if(window.opener == undefined) {
   //probably not Firefox...
}

如果找到它,就使用它,否则测试IE变体并使用它。然后它检查Safari的版本等等...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接