19

我正在尝试通过跨域的 ExternalInterface 启用 Javascript 和 Flash 之间的通信。当 Javascript 位于与 SWF 相同的域中时,它的效果很好。但在一种情况下,HTML 位于域 A 上,javascript 和 flash 都位于域 B 上。我已完成以下所有操作:

  • 嵌入标签有allowScriptAccess="always"(并且对象有它作为参数)
  • 我的 SWF 文件的 actioncipt 有Security.allowDomain("*")
  • 我的 SWF 也调用Security.allowInsecureDomain("*")
  • 域 A 和域 B 都有一个/crossdomain.xml文件allow-access-from domain="*"

SWF 能够在页面上调用 javascript,但是当我使用 Javascript 调用 ExternalInterface 公开的函数时,我得到

在 NPObject 上调用方法时出错![插件异常:Actionscript 中的错误。使用 try/catch 块来查找错误。]

这是 ActionScript 2,因此ExternalInterface.marshallExceptions不可用。

4

6 回答 6

20

你应该只需要两件事就可以了:

1)allowscriptaccess=always将允许您的 swf 将内容发送到页面

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

请注意,它System.security.allowDomain()在 AS2 中 - 它与 AS3 或您上面写的不同。

上面的数字 2 允许 domainA 上的 html 页面调用 domainB 上 swf 中的东西。

你的 js 所在的域在这里无关紧要,因为浏览器将它嵌入到 domainA 中,脚本在 domainA 中执行。

crossdomain.xml 主要仅用于加载远程文件,您没有这样做,因此您可以根据需要将其删除。(而且您可能不希望allow="*"在您的主域上拥有一个 crossdomain.xml 文件,这是非常糟糕的做法)

于 2009-06-28T16:47:00.327 回答
1

由于您正在加载多个 swf,您可能需要在域 B 上加载的每个 swf 中包含安全设置。

您可能还需要具有适当安全设置的加载程序上下文。

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);
于 2009-06-26T15:33:01.263 回答
1

对我来说有几个原因是(我正在使用uploadify):

http 服务器没有权限将文件写入目标 swfobject (flash) 没有跨域访问

解决方案:html中的对象标签必须有allowScriptAccess="always" 可以通过set param来完成

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

可以通过使用此参数编译源来完成,我有,如果您需要它,请使用 uploadify 主题写信给我。比页面中包含 flash 的远程服务器必须在根 crossdamoin.xml 文件中具有以下内容:

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
于 2011-03-25T10:50:45.293 回答
0

将 AS3 与 Flash Player 版本 10 一起使用时,我无法ExternalInterface.addCallback()正常工作以进行本地测试。我终于通过添加值为“all”的参数“allowNetworking”(http://www.adobe.com/livedocs/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp. htm?context=LiveDocs_Parts&file=00001079.html)。祝任何为此苦苦挣扎的人好运!

于 2010-05-05T20:28:10.737 回答
0

我有同样的问题(allowDomain 等很好),但我发送到 flash 错误参数 - 只是从 ajax 调用输出 JSON。问题消失了,当我将该 json 放入“”中,然后将其解析为 javascript 对象(通过 jQuery.parseJSON)。

于 2011-02-04T13:01:33.230 回答
0

就我而言,这是因为我正在修改包含上传器 div 的 DOM 元素。

我使用 jquery hide() 函数来隐藏包含上传器的 div,当我意识到导致上述错误时,我尝试了另一种方法,即设置 div 的“float”属性。在这两种情况下,它都会破坏上传器。

FWIW,似乎将包含上传者的 div 的宽度/高度设置为 0 不会导致错误发生。

于 2011-09-04T22:00:41.043 回答