原文:https://www.imququ.com/post/39.html

Flash已经提供了ExternalInterface接口与JavaScript通信,ExternalInterface有两个方法,call和addCallback,call的作用是让Flash调用js里的方法,addCallback是用来注册flash函数让js调用。下面是官方文档对call和addCallback的说明:

利用 ActionScript,可以在 HTML 页上执行以下操作:

  • 调用任何 JavaScript 函数。
  • 传递任意数量、具有任意名称的参数。
  • 传递各种数据类型(Boolean、Number、String 等等)。
  • 接收来自 JavaScript 函数的返回值。

通过在 HTML 页上使用 JavaScript,可以:

  • 调用 ActionScript 函数。
  • 使用标准的函数调用表示法传递参数。
  • 将值返回给 JavaScript 函数。

实际使用的时候,需要注意以下两点:

一、调用时机。js调用flash对象提供的函数时,可能swf还没有完全加载完,此时调用会失败。类似的,flash调用js函数时,也存在js函数还没load到的情况。所以adobe官方示例里采用了一种比较绕的逻辑来避免这种问题:

  • 页面上有一个变量_isJSReady,初始为false。还有一个isJSReady函数用来返回_isJSReady的值,供flash调用。在合适的时机(例如:window.onload),将_isJSReady设置为true,表示flash可以使用js里的函数了;
  • flash里有一个定时器,定期(例如:100ms)去调用页面上的isJSReady方法,直到isJSReady返回true,就可以addCallback,调用页面上的flashReadyHandler方法,通知页面可以跟flash交互了。

二、如何获取flash对象。将flash插入到页面有很多方法,例如swfobject.js或者AC_RunActiveContent.js类似的库。我们来看一种最原始的方法,直接在html插入标记来插入flash:

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs
/flash/swflash.cab#version=10,0,0,0" width="730" height="520" id="test" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="test.swf" />
<param name="quality" value="high" />
<param name="bgcolor" value="#ffffff" />
<embed src="test.swf" quality="high" bgcolor="#ffffff"
width="730" height="520" name="test" align="middle"
allowScriptAccess="always" allowFullScreen="false"
type="application/x-shockwave-flash"
pluginspage="http://www.adobe.com/go/getflashplayer_cn"
/>
</object>

假设test.swf提供了hello的方法,我们来在js里调用这个方法,代码如下:

document.getElementById("test").hello();

结果,除了IE之外,其他浏览器都不会工作,会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现:在非IE浏览器里,flash提供的方法是加在embed上的,我们要得到object下的embed对象,调用embed上的方法才会成功!

官方示例是采用下面方法获取flash对象的:

function getFlashMovieObject(movieName){
if (window.document[movieName]){
return window.document[movieName];
}else if (navigator.appName.indexOf("Microsoft")==-1){
if (document.embeds && document.embeds[movieName])
return document.embeds[movieName];
}else{
return document.getElementById(movieName);
}
}

这里罗列出所有情况,当然不会有问题。其实,没必要弄得这么复杂,我们给object和embed取不同名称,例如一个test1,一个test2,如果是IE就getElementById(“test1”),其它浏览器getElementById(“test2”)就行了。另外,如果使用js插入swf的话,很可能js里就已经做过判断,根据不同浏览器来输出object和embed其中一种。总之,如果调用失败,首先检查得到的flash对象是不是[object HTMLEmbedElement]。

最后,放上一个例子,是我参照官方文档写的。

点击这里

补充一个细节:在傲游里,刷新页面后js调用flash里的方法可能会失败。这篇文章有提到这个问题,解决方法是给swf地址加上随机数,让浏览器每次都重新加载flash。不过这样swf就不能被浏览器缓存,很无语~下面是一段判断傲游的js代码,建议只针对傲游加随机数。

var isMaxthon = false;
try {
if (external.max_language_id != undefined){
isMaxthon = true;
}
}catch (e){}
alert(isMaxthon);

