2009-01-16 66 views
8

如何打開「跨域安全性」,以便頁面上的JavaScript可以與SWF自由通信,即使該域名託管在另一個域上?如何進行JavaScript和Flash之間的跨域通信?

我確定默認情況下阻止了此函數通信,但是通過使用名爲「crossdomain.xml」和actionscript 3函數:system.Security.allowDomain(「*」)的文件進行播放。儘管我沒有取得全面的成功,但我也沒有洞察力知道哪一個人開放了什麼。

是否還有其他隱藏的安全層,我需要考慮在這種情況下?

我是否可以通過這種設置打開潛在黑客的代碼?

(如果您想知道:是的,我的可以在一個場景中進行此項工作,其中html託管在一個域中,JavaScript從另一個域外部添加,並且SWF由來自第三個域的JavaScript - 不要問爲什麼,這太複雜了,不能解釋 - 我也希望我可以將整個東西託管在一個域中)。

回答

17

在SWF中使用Security.allowDomain("www.example.com")將允許來自www.example.com的頁面中的JS通過ExternalInterface.addCallback()調用SWF中公開的函數。域和子域必須完全匹配。使用"*"將允許任何域與SWF進行通信,但是如果您有一個特定的域,最好使用它。

在HTML嵌入代碼中設置allowScriptAccessalways將允許SWF調用JavaScript函數。

捕捉許多開發人員的一件事是,在SWF加載完成之前,JavaScript將無法調用SWF上的函數。不幸的是,沒有基於JS的事件告訴你SWF何時準備好(至少我已經找到了)。我通常爲解決此問題所做的工作是,當SWF完成加載以通知頁面SWF已準備好時,立即從SWF調用JS函數。

這裏和那裏有一些抽象,但如果你看看YUI Charts的源代碼,你可能會弄清楚Yahoo!獲得跨域JS/SWF通信工作。

+0

我一直對什麼似乎像小時搜索,這是迄今爲止我遇到的最好的解釋。謝謝你解釋清楚! – zombat 2011-06-16 17:10:36

+0

非常感謝你 – simo 2014-04-30 05:48:09

1

我將添加到以前的答案的一件事:如果您嘗試上述代碼,並且它不起作用,請檢查您的網站的地址是否包含「www」或不。礦井沒有,沒有,如果我寫它作爲

Security.allowDomain("www.jeremy-knight.com"); 

我需要把它寫成工作:

Security.allowDomain("jeremy-knight.com"); 
相關問題