2

Chromeでウィンドウ/タブを開きます:

childWin = window.open('child.html');

次に、子で関数を呼び出そうとします。

childWin.objReceiver( {foo: 'blah', zoo: 'bing'} );

しかし、Chromeの親で次の2つのエラーが発生します(Firefoxは正常に動作します)。

Unsafe JavaScript attempt to access frame with URL file:///C:/Users/Slava/Documents/AMP/app_poc/test/child.html from frame with URL file:///C:/Users/Slava/Documents/AMP/app_poc/test/index.html#. Domains, protocols and ports must match.
Uncaught TypeError: Property 'objReceiver' of object [object Window] is not a function

お知らせ下さい。

4

1 に答える 1

3

この種のことをテストするときは、実際のWebサーバープロセスからドキュメントを提供する必要があります(つまり、URLはですhttp://...)。ローカルリソース( URL)に適用されるセキュリティポリシーブラウザfile:///...は、Webリソースの同一生成元ポリシーよりも制限が厳しい場合があります。(具体的には、一部のブラウザーは、ローカルファイルを、同じディレクトリ内の別のローカルファイルであっても、どのオリジンとも一致しないものとして扱います。)

単純なWebサーバー(または、必要に応じて複雑なWebサーバー:-))をマシンにインストールするだけです。

もう1つの注意点は、ウィンドウがまだロードされていない可能性があるため、子ウィンドウで関数をすぐに呼び出すことができない可能性があることです。objReceiverしたがって、次のように、子に表示されるのを監視できます。

jQuery(function($) {

  $("#target").click(function() {
    // Open the window
    var wnd = window.open("http://jsbin.com/ofigis/1");

    // Give it a 10th of a second to appear
    display("Window open, waiting for it to appear...");
    setTimeout(watchForWindow, 100);

    // Our function watching for it        
    function watchForWindow() {
      // Is it there?
      if (wnd.objReceiver) {
        // Good, we're done waiting -- send the message
        wnd.objReceiver({
          foo: "blah"
        });

        display("Message sent");
      }
      else {
        // Not there yet, keep waiting...
        setTimeout(watchForWindow, 0);
      }
    }
  });

  function display(msg) {
    $("<p>").html(String(msg)).appendTo(document.body);
  }

});

実例| ソース

(私は便宜上jQueryを使用していますが、基本的なビットはどれもそれに依存していません)

于 2012-11-03T15:07:24.597 に答える