前两天,我还刚刚写了一篇很浅显的,关于如何我使用的那个mp3播放器的博文,在我用上它以后,便发现博客在IE下经常报错,刚开始没注意,今天才发现,这报错不是偶尔现象,而是有规律可循。当你第一次打开一个带有播放器的页面后,你再跳转到其它页面的时候,看一看IE的状态栏,肯定有报错信息,海天的这篇文章就是活生生的演示。
作为一个WEB开发人员,我一般都是打开IE的调式功能的,所以那个报错信息,每次都弹出对话框,这种情况我是无法忍受的,只能着手解决这个问题,到网上查了半天,居然发现时Adobe公司的一个bug,个人觉得这是个及其简单的bug,可他们还是通过开发,再通过测试,然后让所有网民都用上的,Adobe公司也有吃错药的时候。
下面终重点说说如何解决这个问题吧,网上查到一些资料,有的话,要给EMBED标签套上OBJECT标签,然后这两个标签都要有加上ID和NAME属性,我试了没用,还有的资料说是重写ACTIONSCRIPT注入到JS的函数,我试了还是没用,但是在他们的基础上改了改代码可以了。
首先,flash mp3 播放器会向JS注入两个函数:
function __flash__addCallback(instance, name) {
instance[name] = function () {
return eval(instance.CallFunction("" + __flash__argumentsToXML(arguments,0) + " "));
}
}
function __flash__removeCallback(instance, name) {
instance[name] = null;
}
在调试的时候发现报错的是__flash__removeCallback,这个函数按照网上的资料说是删除播放器下载到内存中的音频数据的,所以还是比较重要的,否则内存会慢慢地被挤满的,目前,我知道的可行方式是重写__flash__removeCallback函数,当然是在JS里重写,Adobe的那套东西,我们肯定无法去重写。
重写函数的时候,灵异的事件发生了,我进行以下形式的重新定义,发现重新定义无效,IE压根就没调用我重写的函数:
window['__flash__removeCallback'] = function (instance, name){
try {
if (instance) {
instance[name] = null;
}
} catch (flashEx) {
}
}
而,如果我加上两句无关紧要的赋值语句,IE便会调用我重写的函数,我被弄的想去撞墙,哎:
window['__flash__removeCallback'] = function (instance, name){
try {
var i = 0;
i = i + 1;
if (instance) {
instance[name] = null;
}
} catch (flashEx) {
}
}
懂点代码的博友们,你们觉得var i = 0; i = i + 1;这两个语句有任何作用吗?但就是因为有了这两个废物,我的函数就起作用了,万能的IE,我不得不服。
最后就是将JS引入到博客里面了,对函数的重写,必须要下页面加载完方是最保险的,所以写在footer.php文件的