我们有以下情况,从单个域运行:
页面 A 用于window.open()
打开命名窗口(弹出播放器)。window.open()
为页面 A 提供对窗口的引用。
用户现在重新加载页面 A。对命名窗口的引用丢失。使用window.open()
“查找”窗口具有重新加载它的不幸副作用(不受欢迎)。有没有其他方法可以参考这个窗口?
我们有以下情况,从单个域运行:
页面 A 用于window.open()
打开命名窗口(弹出播放器)。window.open()
为页面 A 提供对窗口的引用。
用户现在重新加载页面 A。对命名窗口的引用丢失。使用window.open()
“查找”窗口具有重新加载它的不幸副作用(不受欢迎)。有没有其他方法可以参考这个窗口?
试试这个:
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 为空白,因此不会重新加载窗口的内容。
AFAIK,不,没有..
一种肮脏但我猜它会起作用的技巧是使用 window.opener 从弹出窗口中定期重置父窗口上的引用,代码如下:
设置间隔(函数(){ 如果(window.opener){ window.opener.document.myPopupWindow = 窗口 } }, 100)
在父窗口中,您将能够访问 document.myPopupWindow,即使在重新加载之后(嗯,重新加载后 100 毫秒)。这应该跨浏览器工作。
实际上,您所做的是销毁创建的窗口(弹出窗口)的父级(页面 A),因此它不再引用原始父级,因此您无法获得直接引用。
我能想到的唯一解决方案是使用一种浏览器,该浏览器为您提供添加的 javascript 功能来循环浏览活动窗口(选项卡)并找到一个具有特殊属性的浏览器(即:您重新加载的页面 A),该属性可以被弹出窗口识别。
不幸的是,我猜只有 Firefox 有一些额外的功能或扩展,可以为您提供这种灵活性。(虽然这也是一个安全风险)
这应该有效。在弹出窗口中添加此代码:
function updateOpener() {
if (window.opener)
window.opener.document.myPopupWindow = window;
else
setTimeout(updateOpener, 100);
}
updateOpener();
这在父窗口的加载中。要确保 myPopupWindow 已设置,请等待 100 毫秒后再访问它。
setTimeout(function() {
if (document.myPopupWindow)
document.myPopupWindow.focus();
}, 100);
如果所有窗口共享一个共同的 Url 来源,您可以注册一个 ServiceWorker,然后从 ServiceWorker 访问所有窗口:https ://developer.mozilla.org/en-US/docs/Web/API/Clients
AFAIK 您将无法将 WorkerService 对其他窗口的引用传递到您的窗口,但您可以通过以下方式与 ServiceWorker 建立通信