2009-06-24 72 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不会使错误发生。

相关问题