我们遇到以下情况:从单个域运行:
页面A使用window.open()
打开命名窗口(弹出播放器)。 window.open()
为页面A提供了对窗口的引用。
用户现在重新加载页面A.对命名窗口的引用将丢失。使用window.open()
“找到”窗口会产生重新加载它的不幸副作用(不合需要)。有没有其他方法可以获得对此窗口的引用?
答案 0 :(得分:24)
试试这个:
var playerUrl = 'http://my.player...';
var popupPlayer= window.open('', 'popupPlayer', 'width=150,height=100') ;
if(popupPlayer.location.href == 'about:blank' ){
popupPlayer.location = playerUrl ;
}
popupPlayer.focus();
它将打开一个具有唯一名称的空白窗口。由于url为空白,因此不会重新加载窗口的内容。
答案 1 :(得分:1)
AFAIK,没有没有..
一种肮脏但我猜它会工作的黑客是使用window.opener定期重置弹出窗口中父窗口的引用,如下代码:
setInterval(function() { if(window.opener) { window.opener.document.myPopupWindow = window } }, 100)
在父窗口中,即使重新加载(也就是重新加载后100毫秒),您也可以访问document.myPopupWindow。这应该跨浏览器。
答案 2 :(得分:0)
实际上你所做的是破坏所创建窗口(Popup)的父(页面A),因此它不再引用原始父级,因此你无法直接引用。
我能想到的唯一解决方案是使用一个浏览器,它提供了添加的javascript功能,可以在活动窗口(标签)中循环,找到一个具有特殊属性的浏览器(即:重新加载的页面A),弹出窗口可以识别
不幸的是我认为只有firefox有一些额外的功能或扩展,可以为您提供这种灵活性。 (虽然这也是一种安全风险)
答案 3 :(得分:0)
这应该有效。在弹出窗口中添加此代码:
function updateOpener() {
if (window.opener)
window.opener.document.myPopupWindow = window;
else
setTimeout(updateOpener, 100);
}
updateOpener();
这是在父窗口的onload中。要确保myPopupWindow已设置等待100毫秒才能访问它。
setTimeout(function() {
if (document.myPopupWindow)
document.myPopupWindow.focus();
}, 100);
答案 4 :(得分:0)
如果所有窗口共享一个通用的Url来源,则可以注册ServiceWorker,然后从ServiceWorker访问所有窗口:https://developer.mozilla.org/en-US/docs/Web/API/Clients
AFAIK您将无法将对其他窗口的引用从WorkerService传递到您的窗口,但可以通过以下方式与ServiceWorker建立通信