<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>FoxLing - 前端开发 &#187; SWFObject</title>
	<atom:link href="http://foxling.org/tag/swfobject/feed/" rel="self" type="application/rss+xml" />
	<link>http://foxling.org</link>
	<description>不积跬步 无以至千里</description>
	<lastBuildDate>Sat, 19 Nov 2011 16:29:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>使用SWFObject插入Flash在IE下导致stageWidth为0的解决方法</title>
		<link>http://foxling.org/as-flex-air/swfobject-bug-at-ie/</link>
		<comments>http://foxling.org/as-flex-air/swfobject-bug-at-ie/#comments</comments>
		<pubDate>Sat, 23 May 2009 18:20:07 +0000</pubDate>
		<dc:creator>FoxLing</dc:creator>
				<category><![CDATA[AS/Flex/AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[SWFObject]]></category>

		<guid isPermaLink="false">http://foxling.cn/?p=378</guid>
		<description><![CDATA[SWFObject SWFObject是一个用于在HTML中方面插入Adobe Flash媒体资源（*.swf文件）的独立、敏捷的JavaScript模块。该模块中的JavaScript脚本能够自动检测PC、Mac机器上各种主流浏览器对Flash插件的支持情况。它使得插入Flash媒体资源尽量简捷、安全。而且它是非常符合搜索引擎优化的原则的。此外，它能够避免您的 HTML、XHTML中出现object、embed等非标准标签，从而符合更加标准。 SWFObject在IE下的BUG 如果Flash里绘制的对象的宽高是自适应Flash的宽高的，那么，使用SWFObject来插入Flash在IE会导致一个问题，当这个Flash被缓存后，也就是第二次访问该页面时，在该Swf文件被加载时，获取到的stage.stageWidth和stage.stageHeight为0，绘制的对象也就看不到了。 在Flash里监听resize事件，找出解决方法 如下(如果加载较慢就先等等吧~)： swfobject.embedSWF("/examples/autosizeexample/autosizeexample.swf", "autosizeExample", "300", "300", "9.0.0", "/wp-content/res/expressInstall.swf"); 用IE的话，会看到5行，有两次resize事件，这也就导致了Flash在加载的时候绘制对象错误(宽和高为0)： 数字是stage.stageWidth和stage.stageHeight info resize 0 x 0 resize 300 x 300 如果用Firefox等浏览器，只输出两行文字，没有resize事件： info 300 x 300 AS里的解决方案 通过监听resize事件，当stage.stageWidth和stage.stageHeight大于0时再进行初始化 package { import flash.display.Sprite; import flash.events.Event; import flash.text.TextField; import flash.display.StageAlign; import flash.display.StageScaleMode; public class AutoSizeExample extends Sprite { private var txt:TextField; public function [...]]]></description>
			<content:encoded><![CDATA[<h3>SWFObject</h3>
<p><a href="http://code.google.com/p/swfobject/">SWFObject</a>是一个用于在HTML中方面插入Adobe Flash媒体资源（*.swf文件）的独立、敏捷的JavaScript模块。该模块中的JavaScript脚本能够自动检测PC、Mac机器上各种主流浏览器对Flash插件的支持情况。它使得插入Flash媒体资源尽量简捷、安全。而且它是非常符合搜索引擎优化的原则的。此外，它能够避免您的 HTML、XHTML中出现object、embed等非标准标签，从而符合更加标准。 </p>
<h3>SWFObject在IE下的BUG</h3>
<p>如果Flash里绘制的对象的宽高是自适应Flash的宽高的，那么，使用SWFObject来插入Flash在IE会导致一个问题，<strong>当这个Flash被缓存后，也就是第二次访问该页面时</strong>，在该Swf文件被加载时，获取到的stage.stageWidth和stage.stageHeight为0，绘制的对象也就看不到了。</p>
<p><span id="more-378"></span></p>
<h3>在Flash里监听resize事件，找出解决方法</h3>
<p>如下(如果加载较慢就先等等吧~)：</p>
<div style="padding:10px;border:1px dashed #CCC;">
<div id="autosizeExample"><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></div>
<p><script type="text/javascript">swfobject.embedSWF("/examples/autosizeexample/autosizeexample.swf", "autosizeExample", "300", "300", "9.0.0", "/wp-content/res/expressInstall.swf");</script>
</div>
<p>用IE的话，会看到5行，有两次resize事件，这也就导致了Flash在加载的时候绘制对象错误(宽和高为0)：<br />
数字是stage.stageWidth和stage.stageHeight</p>
<blockquote><p>
info<br />
resize<br />
0 x 0<br />
resize<br />
300 x 300</p></blockquote>
<p>如果用Firefox等浏览器，只输出两行文字，没有resize事件：</p>
<blockquote><p>info<br />
300 x 300</p></blockquote>
<h3>AS里的解决方案</h3>
<p>通过监听resize事件，当stage.stageWidth和stage.stageHeight大于0时再进行初始化</p>
<pre>
package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;
    import flash.display.StageAlign;
    import flash.display.StageScaleMode;

    public class AutoSizeExample extends Sprite
    {
        private var txt:TextField;
        public function AutoSizeExample()
        {
            stage.align = StageAlign.TOP_LEFT;
            stage.scaleMode = StageScaleMode.NO_SCALE;

            txt = new TextField();
            txt.multiline = true;
            txt.wordWrap = true;
            txt.text = "info\n";
            addChild(txt);

            if (stage.stageWidth>0 &#038;&#038; stage.stageHeight>0){
                createChild();
            }else{
                stage.addEventListener(Event.RESIZE,onResize);
            }
        }

        private function onResize(e:Event):void
        {
            if (stage.stageWidth>0 &#038;&#038; stage.stageHeight>0){
                stage.removeEventListener(Event.RESIZE,onResize); //删除事件监听
                createChild();
            }
            //否则继续监听事件，直到stage.stageWidth和stage.stageHeight大于0时才初始化
        }

        private function createChild():void
        {
            //进行初始化操作，创建各对象
            //.......................
            var w:Number = stage.stageWidth;
            var h:Number = stage.stageHeight;

            txt.appendText(w + " x " + h + "\n");
        }

    }
}
</pre>
<h3>SWFObject.js里的解决方案</h3>
<p>在swfobject.js里找到函数function createSWF(attObj, parObj, id)<br />
里面针对winIE的处理方法是：<code>el.outerHTML = '&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + att + '&gt;' + par + '&lt;/object&gt;';</code><br />
看了一下Adobe自己的AC_OETags.js，他是用document.write方法直接写入，没有这个问题；<br />
直接写静态html(object)没有这种问题；<br />
直接访问<a href="/examples/autosizeexample/autosizeexample.swf">这个flash的地址</a>，也没有这种问题。<br />
至于el.outerHTML的方式为什么会导致这种问题，还没有深究，暂时还不太清楚是什么原因导致的~</p>
<p>待续~~~</p>
]]></content:encoded>
			<wfw:commentRss>http://foxling.org/as-flex-air/swfobject-bug-at-ie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

