2012-05-14 28 views
13

子ウィンドウから親に定義されたjavascript関数を呼び出そうとしています。私は、私の人生のために、子プロセスからの関数fooを呼び出すことはできませんJavaScript window.opener parent parent function

<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> 

親::

<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> 

と子私はこのような2つのファイルを持っています。私はこれがwindow.openerオブジェクトで可能であるべきだと思ったが、私はこの作業をすることができない。助言がありますか?

+4

あなたは 'http://'や 'file:///'でこれらのページにアクセスしていますか? 'file'プロトコルには起源がないので、あなたはいつでも[SOP](http://en.wikipedia.org/wiki/Same_origin_policy)に失敗し、' opener'にアクセスできなくなります。 –

+0

それが問題だったことがわかりました。私は単純にfile://にアクセスしていました。私はhttp://ディレクトリにそれらをスローすると、うまく動作します。 – RPIBuckHunter

+0

http://とfile:///とは何ですか?それをどのように変更するか。私は同じ問題を抱えています?助けてください。 –

答えて

16

http://経由でアクセスしていることを確認してください。同じオリジンポリシーが適用され、子供からオープナーにアクセスできます。 file://だけを使用している場合はうまくいきません。

+0

https://では動作しますか? – Muthu

1

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

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

ローカルHTTPサーバーからファイルをロードするには、http://localhost:[port]/[path]のようなアドレスを指定する必要があります。ここで[ポート]はサーバーが稼働しているポート(デフォルトは80)で、[パス]はサーバーのドキュメントルートフォルダを基準にしたファイルのパス。ドキュメントのルートフォルダは、サーバーの構成によって異なります。

このように、同じローカルファイルを2つの方法でブラウザに読み込むことができます。しかし、これらの2つの方法の間には大きな違いがあります。最初のケースでは、ブラウザはファイルをロードするためにHTTPプロトコルを使用しないため、さまざまなメカニズムが適切に動作するために必要な多くのものが欠けています。たとえば、AJAXはHTTPレスポンスステータスが200ではないなど、ローカルファイルでは機能しません。

この特定の例では、ブラウザのセキュリティメカニズムが発信元情報を取得せず、親ウィンドウにアクセスできませんでした。

関連する問題