web-dev-qa-db-ja.com

既に開いているすべての子ウィンドウの参照を取得する方法

すでに開いているすべての子ウィンドウの参照を取得したい。何か方法はありますか?私はchild = window.open(....)を使用しておらず、window.open(....)を使用して複数の子ウィンドウを開いています。

現在のコードを変更したくない場合は、単にwindow.open()関数をオーバーライドできます。

_var openedWindows = [];
window._open = window.open; // saving original function
window.open = function(url,name,params){
    openedWindows.Push(window._open(url,name,params));
    // you can store names also...
}
_

window.open()を呼び出す前にこのコードを実行してください。開かれたウィンドウへのすべての参照は、openedWindows配列に格納されます。どこにでもアクセスできます

57

ウィンドウの名前を知らない限り、私はあなたができるとは信じていません。 (それらの名前がわかっている場合は、window.open("", "name")を使用してそれらへの参照を取得できます。)

もちろん、より良いオプションは、最初にwindow.openから返された参照を覚えておくことです—しかし、あなたはそれを知っています。 :-)

17
T.J. Crowder

OK、この質問への回答をOracle CRM onDemandで使用して、親ウィンドウからスクリプトを実行するポップアップウィンドウでの選択を無効にしました。 (ポップアップウィンドウの生成は制御できません。アプリケーションフレームワークによって開かれます)

私がそれをどのようにしたか見てみましょう:

Context:詳細ページで、虫眼鏡アイコンをクリックして情報を追加できます>>>検索フォームを含む新しいウィンドウが開きますが、選択すると管理者の邪魔になります:ユーザーが変更した場合そのデフォルト値は彼/彼女は禁止されたレコードへのアクセスを取得します!!何てことだ!

最初のアプローチ:今選択を無効にします!!

Attempt:ブラウザの開発ツール(F12)で画像のonclick属性を見つけました。 openAssocPopupメソッドがあり、子ウィンドウの名前がわかった: 'OccamPopup1' :)

はい!それでは、いくつかの魔法(親ウィンドウで実行)を実行してみましょう。

window.open("","OccamPopup1").document.getElementById("frmSearch.AQ").setAttribute("disabled", true);

この質問は私にも役立ったので、これは役立つと思います。あなたは正しかった。ここで、子のドキュメントオブジェクトを親のjQueryオブジェクト内にラップして、子のDOM全体にアクセスできるようにします...これは別の話です...

接頭辞とカウンターを使用してウィンドウに名前を付けるのが最善です。

名前付きウィンドウ(つまり、CBCheckout)が既に開いているかどうかを検出する必要があり、これを使用しました:

var signupWindow = window.open('','CBCheckout','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=1,height=1');
try {
    if (signupWindow.document.location.href == "about:blank") {
        signupWindow.close();
        signupWindow = undefined;
    }
} catch (e) { }

これにより、名前付きの開いているウィンドウへの参照が再取得されました。存在しない場合は、小さなウィンドウのポップアップが1秒間表示されます。

ウィンドウの可能な名前がわかっている場合は、名前を順番に調べて、ウィンドウの位置を特定することができます。

0
Derek Wade