janlay’s blog

悠悠人生路,翩翩少年情

JavaScript 与浏览器插件互操作最佳实践

最近,同事遇到了 JavaScript 调用 Flash ActionScript 接口失败的问题,并总结了一些改进方法。看到分享后,结合之前遇到类似的问题,我也总结了一下浏览器插件,包括ActiveX 控件(在IE中)或插件(非IE中)中的互操作问题。

为什么 JavaScript 调用 Flash 接口有时候会失败?

Flash 实质是个浏览器插件,凡是插件都会有初始化的问题。具体来说,插件元素插入页面后,对应的插件代码才会在独立的线程中开始初始化,而页面线程会继续渲染并执行 JavaScript. 这时,如果插件初始化未完成,而 JavaScript 调用它的接口,那么调用会失败。等插件初始化好了,JavaScript 又不再调用,则业务会失败。

选择合适的解决方案

所以这里有两种解决方案:

  • Flash 通知外部 JavaScript 它已经 ready, 外部 JavaScript 再调用 Flash 接口
  • 外部 JavaScript 不断检测 Flash 某个接口是否可用,直到可用时才调用它

两个方案的适用场景不同,前者适合用于 Flash 代码“可控”的环境,即开发人员有能力接触并修改 ActionScript, 还可以很方便地发布新版本; 后者适用于控件由第三方提供,不方便添加主动调用 JavaScript 的场景。

所以,通常 Flash 应用选择第一种方案,而像密码控件这类更新比较缓慢的应用选择第二种。

控件接口检测方式

注意检测控件接口可用时,不能使用 if(element.api) 这种形式,IE 会在 api 接口不可用时抛出异常,因为它不是普通的 JavaScript 方法或属性,即使可用的时候 typeof 运算符也会返回 'unknown'。这里应该使用 if(typeof element.api !== 'undefined').

Comments