IE6中flash与后台通讯的注意点
ie6自身的bug造成flash与后台传输问题。
Ie6存在的bug中,与flash player有关的有2个:
A.IE6无法将Gzip包正确地传输给FlashPlayer。
B._root第一帧下Stage类信息丢失(仅IE有此问题) 。
1.IE6无法将Gzip包正确地传输给FlashPlayer。
表现:
flash无论用 POST还是GET方式提交数据。在IE下总会报错。但是,在后台查询已获取数据并成功返回信息。经过进一步测试 FF Op Saf IE5.5 IE7 IE8 谷歌都正常。
唯独IE6返回流错误(Error 2032 io错误),导致页面不能及时更新异步数据。
出现条件:
A.客户端ie6浏览器
B.flash player
C.gzip压缩
D.设置 response header的cache-control 为 no-cache
四个条件同时满足,就会出现IE6中FLASH无法接到服务器返回的信息。
解决方案:
解决的办法主要是通过后台修改返回信息的reponse的http头信息。
特别提到的一种解决方法是:
返回信息的HTTP头信息中加入
1 Cache-control"="no-store, no-cache, must-revalidate, post-check=0, pre-check=0
另外需要取消 "Expires", "Pragma" 头信息。
这个方法可以有效的降低问题出现的几率,但是因为广大用户电脑和网络环境的不同,并不能很全面的解决问题。表现为一部分ie6用户不会出现,一部分出现。由于用户的基数可能很大,很低的比率也会代表很多电脑出现问题,而这些用户的反馈会降低网站的可信度。
对于ie6的这个bug,微软提出了解决方法:
要规避此问题,你可以在下面两个方案中选一种:
1.如果你使用了Cache-Control: no-cache 这个 HTTP 头来防止文件被缓存,移除这个头就好了。有些情况下,如果你用一个Expires头来代替(前面这个出问题的http头),(也可以起到相同作用而)不会触发这个问题。
或者
2.不要压缩脚本文件。
详情链接:http://support.microsoft.com/kb/327286/en-us?sid=64&spid=2073
由于网站一般都会开启gzip压缩,所以第2个方法无法使用。那么就只能使用第一种。
以下的方式,是我们在实践中得到应用的一种方法,方式不必局限于此,但是思路是上文所提到的。
protectedString ajaxFlash(String content)
{
HttpServletRespones respones =ServletActionContext.getResponse();
respones.setContentType("text/plain;charset=UTF-8");
respones.setHeader("Cache-Control","max-age=0,must-revalidate,post-check=0,pre-check=0");
respones.setHeader("Expires","1970.1.1");
respones.getWriter().write(content);
respones.getWriter().flush();
returnnull;
}
如果实在无法从后台代码解决,也可以使用flash-js-后台的方式,让js作为传递中介来解决。
2._root第一帧下Stage类信息丢失
表现:
这个问题最明显的表现在舞台宽和高信息的丢失。在一些flash效果和应用中,舞台的宽和高牵连到显示对象的运动范围,碰撞检测等等问题。信息丢失,就会造成不正常的情况发生。
出现条件:
使用ie6浏览器,舞台宽高等信息牵连到效果实现。
解决方案:
A.在网页中嵌入flash的标签中显式的设置宽和高,少用自适应。
B.在flash本身的类文件中,对宽和高及其他信息进行显式的设置,最好在主要的容器内使用“隐形背景”(使用一个与舞台等大的图形对象,透明度设为0)