2009-06-24 58 views
19

我試圖通過域間的ExternalInterface啓​​用Javascript和Flash之間的通信。當它與SWF位於同一個域中時,Javascript的效果很好。但是,在一個案例中,HTML駐留在域A中,JavaScript和閃光燈都駐留在域B.我已經做了所有的以下內容:Cross Domain ExternalInterface「NPObject上的錯誤調用方法」

  • embed標記有allowScriptAccess="always"(和對象有作爲PARAM)
  • 我的SWF文件的actionscipt有Security.allowDomain("*")
  • 我的SWF還呼籲Security.allowInsecureDomain("*")
  • 兩個域A與域B有一個/crossdomain.xml文件,它具有allow-access-from domain="*"

的SWF能夠調用頁面上的JavaScript,但是當我使用JavaScript來調用由ExternalInterface的曝光功能,我得到

Error calling method on NPObject! [plugin exception: Error in Actionscript. Use a try/catch block to find error.]

這是ActionScript 2的這樣ExternalInterface.marshallExceptions不可用。

+0

您是否加載了多個swf?或者是域A上的swf(帶有HTML)加載域B上的swf? – 2009-06-24 18:10:50

+0

亞歷克斯 - 好點,我沒有提到這一點。來自域B的JavaScript從域B加載SWF,並且該SWF從域B加載第二個SWF。此加載似乎可行,但我無法確定,因爲我無法與SWF交互。 – Josh 2009-06-24 18:14:00

回答

20

你應該只需要這兩樣東西的工作:

1)allowscriptaccess=always將讓您的SWF送東西出來的頁面

2)System.security.allowDomain("yourhtmldomain.com");

請注意,這是在AS2中的System.security.allowDomain() - 與AS3或上面寫的不一樣。

上面的數字2允許domainA上的html頁面在domainB上的swf中調用事物。

您的js託管的域名在這裏並不重要,因爲瀏覽器將其嵌入到domainA中,該腳本在domainA中執行。

crossdomain.xml主要僅用於加載遠程文件,而您並未執行此操作,因此如果您願意,可以將其刪除。 (並且您可能不希望在您的主域中有allow="*"的crossdomain.xml文件,這是非常糟糕的做法)

+1

奇怪的事情。我的SWF和JS/HTML都在同一頁面上,但這個異常仍然存在:( – DataGreed 2011-04-05 11:30:39

1

由於您正在加載多個swfs,因此您可能需要在加載的域B中的每個swfs中包含安全設置。

您可能還需要具有相應安全設置的加載程序上下文。

import flash.system.LoaderContext; 
import flash.system.ApplicationDomain; 
import flash.system.Security; 
import flash.system.SecurityDomain; 
import flash.net.URLRequest; 
import flash.net.URLLoader; 

var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain, (Security.sandboxType == Security.REMOTE) ? SecurityDomain.currentDomain : null); 
var l:Loader = new Loader(); 
l.load(new URLRequest("http://example.com/myswf.swf"), context); 
+0

嗨,我有同樣的問題,每當我試圖在安全域中輸入NULL以外的東西時,我得到一個錯誤:錯誤#2114:參數LoaderContext.securityDomain必須爲空。 有什麼建議嗎? – 2010-11-11 15:37:15

0

我有這個相同的問題(allowDomain等很好),但我發送閃光壞參數 - 只是從ajax調用輸出JSON。問題不復存在,當我把這個json放入「」,然後解析成javascript對象(通過jQuery.parseJSON)。

1

我幾個原因是(我使用uploadify):

http服務器沒有權限寫入文件到目標 swfobject的(閃光燈)沒有跨域訪問

的解決方案:在HTML 對象標記必須具有的allowScriptAccess =「總是」,可以通過設置PARAM喜歡做

$('#file_upload').uploadifySettings('scriptAccess', 'always') 
than flash object must have: 
import flash.system.Security; 
Security.allowDomain('remotedomain.com'); 

它可以通過這個PARAM編譯源來完成,我有,如果你需要它寫信給我, uploadify 學科。 比遠程服務器,閃存在頁面中包含,必須在根crossdamoin.xml文件中包含的內容:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
0

對我來說,那是因爲我修改包含上傳DIV的DOM元素。我使用jquery hide()函數來隱藏包含上傳器的div,當我意識到導致上述錯誤時,我嘗試了一種不同的方法,在其中設置div的「float」屬性。在這兩種情況下,它都破壞了上傳者。

FWIW,似乎將包含上傳器的div的寬度/高度設置爲0不會使錯誤發生。

相關問題