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://...)。应用于本地资源(您的file:///...URL)的安全策略浏览器可能比 Web 资源的同源策略更具限制性。(特别是:某些浏览器将本地文件视为不匹配任何来源,甚至同一目录中的另一个本地文件。)

只需在您的机器上安装一个简单的 Web 服务器(或复杂的,如果您愿意 :-) )。

另一件需要注意的是,您可能无法立即在子窗口上调用函数,因为该窗口可能尚未加载。所以你可以观察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 回答