web-dev-qa-db-ja.com

JavaScript window.opener call parent function

子ウィンドウから親で定義されたjavascript関数を呼び出そうとしています。次のような2つのファイルがあります。

親:

<html>
<head>
<title>Test</title>
<script type="text/javascript">
function foo () {
alert ("Hello from parent!");
}
function doStuff () {
var w = window.open("testa.html");
}
</script>
</head>
<body>
<input type="button" value="open" onClick="doStuff();" />
</body>
</html>

そして子:

<html>
<head>
<title>Test A</title>
<script type="text/javascript">
function get() {
window.opener.foo();
}
</script>
</head>
<body>
<input type="button" value="Call Parent" onClick="get();" />
</body>
</html>

私は一生、子プロセスから関数fooを呼び出すことはできません。これはwindow.openerオブジェクトで可能になるはずだと思っていましたが、この作業を行うことはできません。助言がありますか?

15
RPIBuckHunter

Same Originポリシーがパスし、子からオープナーにアクセスできるように、http://経由でこれにアクセスしていることを確認してください。 file://を使用しているだけでは機能しません。

16
Joseph

ラーフルの質問に答える:

すべてのブラウザは、サーバーまたはローカルファイルシステムからページをロードできます。ローカルファイルシステムからファイルをロードするには、ブラウザに次のようなアドレスを入力する必要がありますfile://[path]、[path]はファイルシステム内のファイルへの絶対パスです(Windowsのドライブ文字を含む、 http://blogs.msdn.com/b/ie/archive/2006/12/06/を参照) file-uris-in-windows.aspx 詳細については)。

ローカルHTTPサーバー(ある場合)からファイルをロードするには、次のようなアドレスを指定する必要がありますhttp://localhost:[port]/[path]、[port]はサーバーが実行されているポート(デフォルトは80)、[path]はサーバーのドキュメントルートフォルダーに相対的なファイルのパスです。ドキュメントルートフォルダーは、サーバーの構成によって異なります。

したがって、ご覧のとおり、同じローカルファイルを2つの方法でブラウザにロードできます。ただし、これら2つの方法には大きな違いがあります。前者の場合、ブラウザはファイルの読み込みにHTTPプロトコルを使用しないため、さまざまなメカニズムが適切に機能するために必要な多くの要素が欠落しています。たとえば、AJAXは、HTTP応答ステータスが200ではないため、ローカルファイルでは機能しません。

この特定の例では、ブラウザのセキュリティメカニズムがOrigin情報を取得せず、親ウィンドウへのアクセスを妨げていました。

1
joutsen