专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Javascript教程 » actionscript3.0:JavaScript和ActionScript 3.0交互的一些问题 »正文

actionscript3.0:JavaScript和ActionScript 3.0交互的一些问题

来源: 发布时间:星期一, 2008年12月29日 浏览:147次 评论:0
="t18">这两天做基于 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 就可以了

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: