1

AがBとCを開くとしましょう.次に、子ウィンドウの1つ(Bとしましょう)で、別のウィンドウを開きます(Dとします)。さて、この新しいウィンドウ (D) で、C のオブジェクトにアクセスして、そのウィンドウが開いているか閉じているかを確認します。

JavaScriptでそれを行うことはできますか?

window.open と window.opener を使用して渡すことができることは知っていますが、それはブラウザー ウィンドウに親子関係がある場合にのみ機能します。しかし、私の場合、これは起こっていません。

どんな助けでも本当にかなりの価値があります。

4

2 に答える 2

3

はい、できます。ページ A が次のようにウィンドウ B と C を開くとします。

var b = window.open("childB.html", "_blank");
var c = window.open("childC.html", "_blank");

次に、bページであるウィンドウchildB.htmlがwindowdで開きますd

var d =  window.open("childD.html", "_blank")

あなたのJavaScriptコードでは、コードをchildD.html配置することができます:

var propC = opener.opener.c.propertyOfC;

opener.openerは元のウィンドウ A を参照.cし、そのすべてのオブジェクトを参照できます。

ウィンドウ/プロパティの存在のチェックを追加する必要があります (ほとんどの場合、try/catch が適切です)。

于 2013-06-13T18:27:24.337 に答える
1

これは、プレーンな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;

}

使用する

  1. すべてのページの head セクションに window_manager.js スクリプトを含めます。
  2. すべてのウィンドウに一意の名前を付けます: window.name='someUniqueName';
  3. 子ウィンドウを開くには、openWindow('theWindowname', 'someURL', 'windowFeatures') 関数を使用します。
  4. 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 が返されるようになりました。

于 2013-06-13T20:17:14.580 に答える