これは、プレーンなjavascript(別名ライブラリなし)を使用した実用的なソリューションです。
このスクリプトを新しい空のファイルにコピーし、window_manager.js というファイル名を付けます。
var windows = {};
function openWindow(url, name, features) {
windows[name] = window.open(url, name, features);
return windows[name];
}
function closeWindow(name) {
var window = windows[name];
if(window) {
window.close();
delete windows[name];
}
}
function is_window_open(windowName, checkparents){
// check to see if windowName is itself
if(window.name == windowName){
// it's me!
return true;
}
if(checkparents == true){
// check to see if windowName is a direct parent of this window
if (window.opener != null && !window.opener.closed){
// there is an open parent window but is it the one we are looking for?
if(window.opener.name == windowName){
// it's our parent and it is still open
return true;
}
// it's not but let's ask our parent about the window we are looking for
if(opener.is_window_open(windowName, true)){
return true;
}else{
return false;
}
}
}
// check to see if windowName is a direct child of this window
if (windowName in windows){
// this window was opened by this browser but is this window still open?
if(windows[windowName].open && (!windows[windowName].closed)){
// yes this window is open
return true;
}
}
// ask all our children to check their children, etc..
for (var childWindow in windows) {
if (windows.hasOwnProperty(childWindow)) {
// when asking children we dont want them asking the parents, that would be an ugly recursive loop
if(windows[childWindow].is_window_open(windowName, false)){
return true;
}
}
}
// got nobody left to ask
return false;
}
使用する
- すべてのページの head セクションに window_manager.js スクリプトを含めます。
- すべてのウィンドウに一意の名前を付けます: window.name='someUniqueName';
- 子ウィンドウを開くには、openWindow('theWindowname', 'someURL', 'windowFeatures') 関数を使用します。
- is_window_open('windowNameToCheckFor', true) 関数を使用して、特定のウィンドウが開いているかどうかを確認します
この関数は、指定されたウィンドウ名の存在を探して親チェーンを再帰的に走査します。各レベル (それ自体も) で、指定されたウィンドウ名を探して、すべての子とその子の子などを走査します。最終結果は、true (名前付きウィンドウが開いている場合) または false (ウィンドウが閉じているか存在しない場合) を取得することです。
デモ/テスト用に作成したテスト html ファイルの HTML コードをコピーできないため、次のペーストビンに配置します:ペーストビン テスト ファイル コード
ペーストビンにあるコードを使用して、a.htm、b.htm、c.htm、および d.htm の 4 つの html ファイルをすべて作成します。a.htm を参照すると、ウィンドウ b と c が開きます。ウィンドウ b はウィンドウ d を開きます。ウィンドウ d はウィンドウ c をチェックし、True を返します。ウィンドウ c を閉じて、ウィンドウ d を更新します。c が開かれていないため、false が返されるようになりました。