Javascript与Flash通信全解析的更多相关文章

  1. 你不知道的JavaScript--Item22 Date对象全解析

    本篇主要介绍 Date 日期和时间对象的操作. 1. 介绍 1.1 说明 Date对象,是操作日期和时间的对象.Date对象对日期和时间的操作只能通过方法. 1.2 属性 无: Date对象对日期和时 ...

  2. javascript ajax 脚本跨域调用全解析

    javascript ajax 脚本跨域调用全解析 今天终于有点时间研究了一下javsscript ajax 脚本跨域调用的问题,先在网上随便搜了一下找到一些解决的办法,但是都比较复杂.由是转到jqu ...

  3. SWFObject: 基于Javascript的Flash媒体版本检测与嵌入模块

    原文地址:http://www.awflasher.com/flash/articles/swfobj.htm SWFObject: 基于Javascript的Flash媒体版本检测与嵌入模块原文:S ...

  4. 【凯子哥带你学Framework】Activity界面显示全解析

    前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...

  5. c# 与flash通信简介

    许久不曾写随笔,即使许久的怠惰,是该抬抬头,看看天了. 公司项目,项目要求是在winForm端先获取下位机的肌电信号采集数据,然后根据这些数据的变化来控制flash游戏,这样一些患者在flash游戏中 ...

  6. jQuery&nbsp;Ajax&nbsp;实例&nbsp;全解析

    jQuery Ajax 实例 全解析 jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯. 废话少说,直接进入正题,我 ...

  7. jQuery Ajax 全解析

    转自:http://www.cnblogs.com/qleelulu/archive/2008/04/21/1163021.html 本文地址: jQuery Ajax 全解析 本文作者:QLeelu ...

  8. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  9. 1.Google Chrome浏览器 控制台全解析

    Google Chrome浏览器 控制台全解析 在Google Chrome浏览器出来之前,我一直使用FireFox,因为FireFox的插件非常丰富,更因为FireFox有强大的Firebug,对于 ...

随机推荐

  1. sublimeText OmniMarkupPreviewer 404

    这个错误也是出现的莫名奇妙. "Error: 404 Not Found Sorry, the requested URL 'http://127.0.0.1:51004/view/29' ...

  2. 5.python的字符串

    在前面提起过字符串这个词,现在就来学习什么是字符串. 首先,字符串是python内置的数据类型,其特点是用引号引起来,并且可以是使用单引号('字符串'),双引号("字符串"),三个 ...

  3. 欢迎来到vmax-tam的博客

    欢迎来到vmax-tam的博客 我是一个新手程序员 以后会不断学习 把学到的东西记录下来 和大家一起分享的 谢谢大家指教

  4. MySql 用户 及权限操作

    bin/msyql -h host -u user -p    bin/mysql -u mysql -p  本地登录 如无密码按回车直接进入mySql   bin/mysqladmin -u roo ...

  5. Android--简单开发和使用ContentProvider数据共享

    今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子: 我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你 ...

  6. hdu 3152 Obstacle Course

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3152 Obstacle Course Description You are working on t ...

  7. php取整函数floor(),round(),intval(),ceil()

    ceil -- 进一法取整说明float ceil ( float value )返回不小于 value 的下一个整数,value 如果有小数部分则进一位.ceil() 返回的类型仍然是 float, ...

  8. [转]Ubuntu 12.04开机自动挂载Windows分区

    [转]Ubuntu 12.04开机自动挂载Windows分区 http://www.cnblogs.com/A-Song/archive/2013/02/27/2935255.html 系统版本:Ub ...

  9. FPGA内部信号避免高阻态

    RT,否则警告Warning: Tri-state node(s) do not directly drive top-level pin(s),会利用或门代替中间的扇出fan-out. 原因:在进行 ...

  10. JNI文件中命名类与JAVA文件中匹配

    jni.c中注册中 int register_android_boa(JNIEnv *env){    jclass clazz;    static const char* const kClass ...