在微软Edge浏览器中,window.opener未定义。

4
我有很多弹出窗口(window.open),用于搜索项目,并从 window.opener 调用 JavaScript 函数以选择该项目(当用户单击它时)。
在所有浏览器中,这一直有效,但是在 Edge 中却不行。我发现只有在 Edge 中 window.opener 是“未定义”的。 无论是本地尝试还是在我的 Web 服务器上,我都遇到了同样的问题。 而且这不可能是跨域安全性问题,因为我的弹出窗口是来自同一个网站的页面。
我是否忽略了 Edge 的某些内容?我们使用 window.open 的方式是否有新要求?
例如,如果我有一个输入按钮执行以下操作:
window.open('search.aspx','searching');

将以下 JavaScript 函数添加到 head 部分中:
function SelectItem(ID)
{
    // insert magic here
    alert('test');
}

以下来自search.aspx的javascript代码在Edge浏览器上无法使用:
window.opener.SelectItem(123);

如果我把它改成

alert(window.opener);

我将看到它是未定义的。
编辑1: 不,这不是Window.opener在本地主机上运行时在Microsoft Edge中未定义的重复。我在提问之前已经阅读了这个问题。我的问题不仅来自本地主机,而且来自Web服务器。这不是主机名的问题。
编辑2: 测试的简单方法是,我从w3schools的“Try it yourself”示例获得了相同的问题:https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_win_open3 更新(解决方案):我在Edge 38.14393(Windows 10版本1607)中遇到了这个问题。我刚刚升级到Win10版本1803(Edge 42.17134),现在一切都按预期正常工作了。可能是以前的Edge版本中出现了错误!

这些解决方案有帮助吗?https://stackoverflow.com/questions/31196295/window-opener-in-microsoft-edge-undefined-when-running-at-localhost - AtheistP3ace
1
不,我在提问之前已经阅读了这个问题。我的问题不仅发生在本地主机上,也发生在 Web 服务器上。这不是主机名的问题。 - Matt Roy
2
我已经标记了这个问题,以删除“重复”标签。我遇到了同样的错误。我有prod1.example.com和prod2.example.com(指向公共IP),window.opener可以正常工作,但在一些计算机上,它们可以访问dev1.example.com(指向本地IP),window.opener在prod1.example.com上无法正常工作。我怀疑Edge将*.example.com标记为“本地”,因为如果是dev1.example.com,所以它破坏了prod1.example.com。 - Tom
2
我也投票支持重新开放。我无法理解那些投票关闭此类问题的人的行为。 - Simon Bergot
不支持。请参见:https://caniuse.com/#feat=rel-noopener - Steven Stark
1个回答

0

不要使用window.opener来获取父窗口函数的引用。你可以像下面这样将一个函数分配给新打开的窗口:

function SelectItem(ID)
{
    // insert magic here
    alert('test');
}

var popup = window.open('search.aspx','searching');

if(popup) {
    popup.SelectItem = SelectItem;
}

在您的弹出窗口中,现在可以调用 SelectItem

1
我认为你的想法很好,但遗憾的是它也不起作用。在你的“if”之前,我放了一个 alert(popup);,在IE11中,如预期所示,我得到了“[object Window]”,但在Edge中,我得到了“null”。 - Matt Roy

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