2012-11-03 80 views
2

我在Chrome中打開一個窗口/標籤:鍍鉻通話功能不起作用

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

然後我打電話在孩子的函數:

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

,但我得到在Chrome父項(Firefox工作正常)中出現以下2個錯誤:

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 

請指教。

+0

BTW:如何問一個問題很好的例子:簡潔,顯示代碼,顯示實際的錯誤信息。而且因爲*你顯示了實際的錯誤信息,所以我能夠快速識別問題。 +1,很好地完成。 –

回答

3

測試此類事情時,您想要從真實的Web服務器進程(因此URL爲http://...)提供文檔。安全策略瀏覽器適用於本地資源(您的file:///...網址)可能比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); 
    } 

}); 

Live Example | Source

(我使用jQuery那裏只是爲了方便,沒有根本的比特依賴它)

+0

這很糟糕,因爲我想要簡單的方法。哦,會的。 – SBel

+0

@SBel:這很糟糕,你使用的是Windows,因爲如果你使用的是\ * nix,我會說你可能已經安裝了Python,如果你這樣做,你可以從終端運行這個命令:'python -m SimpleHTTPServer '。它從當前目錄運行一個非常非常簡單的Web服務器。當然,如果你喜歡的話,你可以在Windows上安裝Python ...或者其他任何一臺微型Web服務器。 –