web-dev-qa-db-ja.com

window.openによって以前に開かれたウィンドウを検索します

単一のドメインから実行されている次の状況があります。

ページAはwindow.open()を使用して、名前付きウィンドウ(ポップアッププレーヤー)を開きます。 window.open()は、ページAにウィンドウへの参照を提供します。

ユーザーはページAをリロードします。指定されたウィンドウへの参照は失われます。 window.open()を使用してウィンドウを「検索」すると、ウィンドウをリロードするという不幸な副作用が発生します(望ましくありません)。このウィンドウへの参照を取得する他の方法はありますか?

22
spender

これを試して:

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が空白であるため、ウィンドウのコンテンツは再読み込みされません。

25
awe

AFAIK、ありません。

一種の汚いが、それはうまくいくハックは、次のようなコードで、window.openerを使用して、ポップアップ内から親ウィンドウの参照を定期的にリセットすることです。

 
 setInterval(function(){
 if(window.opener){
 window.opener.document.myPopupWindow = window 
} 
}、100)
 

親ウィンドウでは、リロード後(リロード後100ms)でもdocument.myPopupWindowにアクセスできます。これはクロスブラウザで動作するはずです。

1

これはうまくいくはずです。ポップアップに次のコードを追加します。

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);
0
Johan

実際に行ったことは、作成されたウィンドウ(Popup)の親(ページA)を破棄することです。そのため、元の親への参照がなくなり、直接参照を取得できなくなります。

私が考えることができる唯一の解決策は、アクティブなウィンドウ(タブ)を循環してポップアップによって認識される特別なプロパティ(つまり、リロードされたページA)を持つものを見つけるための追加のjavascript機能を提供するブラウザを使用することです。

残念ながら、この柔軟性を提供する機能や拡張機能が追加されているのはFirefoxだけだと思います。 (ただし、セキュリティリスクでもあります)

0
OverLex

すべてのウィンドウが共通のURLオリジンを共有している場合は、ServiceWorkerを登録してから、ServiceWorkerからすべてのウィンドウにアクセスできます。 https://developer.mozilla.org/en-US/docs/Web/API/Clients ==

AFAIK他のウィンドウへの参照をWorkerServiceからウィンドウに渡すことはできませんが、ServiceWorkerとの通信を確立することはできます。

0
Gleba