收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 3525|回复: 2

[AS3] ExternalInterface的一个Bug及解决方案

[复制链接]
发表于 2010-8-14 09:27:20 | 显示全部楼层 |阅读模式
对于本文所提及的Bug,目前已有比较多的替代方案以避免它在程序里运行异常。

在网页里测试如下AS代码



  1. var my_txt:TextField=new TextField();
  2. addChild(my_txt);

  3. //理论上应该先对ExernalInterface.available进行检查,本处从简
  4. var my_confirm:*=ExternalInterface.call("confirm","ExternalInterface测试");
  5. my_txt.text=my_confirm.toString();

复制代码


运行后,不妨先休息一会,上上洗手间再回来点击,你将会发现,js函数并没有正常返回true或false并显示在文本框上,如果你的FlashPlayer为调试版,则会报出如下错误:
Error: Error #1502: 脚本的执行时间已经超过了 15 秒的默认超时设置。
        at _fla::MainTimeline/frame1()。
ExternalInterface非异步函数,必须先等函数执行完毕方可继续执行脚本,期间FlashPlayer依然会记录运行的时长。尽管不是死循环,但同样因超时而抛错。
如果该代码用在AS2上,则会弹出警告“此影片中有个脚本导致FlashPlayer运行缓慢,如果继续运行,计算机将无法响应。是否终止此脚本?”

作者尝试修改发布设置中的脚本超时时间,但无论改成什么值,FlashPlayer依然以15秒为超时标准。

无论在Flash还是JS中,警示框都已经有比较多模拟的源码,尽管其目的仅为改善用户体验,但已经不再导致FlashPlayer报错。

如果仍要使用浏览器默认的对话框,可以将此部分代码放在setTimeout上执行,但会忽略其返回值。

  1. setTimeout(function(){ExternalInterface.call("confirm","ExternalInterface测试")},100);
复制代码

同时,虽然后续脚本仍可以执行,但该代码仍会导致FlashPlayer脚本抛出错误,放在try/catch内又容易影响运行效率。

解决方案:
用JS的setTimeout替代即可,同样会被忽略返回值(如有需要,可以让JS在获取返回值后主动调用AS内的函数)。

  1. ExternalInterface.call("eval","setTimeout(function(){confirm(\"ExternalInterface测试\");},100)");
复制代码


本文主要目的在于汇报一个Bug,所以,本人提出的解决方案虽然比较方便,能达到立竿见影的效果,但作者不推荐大家使用。毕竟,模拟的对话框才能带来更良好的用户体验。
发表于 2010-8-14 09:32:57 | 显示全部楼层
是啊
在JS与AS通信的时候,我从来不敢用返回值,一直用互相调用把值传过去
    AS调用JS函数,JS函数再调用AS函数.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-14 09:46:26 | 显示全部楼层
呵呵,是啊,没办法中的办法了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( ICP05002321 )  

GMT+8, 2020-2-24 16:53 , Processed in 0.109100 second(s), 9 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表