跨域ExternalInterface“NPObject上的错误调用方法”

时间:2009-06-24 14:17:27

标签: javascript flash actionscript-2 externalinterface

我正在尝试通过跨域的ExternalInterface启​​用Javascript和Flash之间的通信。当Javascript与SWF位于同一域时,它可以很好地工作。但在一个案例中,HTML驻留在域A上,javascript和flash都驻留在域B上。我已经完成了以下所有操作:

  • embed标记有allowScriptAccess="always"(对象将其作为参数)
  • 我的SWF文件的actionscipt有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不可用。

6 个答案:

答案 0 :(得分:20)

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

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

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

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

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

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

crossdomain.xml主要用于加载你没有做的远程文件,所以你可以删除它,如果你愿意的话。 (你可能不希望在你的主域上有一个allow="*"的crossdomain.xml文件,这是非常糟糕的做法)

答案 1 :(得分: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);

答案 2 :(得分:1)

对我来说有一些原因(我正在使用uploadify):

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

溶液: html中的object标签必须有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">

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

在我的情况下,这是因为我正在修改包含上传器div的DOM元素。

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

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