【转】Flash Player 10升级导致SWFUpload程序异常
此前我分享了一些关于SWFUpload的东西,有一些朋友在网上跟我探讨他们在使用中遇到的问题,多数情况下都是他们对初始化时setting对象的属性没有了解清楚,配置错误甚至是遗漏造成了程序无法正常初始化。而前些天一个朋友在邮件里说他的SWFUpload程序在XP系统上运行正常,在win 2000系统下运行出现了问题。当时我第一反应是他的两个系统的浏览器环境不一致。可当我看了他发的Debug信息以后,我才发现问题和我想的不一样。
在他的Debug信息中抛出了一个#2176的异常(Exception: Error: Error #2176),可是我查了一下我本地的AS帮助手册没有发现这个异常状态码。去Adobe官方DOC上一看,原来是一个运行时错误"Certain actions, such as those that display a pop-up window, may only be invoked upon user interaction, for example by a mouse click or button press."。
继续查阅了下发现原来是FlashPlayer 10升级以后,安全策略更严格了,对于弹窗这类显示动作需要用户通过鼠标或者键盘交互来触发,无法像以前一样使用脚本直接触发了(类似HTML Form中的File表单,我们无法使用Javascript来触发文件选择对话框的弹出,一定需要用户点击"浏览"按钮)。我升级播放器以后测试了以前写的程序,果然出现了#2176错误。既然FlashPlayer 10有了这样的安全限制,那么SWFUpload目前版本岂不是不能使用了?
我去SWFUpload官方看了下,果然十月份已经更新到了V2.2.0版本,同时加入了Google Code。我最近也忙了些,一直都没有再关注这个库。其实在官方论坛上已经有人提出了上述问题,而V2.2.0版本的Change Log也明确指出此版就是为了支持FlashPlayer 10而做的升级,同时也放弃了对FlashPlayer 8的支持。
我又查看了下官方V2.2.0版修正的Demo,原来此版是在SWF中引入一个按钮,用户点击此按钮来触发文件选择对话框的显示,而此前版本中使用的selectFile()和selectFiles()由于无法兼容Flash Player 10,因此不能继续使用了。虽然功能是正常了,但我个人觉得仍然有个小小的不完美之处就是将一个Flash元素暴露在了用户面前(Flash元素上右键和HTML页面右键表现不一致),用户可能会有种"怪异"的感觉。
V2.2.0的API文档也相应做了些修改,主要有以下五处更改:
一、彻底放弃了对Flash Player 8的支持,只提供唯一版本的swf影片。
二、由于现在的SWF需要显示在页面内,因此在setting中增加了一个必须的button_placeholder_id属性,该属性可以设置一个页面中的DOM元素ID,当SWFUpload初始化的时候,会用SWF影片替换此DOM节点。
三、setting中增加了一系列关于按钮UI显示的属性,具体查阅我更新的SWFUpload v2.2.0 说明文档,也可直接查看官方的Demo。
四、setting中增加了一个prevent_swf_caching属性,通过给swf后添加random参数来控制是否被浏览器缓存。官方的目的是为了解决基于IE引擎的浏览器的一个BUG。(PS:官方没有说明是什么BUG,不过在V2.0版本时,我在Maxthon中遇到了刷新BUG,当时我同样使用此方法更改了SWFUpload库,但BUG依然存在。)
五、method中增加了一系列关于重置按钮UI的方法,具体查阅我更新的SWFUpload v2.2.0 说明文档。
PS:SWFUpload的此次升级主要是为了兼容Flash Player 10,增加了一系列的属性和方法来完成按钮UI的自定制,这样就使配置过程更加复杂了,或许可以把按钮的UI还是留给HTML中的DOM和CSS完成,而SWFUpload提供一个透明影片定位在页面中指定的按钮容器之上。我的这种设想是来自目前的WEB邮箱系统中很常见的自定义的附件上传按钮,实际上是使用CSS将File表单透明,然后定位到自定义的按钮之上,这样用户点击添加附件的时候,实际上点击的是File表单的"浏览"按钮,只不过它不可见罢了。(有时间我会专门针对这个实现分享点东西和大家一起探讨。)
如果你还在使用SWFUploadV2.2.0之前的版本,那么赶紧使用V2.2.0版本修改你以前的程序,否则你的程序就存在不兼容问题,可能会造成用户无法正常使用。针对SWFUpload V2.2.0 API文档中的调整我也重新做了翻译,详细见SWFUpload v2.2.0 说明文档。