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 headercache-control 为 no-cache 

四个条件同时满足,就会出现IE6FLASH无法接到服务器返回的信息。

解决方案:

解决的办法主要是通过后台修改返回信息的reponsehttp头信息。

特别提到的一种解决方法是:

 

返回信息的HTTP头信息中加入

Cache-control"="no-store, no-cache, must-revalidate, post-check=0pre-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

posted @ 2012-07-11 18:14  晨光熹微  阅读(272)  评论(0编辑  收藏  举报