11月
22
2011

网页嵌入flash在IE下显示不正常

网页嵌入flash,尤其是一些包装好的现成控件,通过js调用实现一些特殊效果,一般这类flash都支持长宽尺寸自适应,问题就出现这里

在IE下会发现flash展现位置和长宽的效果失常,经过调试发现是stage.stageWidth和stage.stageHeight等环境变量在IE下第二次打开,也就是刷新过后会取不到正确的值或者说取到为0.

这种境况仅仅出现在利用swfobject载入flash的时候出现,用<object>来载入就不会出现问题。

经过搜索基本找到解决方案:

ZZ From http://hi.baidu.com/phps/blog/item/cccbd12a08657b95023bf622.html

今天碰到一个让人吐血的事。在网页上嵌入一个flv播放器,几通浏览器都能正常,就IE8第一次播放正常,刷新就不显示了,或者一闪就没有了,找了很长时间原因,也没找着,因为单独调试这个FLASH是正常的,而且如果你用object标签来实现是也是没问题,就是swfobject动态加载才有的问题,原先认为是swfobject的BUG,现在我也分不清算谁的BUG了。不过主要原因算是找着了,因为我用的是一个开源的FLV播放器,就是上篇文章讲的,flvplayer。 后来配合着网页调试,因为他是取的舞台大小来初始化界面的,用swfobject刷新经常取到
stage.width 或 stage.height 的值为0,这样初始化后就看不到了,但是有声音。但然,如果你们做的东西不是播放FLV的,那就什么东西都看不到了。其实也是自己大意了,swfobject官方以经把这个问题描述了,也说明了解决方法,就是大意没看到。

21. Why do stage.stageWidth and stage.stageHeight return 0 in Firefox or Internet Explorer when using dynamic publishing?


When using the dynamic publishing method in Internet Explorer or Firefox on Mac stage.stageWidth and stage.stageHeight might initially return 0 (note that for Internet Explorer the stage size will be available on first load, however when reloading or revisiting a page it will initially be 0).

The solution is to define a resize handler in your ActionScript code. The Flash Player team was obviously aware of this issue and therefore the Flash Player will keep on triggering the stage.resize event until it receives its actual width and height.

An AS3 example:

stage.addEventListener(Event.RESIZE, resizeHandler); 
stage.dispatchEvent(new Event(Event.RESIZE));
// force stage resize event for normal cases 
function resizeHandler(event:Event):void {   
if (stage.stageHeight > 0 && stage.stageWidth > 0) { 
    stage.removeEventListener(Event.RESIZE, resizeHandler); 
 // only execute once     
 // your initialization code here   } 
}
 另外,也可以设个定时器 
var t:Timer = new Timer(50,0); 
t.addListener(... t.start(); 
然后监听函数里,判断 stage.stageHeight > 0 && stage.stageWidth  
大于0就进行初始化工作,就OK了,记得要把定时器stop掉,

就这样解决了。这个BUG搞的时间太长了记录一下。 网上也有一位朋友这么发起了一篇文章,
不过他倒冒似没解决问题,这里我也转过来吧。
http://hi.baidu.com/sailorhu/blog/item/0c3e457e8995ff310cd7da29.html 

swfobject 2.1在IE7下flash显示不正常以及内存泄漏

这几天一直为这个很奇怪的问题困扰。最后证明,只有在 swfobject 下 才会出现这种问题。我只测试了 2.1版本。 忙啊。

问题症状:1,使用swfobject加载flash, 使用IE 7。初次打开html页面,正常。 按下F5 刷新。 flash 里面的 textfield 全都挪到位置(0,0)。都叠加到一起。

                  2,初次打开页面正常,按下F5刷新。 页面然后一直处于加载状态。cpu使用率飙升到 60%多,内存 200M ,300,400,、、、 1000M,我赶紧kill掉IE进程。 我笔记本配置 cpu P7350,内存3G.。 不是机器的问题。那肯定是 flash的问题了。

然后反复测试。换flash加载方式, 逐段注释flash里面的脚本。放开。 最后找到。

1, textfield 都挪到 位置 (0,0) , 是因为 我在as3里面是这样写的

           lbl1.x = 0;
lbl2.x = stage.stageWidth*1/4;
lbl3.x = stage.stageWidth*1/2;

页面按下F5 刷新的时候, stage.stageWidth 取不到了? 都变成了 0 ?   改成 lbl2.x = 100 ; lbl3.x = 200; 显示正常。 我换其他 flash加载方式,显示正常啊。

 

2,内存泄漏。 是因为 有这段代码;

list1 = new List;

list1.setSize(stage.stageWidth*1/4,stage.stageHeight*1-20);

var count:uint = list1.rowCount * 2;

for (var i:int = 0; i < count; i++) {
//                dp.push({label:”Item ” + i});
}

可以看到 ,循环里面的内容我都注释掉了。 当按下F5刷新的时候,跟上面一样,stage的值取不到了。给list setsize 肯定无效了。 但是setsize这句话 不会使得flash 死掉。 而是后面的。 取 list1.rowCount ,这个值取 list 的 行数,但是现在 list的 高度为负值。这个行数 就变成一个不知道多少位的数了。下面做循环导致flash以惊人的速度吃内存。

总结: 两个问题的 关键都是 stage.stageWidth 和 stage.stageHeight 在 页面 按下F5 刷新的时候取不到了。从flash本身来讲,很难优化吧。stage的其他属性有可能出问题。不可能不使用stage对象吧。 那就只能找 swfobject 的问题了。

我换做其他加载方式,是正常的。 算了。到此为止吧。很忙啊。 一个字,换、、、、、

关于作者:moface

博主

留下评论

博客剩余工作

6,优化前台(YSlow) 2,404页面 3,IE6下兼容性问题很大 1,标签小工具行高有点儿问题 4,微博聚合 5,推广工作 7,CDN(cloudflare

分类

访问统计