AS和JS在Maxthon、TT等浏览器无法通信的问题

来源:互联网 发布:linux rsync 本地同步 编辑:程序博客网 时间:2024/05/21 14:43

出自:http://popotang.com/blog/as-js-maxthon-bug.html

某flash文件嵌入在网页上,提供了一些针对JS的接口以方便JS调用,这些接口是通过flash的ExternalInterface.call方法在flash里声明的。

在IE、Firefox等浏览器下,JS调用这些接口没有问题的,但是在Maxthon、TT、TheWorld浏览器下,第一次打开页面是可以的,刷新了页面就找不到这些接口了,JS直接报错说未声明。按理说Maxthon、TT这些浏览器也是IE的内核,只不过是装了个壳而已,怎么会有这个问题?既然第一次没有问题,初步分析就是这些浏览器对flash做了缓存处理。根据这个结论,做了个试验,在加载flash文件价格随即参数,防止缓存,反复测试没问题,但是这样做,每次都从服务器拉取文件,对服务器压力、带宽和打开速度都有很大影响,有没有更好的方法?

分析症状,应该是flash初始化的问题,而接口ExternalInterface.call是在初始化的时候注册的,是否是这里的问题呢?

反复测试,最终找到个解决问题的方案:

把所有接口声明的ExternalInterface.call抽出来放到一个单独的函数里,比如起名叫InitExtCall(这个名字可以随便命名的),然后在flash初始化函数里改成  setTimeout(InitExtCall,0); 问题解决。

至于为什么这样做可以解决,没有很深入的去分析。但是分析下javascript的setTimeout原理,无论在哪里声明,其作用域链都是在window下执行,有时候我们故意用这样的方式来解决一些跳转的问题,flash下是否也是这样的问题呢?

[2010-11-21] 在网上搜索发现另外一个解决方案:

在使用 innerHTML创建了flash 后,检查暴露函数如果不存在,即调用__flash__addCallback(flashObj, “funcName”);人工初始化暴露函数。


原创粉丝点击