ポップアップ ブラウザ ウィンドウを生成するページがあります。親ブラウザ ウィンドウに JavaScript 変数があり、それをポップアップ ブラウザ ウィンドウに渡したいと考えています。
これを行う方法はありますか?同じブラウザ ウィンドウ内の複数のフレームでこれを実行できることはわかっていますが、複数のブラウザ ウィンドウで実行できるかどうかはわかりません。
ポップアップ ブラウザ ウィンドウを生成するページがあります。親ブラウザ ウィンドウに JavaScript 変数があり、それをポップアップ ブラウザ ウィンドウに渡したいと考えています。
これを行う方法はありますか?同じブラウザ ウィンドウ内の複数のフレームでこれを実行できることはわかっていますが、複数のブラウザ ウィンドウで実行できるかどうかはわかりません。
問題にコードを入れると、親ウィンドウからこれを行うことができます:
var thisIsAnObject = {foo:'bar'};
var w = window.open("http://example.com");
w.myVariable = thisIsAnObject;
またはこれを新しいウィンドウから:
var myVariable = window.opener.thisIsAnObject;
私は後者を好みます。新しいページがロードされるのを待つ必要があり、その要素にアクセスしたり、必要なものにアクセスしたりできるからです。
ウィンドウが同じセキュリティ ドメインからのものであり、他のウィンドウへの参照がある場合は、はい。
Javascript の open() メソッドは、作成されたウィンドウ (または、既存のウィンドウを再利用する場合は既存のウィンドウ) への参照を返します。このような方法で作成された各ウィンドウは、それを作成したウィンドウを指す「window.opener」に適用されるプロパティを取得します。
次に、DOM (セキュリティ依存) を使用して、もう一方のプロパティ、またはそのドキュメント、フレームなどにアクセスできます。
はい、スクリプトは、ハンドルを持つ同じドメイン内の他のウィンドウのプロパティにアクセスできます (通常、window.open/opener および window.frames/parent によって取得されます)。通常、変数を直接いじるよりも、他のウィンドウで定義された関数を呼び出す方が扱いやすいです。
ただし、ウィンドウは終了または移動する可能性があり、ブラウザーはその場合に異なる方法で処理します。ウィンドウを呼び出す前に、ウィンドウ (a) がまだ開いている (!window.closed) こと、および (b) 必要な機能が利用可能であることを確認してください。
文字列のような単純な値は問題ありませんが、一般に、関数、DOM 要素、クロージャなどの複雑なオブジェクトをウィンドウ間で渡すことはお勧めできません。子ウィンドウがそのオープナーからのオブジェクトを格納すると、オープナーが閉じ、そのオブジェクトが (IE などの一部のブラウザーで) 'dead' になるか、メモリ リークが発生する可能性があります。奇妙なエラーが発生する可能性があります。
ウィンドウ間で変数を渡す (ウィンドウが同じドメインにある場合) は、次の方法で簡単に実行できます。
「親」ウィンドウから「子」ウィンドウにメッセージを渡すことができます。
「親ウィンドウ」で子を開きます
var win = window.open(<window.location.href>, '_blank');
setTimeout(function(){
win.postMessage(SRFBfromEBNF,"*")
},1000);
win.focus();
文脈に応じて置き換えられる
「子供」では
window.addEventListener('message', function(event) {
if(event.srcElement.location.href==window.location.href){
/* do what you want with event.data */
}
});
if テストはコンテキストに応じて変更する必要があります
親ウィンドウで:
var yourValue = 'something';
window.open('/childwindow.html?yourKey=' + yourValue);
次に、childwindow.html で:
var query = location.search.substring(1);
var parameters = {};
var keyValues = query.split(/&/);
for (var keyValue in keyValues) {
var keyValuePairs = keyValue.split(/=/);
var key = keyValuePairs[0];
var value = keyValuePairs[1];
parameters[key] = value;
}
alert(parameters['yourKey']);
キーと値のペアの解析では、多くのエラー チェックを行う必要がある可能性がありますが、ここには含めません。おそらく、誰かが後の回答でより包括的な Javascript クエリ文字列解析ルーチンを提供できるでしょう。
はい、両方のウィンドウが同じドメインにある限り可能です。window.open() 関数は、新しいウィンドウへのハンドルを返します。子ウィンドウは、DOM 要素「opener」を使用して親ウィンドウにアクセスできます。
window.name
ウィンドウ間のデータ転送として使用でき、クロスドメインでも機能します。公式にはサポートされていませんが、私の理解では、実際にはクロスブラウザーで非常にうまく機能します。
または、それを URL に追加して、スクリプト言語 (PHP、Perl、ASP、Python、Ruby など) に反対側で処理させることもできます。何かのようなもの:
var x = 10;
window.open('mypage.php?x='+x);
新しく開いたウィンドウに引数を渡すのに苦労しました。
これが私が思いついたものです:
function openWindow(path, callback /* , arg1 , arg2, ... */){
var args = Array.prototype.slice.call(arguments, 2); // retrieve the arguments
var w = window.open(path); // open the new window
w.addEventListener('load', afterLoadWindow.bind(w, args), false); // listen to the new window's load event
function afterLoadWindow(/* [arg1,arg2,...], loadEvent */){
callback.apply(this, arguments[0]); // execute the callbacks, passing the initial arguments (arguments[1] contains the load event)
}
}
呼び出しの例:
openWindow("/contact",function(firstname, lastname){
this.alert("Hello "+firstname+" "+lastname);
}, "John", "Doe");
実際の例
はい、ブラウザはすべての参照をクリアします。ウィンドウ用。そのため、メイン ウィンドウで何かの ClassName を検索するか、Cookie を Javascript 自家製 ref として使用する必要があります。
プロジェクトページにラジオがあります。そして、ポップアップウィンドウで開始されるラジオをオンにし、メインページのメインウィンドウリンクを制御して再生ステータスを表示します。FFでは簡単ですが、MSIEではそれほど簡単ではありません。しかし、それは可能です。
window.open() 関数は、作成されたウィンドウへの参照があれば、それが同じドメイン上にある場合にもこれを許可します。変数がサーバー側で使用される場合は、$_SESSION 変数を使用する必要があります (PHP を使用していると仮定します)。