ExternalInterface.call有效,但javascript无法访问actionscript回调?

时间:2013-08-18 10:17:00

标签: javascript actionscript-3 actionscript

在网页中,javascript& as3的设置如下:

  1. Javascript在页面中加载swf。
  2. swf调用ExternalInterface.call("javascriptFunctionName", "");
  3. Javascript的javascriptFunctionName()使用由ExternalInterface.addCallback设置的actionscript函数
  4. 目前,javascriptFunctionName()首先检查它是否可以访问actionscript的回调函数。

    这项检查是否必要?或者,actionscript设法调用javascript函数的事实是否表明授予了访问权限?

    编辑:更具体地说,我的代码有效。我担心它可能放在具有不同权限的第三方页面中。

2 个答案:

答案 0 :(得分:8)

对于具有不同安全要求的JavaScript / Flash通信,有几种不同的方案。

  • SWF和HTML的协议和域匹配。

    JavaScript可以与Flash通信。

    如果参数allowScriptAccess设置为"sameDomain"(默认)或"always",则Flash可以与JavaScript通信。

    例如,http://example.com/a.swf上载有http://example.com/a.html

  • SWF和HTML的域名不同。

    如果从Flash调用Security.allowDomain(exactDomain)Security.allowDomain('*'),则JavaScript可以与Flash通信。

    如果参数allowScriptAccess设置为"always"

    ,Flash可以与JavaScript通信

    例如,http://swf.example.com/a.swf上载有http://example.com/a.html

  • SWF通过HTTPS提供,但HTML是通过HTTP提供的。

    如果从Flash调用Security.allowInsecureDomain(exactDomain)Security.allowInsecureDomain('*'),则JavaScript可以与Flash通信。

    如果参数allowScriptAccess设置为"always"

    ,Flash可以与JavaScript通信

    例如,https://example.com/a.swf上载有http://example.com/a.html

要回答您是否有必要检查通信是否正常的问题,如果您想立即显示错误消息,答案可能是肯定的。无论哪种方式,我都会在双方的每次通话中使用try..catch

答案 1 :(得分:2)

JS到AS3和AS3到JS是不同的行为,因为它在一个方向上工作,并不意味着它在相反的方向上工作。

要允许JS在SWF中调用AS3方法,您需要通过调用ExternalInterface.addCallback来注册每个AS3方法 - 对于您希望从JS调用的每个AS3方法一次。

假设你有一个像这样的AS3方法:

function myFunction(value:String):void
{
    //do something here
}

首先需要注册:

//first parameter is name of function to use in JS.
//second parameter is the AS3 function itself.
ExternalInterface.addCallback("myAS3function", myFunction);

然后你可以从JS调用它;例如:

document.getElementById('mySWF').myAS3function("Hello World");