JavaScript与ActionScript 3.0交互的一些问题

这两天做基于 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 是否同样有效。

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

时间: 2024-08-03 09:35:30

JavaScript与ActionScript 3.0交互的一些问题的相关文章

积少成多 Flash(ActionScript 3.0 & Flex 3.0) 系列文章索引

Flash 之 ActionScript 3.0 1.积少成多Flash(1) - ActionScript 3.0 基础之数据类型.操作符和流程控制语句 介绍 Flash ActionScript 3.0 中所有的数据类型都是对象,操作符和流程控制语句的语法与C#类似   2.积少成多Flash(2) - ActionScript 3.0 基础之包.类.包外类.命名空间.属性.方法.接口和继承 介绍 Flash ActionScript 3.0 是一种面向对象的语言,包.类.包外类.命名空间.

【as3】ActionScript 3.0体验试教学视频教程

很不错的视频教程 原文地址:http://blog.sina.com.cn/s/blog_3ecb9b1101009nx0.html 全屏观看地址: 视频1地址 视频2地址   教案发布: ActionScript 3.0 体验试教学--Making Things Move 第一部分 AS动画基础第一章 基础动画概念第二章 ActionScript 3.0 动画基础第三章 三角学应用第四章 渲染技术 第二部分 基础运动第五章 速度与加速度第六章 边界与摩擦力第七章 交互运动:让物体动移动 第三部

ActionScript 3.0系列教程(4):爽快使用XML

xml|教程 ActionScript 3.0系列教程(3):Document Class特色为我们带来了什么? ActionScript 3.0系列教程(4):爽快使用XML 为什么放弃AS2.0选择AS3.0?如果只允许我说三个理由.那么AS3.0对XML的近乎完美的支持绝对是其中一个. 简单说说AS3.0中对于XML支持的不同吧: .AS2.0对XML的支持勉勉强强,将就着可以用.而AS3.0中对XML的支持是全方位的,极其强大和灵活的. AS2.0对XML的支持不是内建的(build-i

JavaScript与Flash 8.0通信之打印实战篇

javascript|打印 在发贴之前,我希望大家能给我提出宝贵的意见和建议,如有不对的地方,情给予指出: 同时我要感谢闪吧.Action Script讨论区的所以版主以及supertomato.因为这里有许多默默无闻的人为大家提供无偿的帮助,我在次作一点小小的贡献,希望能给大家带来一点小小的收获.谢谢! 最近为银行作一个凭证打印,应用到了javaScript与flash 8.0的通讯,所以我将这段代码贴出来.起初计划纯粹用javascrip作打印,后来想到要更好的升级(原因就不说啦),所以就用

Flash ActionScript 3.0 概要

可以说这是我翻译的第一个ActionScript文件,虽然AS3.0吵的很大.但由于有关中文介绍的还并不多见,所以翻译了这篇文章.这篇文章译自:http://labs.macromedia.com/wiki/index.php/ActionScript_3:overview 由于英语水平和actionscript水平有限,也许有些错误之处,在此恳请斑主和大伙们指出,但同时也希望对大家有所用处. ActionScript3.0概要 ActionScript 3.0 演变成一门强大的面向对象的编程语

Flash ActionScript 2.0 基础教程

基础教程 本文译者:egoldy文章出处: http://www.ultrashock.com 文章性质:翻译 ActionScript 2.0-简介 随着FLASHMX2004的推出,Macromedia公司推出了一种新的脚本类型称为as2,在要教程中我们将要了解AS2的新特性.新的面向对象的模型以及如何使AS1的脚本过度到AS2. 为什么我们需要一种新的脚本语言. 如果你只是做一些简单的动画是不需要用一种新的脚本语言的,其实有许多项目是不需要脚本语言的.如果你真的不需要使用脚本语言那这个教程

Foundation Actionscript 3.0 Animation

相关信息: 书名:Foundation Actionscript 3.0 Animation 作者:Keith Peters 翻译/编辑/润稿:FL基理大师 原创译文来源:http://blog.sina.com.cn/yyy98 英文版及源文件下载:http://www.fs2you.com/zh-cn/files/2e4448ca-ecb7-11dc-bab3-0014221f3995/ 目录: 第一章 基础动画概念 第二章 ActionScript 3.0 动画基础Ⅰ 第二章 Action

《Adobe Flash CS4 ActionScript 3.0中文版经典教程》——ActionScript 3.0简介

ActionScript 3.0简介 在开始学习本书课程之前,最好花点时间了解一下ActionScript的历史以及Adobe ActionScript 3.0如何适用于Adobe Flash和Flash平台. Flash和ActionScript的简要历史 自从Flash在1996年发布以来,Flash和ActionScript是同步发展的.当前,将Flash CS4所提供的设计和动画工具与ActionScript 3.0的高级交互功能相结合,它提供了功能更为强大.使用更为广泛的开发环境:但是

《ActionScript 3.0基础教程》——第1章 对象的访问和操作1.1 创建新的ActionScript 3.0项目

第1章 对象的访问和操作 ActionScript让每个人都可以为图画.视频以及其他舞台上的元件创建动画交互.为了增加交互功能,ActionScript需要一种方法来访问舞台上的各个对象.在这一部分里,你将学会如何访问这些对象,之后你就可以为它们添加简单的交互了. 在本章中,你将学会如何修改舞台上对象的属性.在学习的过程中,你会发现把对象转化为元件并为它们命名(我们叫它实例名)是多么重要.你将写出你的第一段ActionScript代码来改变一些东西,并且你将知道如何输出开发信息来帮助你检查代码的