`
elan1986
  • 浏览: 164220 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript 与 ActionScript 交互的一些问题

阅读更多
这两天做基于 Flash9(ActionScript 3.0)的 JavaScript PHPRPC 3.0 客户端时遇到了一些 JavaScript 与 ActionScript 3.0 交互的一些问题,这些问题在网上基本上都没有找到答案,最后通过不断的尝试才得以解决,因此在这里总结出来,希望能给遇到同样问题的同志们一些帮助。

JavaScript 跟 ActionScript 3.0 交互也是通过 flash.external.ExternalInterface 这个类,不过与跟 Flash 8 中跟 ActionScript 2.0 交互所使用的 flash.external.ExternalInterface 还是有所不同的。最大的不同就是 ExternalInterface.addCallback 方法在 ActionScript 3.0 中只有 2 个参数了,而不再有 instance 这个参数。下面要讨论的这些问题都是关于 Flash 9 中 ActionScript 3.0 的。

先来说最常遇到的问题,就是在 JavaScript 调用 Flash 中的 ActionScript 方法时报告该方法不存在。这个问题是跟 Flash 中执行 ExternalInterface.addCallback 的时间有关的,ExternalInterface.addCallback 必须要在 HTML 的完全载入之后也就是 window.onload 事件执行后才可以执行,否则,它所发布的方法都无法在 JavaScript 中调用。

解决这个问题的方法在 Flash 9 的 ActionScript 3.0 帮助中有个例子,里面包含了这个解决方法,就是首先在 js 中设置两个标志,例如 jsReady 和 swfReady 这两个变量作为标志,开始都设置为 false,当 window.onload 时,设置 jsReady 为 true,在 Flash 中一开始检查 JavaScript 中的这个 jsReady 标志是否是 true(通过 ExternalInterface.call 方法调用 JavaScript 中的返回这个标志的一个函数),如果不为 true,就设置一个定时器,经过一段时间后(例如 50 或 100 毫秒)重复这个检查这个标志,一旦为 true,则执行 ExternalInterface.addCallback 来发布 ActionScript 要提供给 JavaScript 调用的函数或方法,执行完所有的 ExternalInterface.addCallback 后,通过 ExternalInterface.call 方法调用 JavaScript 中的设置 swfReady 标志的函数设置 swfReady 为 true。之后,当 JavaScript 检测到 swfReady 为 true 后,再调用 ActionScript 中的方法就不会遇到上的说的这个问题了。

如果简单一点的调用这样还可以,如果是有好多这样的调用就比较麻烦了。我是通过建立两个执行队列:jsTaskQueue 和 swfTaskQueue,当在 jsReady 为 true 之前,如果有要调用 ActionScript 的操作,就把这个操作放到 jsTaskQueue 中,当 js 在 window.onload 中执行设置 jsReady 时,把这个队列中的任务取出来执行,当 jsReady 为 true 后 swfReady 为 true 之前,如果有要调用 ActionScript 的操作,就把这个操作放到 swfTaskQueue 中,当 ActionScript 通过 ExternalInterface.call 方法调用 JavaScript 中的设置 swfReady 标志的函数设置 swfReady 为 true 时,把这个队列中的任务取出来执行。当 jsReady 和 swfReady 都为 true 时,那么如果有要调用 ActionScript 的操作,直接运行就可以了。通过这种方法把这些任务封装后,使用这些封装之后的操作,在编写代码就可以按照顺序(而不是异步)来写了,执行时也是顺序执行啦。

除了这个最常遇到的问题之外,还有两个关于 IE 上的问题。

如果你是通过 JavaScript 动态创建的 Flash 标签然后插入到 html 中的话(例如通过 innerHTML 赋值的方法或者 appendChild 的方法),很可能你这个操作是在 window.onload 之后才进行,在这种情况下,其它浏览器可以正常进行 JavaScript 和 ActionScript 3.0 的交互,IE 就不行。所以,为了保险,最好的方法就是直接把 flash 标签的 html 写在 html 的 body 中,或者用 JavaScript 的 document.write 来写入 html 的 body 中,后面这种方法对于 IE 来说更合适一些,因为这样的话,可以不需要点击激活 Flash。

另一个问题是,不要在 ActionScript 中发布名字为 invoke 的方法,否则在 IE 中,JavaScript 调用该方法时会出错。

最后一个问题,网上可以查到的比较多了,就是不要把 flash 放到 form 中,否则在 IE 中,JavaScript 调用 ActionScript 时会出错。当然,网上也给出了一个解决这个问题的脚本,不过那个貌似是针对 Flash 8 的 ActionScript 2.0 的,我没有试过,不知道对 ActionScript 3.0 是否同样有效。

11 月 23 日补充:

今天又发现一个问题,如果在 ActionScript 中通过 ExternalInterface.call 调用 JavaScript 时,如果传递的参数有字符串,那么字符串中如果包含 \ 符号的话,那么将会调用失败。这个也是 ActionScript 和 JavaScript 交互的一个 bug,解决办法是,对传递的字符串先进行一下处理在传递,处理方法很简单,比如要传递的数据是 data,将它进行一次 data.replace(/\\/, “\\\\”) 替换之后,在传递给 JavaScript 就可以了。JavaScript 与 ActionScript 3.0 交互的一些问题
分享到:
评论

相关推荐

    javascript与actionscript的交互.[课件]

    介绍javascript与actionscript之间的交互,不错的资源

    JavaScript与ActionScript3交互问题总结

    NULL 博文链接:https://hintcnuie.iteye.com/blog/253972

    Flex与JS交互

    actionscript与javascript交互

    一个实现ActionScript 与JavaScript 进行相互通信的程序例子

    一个实现ActionScript 与JavaScript 进行相互通信的程序例子。

    JavaScript和ActionScript的交互实现代码

    JavaScript和ActionScript的交互实现代码,需要js与flash交互的朋友可以学习下。

    Actionscript与javascript交互实例程序(修改)

    主要介绍了Actionscript与javascript交互实例程序(修改)的相关资料,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

    ActionScript开发技术大全

    26.1.2ActionScript与JavaScript交互 566 26.1.3ActionScript与桌面程序交互 567 26.2网页脚本交互示例 568 26.3桌面应用交互示例 571 26.4小结 573 第27章ActionScript打印控制 574 27.1使用打印作业对象 574 ...

    ActionScript开发人员指南中文版

    外部API示例:在ActionScript和Web浏览器中的JavaScript之间进行通信 第章:AIR中的XML签名验证 XML签名验证的基础知识 关于XML签名 实现IURIDereferencer接口 第章:客户端系统环境 客户端系统环境基础知识 使用...

    廖雪峰JavaScript教程

    在Web世界里,只有JavaScript能跨平台、跨浏览器驱动网页,与用户交互。 Flash背后的ActionScript曾经流行过一阵子,不过随着移动应用的兴起,没有人用Flash开发手机App,所以它目前已经边 缘化了。相反,随着HTML5...

    ActionScript3.0从零基础学习类

    ActionScript 是针对 Adobe Flash Player 运行时环境的编程语言,它在 Flash 内容和应用程序中实现了交互性、数据处理以及其它许多功能,是flash的专业脚本语言,与Javascript相似

    ActionScript3.0编程简介

    ActionScript 动作脚本是遵循 ECMAscript第四版 的 Adobe Flash Player 运行时环境的编程语言。它在 Flash 内容和应用程序... ActionScript是Flash的脚本语言,与JavaScript相似,ActionScript是一种面向对象编程语言。

    ActionScript.权威指南中文版

    ActionScript 动作脚本是遵循 ECMAscript第四版 的 ... ActionScript是Flash的脚本语言,与JavaScript相似,ActionScript是一种编程语言,新出的AS3.0使用OOP(面对对象编程),增加更强的报错能力,指定类型也更明确

    ASP中含flex的程序

    ASP中调用Flex,actionscript与javascript交互,将flex放置在特定的位置。

    flash与java交互的方法

    将 ActionScript 方法注册为可从容器调用。成功调用 addCallBack() 后,容器中的 JavaScript 或 ActiveX 代码可以调用在 Flash Player 中注册的函数。

    ActionScript 3.0 开发人员指南 (AS3开发帮助文档)

    第 29 章 : 用户交互的基础知识 第 30 章 : 键盘输入 第 31 章 : 鼠标输入 第 32 章 : 触摸、多点触控和手势输入 第 33 章 : 复制和粘贴 第 34 章 : 加速计输入 第 35 章 : AIR 中的拖放 第 36 章 : 使用菜单...

    java实现学生管理系统源码-js::full_moon:学习用JavaScript编码:dizzy:JavaScript课程合集

    java实现学生管理系统源码JavaScript 课程 JavaScript JavaScript 范例 多范式:面向对象(基于原型),命令式, 函数式,事件驱动 ...它用于使网页具有交互性并提供在线程序,包括视频游戏。 大多数网站都使用它,

    sewise HTML5 播放器开发框架

    您不需要掌握任何JavaScript或ActionScript编码技术就可以制作出专业的网页视频播放器。 Sewise Player即可以做为单一的前台播放器来在页面上播放视频和流,也可以结合Sewise Server后台技术实现专业的可交互的点播...

    SewisePlayer使用手册

    你不需要掌 握任何专业的JavaScript或ActionScript技术就可以制作出专业的网页视频播放器。 SewisePlayer即可以做为 单一的前台播放器来在页面上播放视频,也可以结sewise Server后台技术实现专业的可交互的点播、...

Global site tag (gtag.js) - Google Analytics