JavaScript与Flash通信

8

我正在尝试从Javascript调用Actionscript函数,但在Internet Explorer中遇到了问题。我正在使用Mootools 1.2.1中的Swiff.remote来调用Actionscript函数,例:

Swiff.remote(playSwf.toElement(), 'sendResult', result, plays, name);

在FireFox、Safari和Opera中,这一切都运行正常,但在Internet Explorer 6和7中出现了“未指定”错误。 我已经尝试使用标准方法:
window['flash'].sendResult(result, plays, name);

无济于事。

感谢任何帮助。 马克

6个回答

5
我不熟悉Swiff插件,但您无需插件即可从Javascript调用flash函数。甚至可以更轻松地进行本机操作。
来自AS:
//1. calling javascript function from Flash.
ExternalInterface.call("sendData",tempStr);
// argument 1: javascript function, argument 2: data/variables to pass out.
//2. calling javascript function from Flash with recursion.
var returnValue:String = ExternalInterface.call("sendReturn",tempStr).toString();
//3. setting up a callback function for javascript
ExternalInterface.addCallback("callFlash",flashResponse);
// argument 1: function name called by javascript, argument 2: function on the Flash side.
// AS2 version looks like this : ExternalInterface.addCallback("callFlash",null,flashResponse);

来自JS:

//1. javascript function as called from Flash.
function sendData(val){
    alert(val);
    document.flashForm.flashOutput.value = val;
}

//2. javascript function with recursion.
function sendReturn(val){
    var tempData = "Hello from JS";
    return tempData + ' :return';
}

//3. calling Flash function with javascript.
function sendToFlash(val){
    window['flash'].callFlash(val);
}

这就是我尝试的方法:window['flash'].sendResult(result, plays, name);你是如何引用你的Flash对象的?window ['flashname/flashid'] - Kevin Dente
当然,使用IE可能有不同的方法来获取它。也许像window.document.name这样的方式...不太确定。 - picardo
尝试使用 window.document.getElementsByName('flashname')。 - picardo
不必使用 window 对象来引用 Flash,可以通过 ID 直接引用:http://work.arounds.org/calling-flash-functions-javascript/ - meder omuraliev

2
啊,这里是你问题的答案。
<form>
    <input type="button" onclick="callExternalInterface(id)" value="Call ExternalInterface" />
</form>
<script>
function callExternalInterface(id) {
    thisMovie("externalInterfaceExample").callAS(id);
}

function thisMovie(movieName) {
    if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[movieName]
    }
    else {
        return document[movieName]
    }
}
</script>

所以如果客户端是Internet Explorer,你应该从文档对象中获取电影。:-)


你遇到了什么错误?这个解决方案似乎很合理,我想知道是否有其他因素导致了你的问题。 - discorax

0

0
如果你的代码在所有浏览器中都能正常工作,除了Internet Explorer,那么很可能是因为IE的Flash Player是一个ActiveX插件。我曾经在某个地方读到过,ActiveX使用.NET格式进行通信,而Flash的外部API则使用XML进行通信。
我还在尝试学习如何在Internet Explorer上实现Javascript-Flash通信,所以我会及时向大家报告我的学习成果。

0

想要发布这个答案,因为这可能是其他人遇到问题的原因,显然这不会导致你的问题。仍在寻找解决方案。

来自 MooTools 文档:http://mootools.net/docs/Utilities/Swiff 注意:

SWF 文件必须使用 ExternalInterface 组件进行编译。有关更多信息,请参阅 Adobe 的 External Interface 文档。

Action Script 2.0

import flash.external.*;

动作脚本 3.0

package com
{
   import flash.external.ExternalInterface;
   public class Main 
   {
   }
}

0

你可以直接调用它:

playSwf.remote('sendResult', result, plays, name)

当然,sendResult 必须在 AS 代码中注册到 ExternalInterface.addCallback() 中,并且 Flash 文件必须完全加载(否则所有调用都会失败)。

可以在此 GitHub 存储库 (fancyupload) 中找到示例:as3proj 包含 AS 源代码,JS 远程调用位于 Swiff.Uploader.js 中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接