window.opener 替代品

IT技术 javascript window.opener
2021-03-05 00:14:57

我正在打开一个模态弹出窗口。然后我使用window.opener. 它在 firefox 中工作正常,但在 IE8 中不工作。它给出了错误'window.opener is null'如何在两个浏览器中都可以使用的子窗口中访问父窗口属性。

5个回答

有两种方法可以解决这个问题: 注意:如果使用了“ showModalDialog,IE 将不支持window.opener

1)代替“ window.showModalDialog ”使用“ window.open

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>

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

window.showModalDialog(theURL, window);

您可以使用 dialogArguments 从模态窗口访问参数。请参阅:http : //msdn.microsoft.com/en-us/library/ms533723%28VS.85%29.aspx

var openerWindow = window.dialogArguments;
showModalDialog 已被 Chromium 35(2014 年 7 月)弃用。参见blog.chromium.org/2014/07/disabling-showmodaldialog.htmlblog.chromium.org/2014/04/...
2021-04-30 00:14:57
我可能应该注意到这适用于 IE 和 FF,也可能适用于其他浏览器。
2021-05-17 00:14:57

禁用 Internet Explorer 的“保护模式”,这会阻止访问此对象。

执行此操作的步骤是:

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

现在您应该可以访问 window.opener 对象了。

我将采取的方法如下:

  1. 使用现有的 JavaScript UI 库,因为你不是第一个想要这样做的人,如果失败了
  2. 创建一个名为 的函数OpenWindow,浏览器会嗅探该window.opener方法

例如:

if(window.opener == undefined) {
   //probably not Firefox...
}

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

作为跨浏览器的替代方案,您可以在打开新窗口时为其提供自定义属性:

var popup = window.open(...);
popup.isPopup = true;

然后,在引用的页面中:

if (window.isPopup) {
  // Do something
}
else {
  // Not in a popup
}
如果用户重新加载新窗口,该属性将不再出现在窗口中
2021-05-08 00:14:57