<?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>omiga &#187; AS</title>
	<atom:link href="http://omiga.org/blog/archives/tag/as/feed" rel="self" type="application/rss+xml" />
	<link>http://omiga.org/blog</link>
	<description>简单就好</description>
	<lastBuildDate>Thu, 26 Apr 2012 04:18:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>LSO/Flash Cookie</title>
		<link>http://omiga.org/blog/archives/1451</link>
		<comments>http://omiga.org/blog/archives/1451#comments</comments>
		<pubDate>Thu, 21 Oct 2010 15:25:08 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[flashcookie]]></category>
		<category><![CDATA[LSO]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=1451</guid>
		<description><![CDATA[SharedObject类创建的本地共享对象（LSO：local shared object）类似于浏览器cookie，所以也被称作Flash Cookie。类似只是在作用上类似，都是用于将数据保存于客户端，可进行读写。 不同之处似乎更多： 浏览器cookie具有过期时间，而Flash Cookie默认永不过期，尽管可以间接地实现expires 浏览器cookie文件大小不能超过4k，且同一域最多只能保存20个cookie，而Flash Cookie默认大小为100k，如若不够还可以向用户请求获取更多空间存储Flash Cookie 浏览器cookie保存的数据都以字符串形式保存，而Flash Cookie可保存除了AS中可视对象和SharedObject对象本身的任何数据类型 浏览器cookie无法跨浏览器进行读写，而Flash Cookie却是跨浏览器的，任何浏览器访问的Flash Cookie都可以是同一个.sol文件 浏览器cookie最初为服务器端编程而设计，而且作为HTTP协议的扩展可以自动地在web浏览器与服务器之间传递，而Flash Cookie默认不会在浏览器与服务器之间进行传递 浏览器cookie默认域为创建cookie页面所在域，而Flash Cookie默认域为创建Flash Cookie的swf文件所在域，未必是当前页面所在域 静态getLocal()方法是LSO创建和打开以进行读取的机制。getLocal()方法会返回ShareObject实例，用以取代new运算符以实例化新LSO实例。调用getLocal()方法时至少需要为其传入一个参数，即是LSO的名称；第二个参数是为LSO指定存储路径便于其他swf共享该LSO数据，默认保存路径为创建LSO的swf文件所在唯一域、路径和文件名组成；第三个参数用以确定对此共享对象的访问是否只限于通过HTTPS连接传递的swf文件，默认false。如：var user:SharedObject = SharedObject.getLocal(&#8216;user&#8217;,'/&#8217;); LSO通过其一个特殊的内建属性data来存储所有数据，如：user.data.name = &#8216;xxxx&#8217;; 在Flash Player卸载时、SharedObject实例被当成垃圾回收时、当调用SharedObject.clear()方法时，LSO数据都会自动保存至本地磁盘。但是这些方法都不值得信赖，推荐的方式是使用SharedObject.flush()方法来对LSO数据进行存储。flush()方法有一个可选参数，指定写入数据时应该使用的最小磁盘空间量，默认值为0，表示只使用所需的最小空间。 调用flush()方法返回以下三种结果： Error　用户拒绝保存该域的LSO数据，或者Flash Player由于某种原因不能保存数据都会抛出Error SharedObjectFlushStatus.FLUSHED　数据成功保存 SharedObjectFlushStatus.PENDING　没有分配足够的磁盘空间来保存LSO数据。 LSO数据的读取与写入一样简单，只需将共享对象的data属性内的对应属性读取出来即可，如：var name:String = user.data.name; 而删除LSO对象中的数据则需要使用delete运算符，如：delete user.data.name;如需要删除整个LSO对象，调用clear()方法即可：user.clear(); 以下代码定义了三个函数setCookie、getCookie、delCookie用以创建/修改、获取、删除LSO数据： //LSO/FlashCookie wondger@gmail.com import flash.events.NetStatusEvent; function setCookie(lsoname:String,cname:String,cvalue:*,path:String=null):Boolean{ var lso:SharedObject = (path!=null&#38;&#38;path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname); [...]]]></description>
			<content:encoded><![CDATA[<p>SharedObject类创建的本地共享对象（LSO：local shared object）类似于浏览器cookie，所以也被称作Flash Cookie。类似只是在作用上类似，都是用于将数据保存于客户端，可进行读写。</p>
<p>不同之处似乎更多：</p>
<ul>
<li>浏览器cookie具有过期时间，而Flash Cookie默认永不过期，尽管可以间接地实现expires</li>
<li>浏览器cookie文件大小不能超过4k，且同一域最多只能保存20个cookie，而Flash Cookie默认大小为100k，如若不够还可以向用户请求获取更多空间存储Flash Cookie</li>
<li>浏览器cookie保存的数据都以字符串形式保存，而Flash Cookie可保存除了AS中可视对象和SharedObject对象本身的任何数据类型</li>
<li>浏览器cookie无法跨浏览器进行读写，而Flash Cookie却是跨浏览器的，任何浏览器访问的Flash Cookie都可以是同一个.sol文件</li>
<li>浏览器cookie最初为服务器端编程而设计，而且作为HTTP协议的扩展可以自动地在web浏览器与服务器之间传递，而Flash Cookie默认不会在浏览器与服务器之间进行传递</li>
<li>浏览器cookie默认域为创建cookie页面所在域，而Flash Cookie默认域为创建Flash Cookie的swf文件所在域，未必是当前页面所在域</li>
</ul>
<p>静态<strong>getLocal()</strong>方法是LSO创建和打开以进行读取的机制。getLocal()方法会返回ShareObject实例，用以取代new运算符以实例化新LSO实例。调用getLocal()方法时至少需要为其传入一个参数，即是LSO的名称；第二个参数是为LSO指定存储路径便于其他swf共享该LSO数据，默认保存路径为创建LSO的swf文件所在唯一域、路径和文件名组成；第三个参数用以确定对此共享对象的访问是否只限于通过HTTPS连接传递的swf文件，默认false。如：var user:SharedObject = SharedObject.getLocal(&#8216;user&#8217;,'/&#8217;);</p>
<p>LSO通过其一个特殊的内建属性data来存储所有数据，如：user.data.name = &#8216;xxxx&#8217;;</p>
<p>在Flash Player卸载时、SharedObject实例被当成垃圾回收时、当调用SharedObject.clear()方法时，LSO数据都会自动保存至本地磁盘。但是这些方法都不值得信赖，推荐的方式是使用SharedObject.flush()方法来对LSO数据进行存储。flush()方法有一个可选参数，指定写入数据时应该使用的最小磁盘空间量，默认值为0，表示只使用所需的最小空间。</p>
<p>调用flush()方法返回以下三种结果：</p>
<ol>
<li>Error　用户拒绝保存该域的LSO数据，或者Flash Player由于某种原因不能保存数据都会抛出Error</li>
<li>SharedObjectFlushStatus.FLUSHED　数据成功保存</li>
<li>SharedObjectFlushStatus.PENDING　没有分配足够的磁盘空间来保存LSO数据。</li>
</ol>
<p>LSO数据的读取与写入一样简单，只需将共享对象的data属性内的对应属性读取出来即可，如：var name:String = user.data.name;</p>
<p>而删除LSO对象中的数据则需要使用delete运算符，如：delete user.data.name;如需要删除整个LSO对象，调用clear()方法即可：user.clear();</p>
<p>以下代码定义了三个函数setCookie、getCookie、delCookie用以创建/修改、获取、删除LSO数据：</p>
<pre>//LSO/FlashCookie wondger@gmail.com
import flash.events.NetStatusEvent;
function setCookie(lsoname:String,cname:String,cvalue:*,path:String=null):Boolean{
	var lso:SharedObject = (path!=null&amp;&amp;path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	lso.data[cname] = cvalue;
	try{
		var flushResult:String = lso.flush();
		if(flushResult == SharedObjectFlushStatus.FLUSHED) return true; //数据保存成功
		else if(flushResult == SharedObjectFlushStatus.PENDING) lso.addEventListener(NetStatusEvent.NET_STATUS,onStatus); //空间不够时
	}catch(e:Error){
		Security.showSettings(SecurityPanel.LOCAL_STORAGE); //用户禁止保存数据，打开Player的“settings”对话框
	}
	function onStatus(evt:NetStatusEvent):Boolean{
		lso.removeEventListener(NetStatusEvent.NET_STATUS,onStatus);
		if(evt.info.code == 'SharedObject.Flush.Success') return setCookie(lsoname,cname,cvalue); //用户同意允许请求更多的空间
		return false;
	}
	return false;
}
function getCookie(lsoname:String,cname:String,path:String=null):*{
	var lso:SharedObject = (path!=null&amp;&amp;path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	return lso.data[cname];
}
function delCookie(lsoname:String,cname:String=null,path:String=null):Boolean{
	var lso:SharedObject = (path!=null&amp;&amp;path.length) ? SharedObject.getLocal(lsoname,path) : SharedObject.getLocal(lsoname);
	if(lso){
		if(cname &amp;&amp; cname != null){
			delete lso.data[cname];
			lso.flush();
		}else lso.clear();
		return true;
	}
	return false;
}</pre>
<p>当然还可以使用JavaScript进行一定的封装方便跨浏览器操作（对检测flash加载完成addCallback注册函数可用一直纠结了很久，没有找到太满意的方法，现在这个将就用）：<a title="FlashCookie" href="http://omiga.org/lab/flashcookie/" target="_blank">demo</a></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>update 2011/7/27</p>
<p>补充下，上面提到的间接地实现expires</p>
<p>文章写了很久也忘记了，我想可以这样，每次写cookie的时候，将expires作为一个数据字段保存，即user.data.expires = ****，每次读取cookie的时候，都将此expires读取出来与当前时间比较即可。</p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2010. |
<a href="http://omiga.org/blog/archives/1451">Permalink</a> |
<a href="http://omiga.org/blog/archives/1451#comments">4 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/1451&title=LSO/Flash Cookie">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/as" rel="tag">AS</a>, <a href="http://omiga.org/blog/archives/tag/as3" rel="tag">AS3</a>, <a href="http://omiga.org/blog/archives/tag/cookie" rel="tag">cookie</a>, <a href="http://omiga.org/blog/archives/tag/flashcookie" rel="tag">flashcookie</a>, <a href="http://omiga.org/blog/archives/tag/lso" rel="tag">LSO</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/1451/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Adobe Flash Player—Debugger Versions</title>
		<link>http://omiga.org/blog/archives/1365</link>
		<comments>http://omiga.org/blog/archives/1365#comments</comments>
		<pubDate>Fri, 30 Apr 2010 04:03:15 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[FlashPlayer]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=1365</guid>
		<description><![CDATA[Download the Windows Flash Player 10 ActiveX control content debugger (for IE) (EXE, 2.12 MB) Download the Windows Flash Player 10 Plugin content debugger (for Netscape-compatible browsers) (EXE, 2.09 MB) Download the Windows Flash Player 10 Projector content debugger (EXE, 5.18 MB) Download the Macintosh Flash Player 10 Plugin content debugger (Intel-based Macs) (DMG, 6.31 [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_ax_debug.exe">Download  the Windows Flash Player 10 ActiveX  control content debugger (for IE)  (EXE,  2.12 MB)</a></li>
<li><a href="http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_plugin_debug.exe"> Download the Windows Flash Player  10 Plugin  content debugger (for Netscape-compatible browsers) (EXE,  2.09 MB)</a></li>
<li><a href="http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.exe"> Download  the Windows Flash Player  10 Projector content debugger (EXE, 5.18 MB)</a></li>
<li><a href="http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_plugin_debug_ub.dmg"> Download  the Macintosh Flash  Player 10 Plugin content debugger (Intel-based Macs) (DMG, 6.31  MB)</a></li>
<li><a href="http://download.macromedia.com/pub/flashplayer/updaters/10/flashplayer_10_sa_debug.app.zip"> Download  the Macintosh Flash  Player 10 Projector content debugger (ZIP, 6.22 MB)</a></li>
</ul>
<p><a href="http://www.adobe.com/support/flashplayer/downloads.html" target="_blank">http://www.adobe.com/support/flashplayer/downloads.html</a></p>
<p>四月快结束了，赶紧滥竽充数更新一篇。</p>
<p>FlashPlayer debug版教育我们：<strong>写代码，要记得做容错处理！</strong></p>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2010. |
<a href="http://omiga.org/blog/archives/1365">Permalink</a> |
<a href="http://omiga.org/blog/archives/1365#comments">2 comments</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/1365&title=Adobe Flash Player—Debugger Versions">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/as" rel="tag">AS</a>, <a href="http://omiga.org/blog/archives/tag/as3" rel="tag">AS3</a>, <a href="http://omiga.org/blog/archives/tag/debug" rel="tag">debug</a>, <a href="http://omiga.org/blog/archives/tag/flash" rel="tag">flash</a>, <a href="http://omiga.org/blog/archives/tag/flashplayer" rel="tag">FlashPlayer</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/1365/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ExternalInterface</title>
		<link>http://omiga.org/blog/archives/1118</link>
		<comments>http://omiga.org/blog/archives/1118#comments</comments>
		<pubDate>Thu, 23 Jul 2009 09:16:23 +0000</pubDate>
		<dc:creator>omiga</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[AS]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[EI]]></category>
		<category><![CDATA[ExternalInterface]]></category>
		<category><![CDATA[ExternalInterfaceas]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://omiga.org/blog/?p=1118</guid>
		<description><![CDATA[ExternalInterface是一个外部的用于实现Actionscript和Flash Player容器之间通信的应用程序接口（诸如AS与JS的通信）。推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface，替代较旧的fscommand()，getURL()方法。 ExternalInterface类有两个公共属性： available : Boolean　[static][read-only]　指示此播放器是否位于提供外部接口的容器中。 objectID : String　[static][read-only]　在 Internet Explorer 中，返回标签的 id 属性；在 Netscape 中，返回 name 属性。 同时具有两个公共方法： addCallback(functionName:String, closure:Function):void　[static]　将 ActionScript 方法注册为可从容器调用。 call(functionName:String, … arguments):*　[static]　调用由 Flash Player 容器公开的函数，不传递参数或传递多个参数。 ActionScript调用JavaScript demo AS: import flash.events.MouseEvent; import flash.external.ExternalInterface; bt.addEventListener(MouseEvent.MOUSE_UP,alert); function alert(e:MouseEvent):void{ ExternalInterface.call("alert","a demo for call \n http://omiga.org"); } 直接调用即可,当然,最好检查一下当前容器是否支持外部接口通信。 bt.addEventListener(MouseEvent.MOUSE_UP,alert); function alert(e:MouseEvent):void{ [...]]]></description>
			<content:encoded><![CDATA[<p>ExternalInterface是一个外部的用于实现Actionscript和Flash Player容器之间通信的应用程序接口（诸如AS与JS的通信）。推荐对所有 JavaScript 与 ActionScript 之间的通信使用 ExternalInterface，替代较旧的fscommand()，getURL()方法。</p>
<p>ExternalInterface类有两个公共属性：</p>
<ol>
<li>available : Boolean　[static][read-only]　指示此播放器是否位于提供外部接口的容器中。</li>
<li>objectID : String　[static][read-only]　在 Internet Explorer 中，返回标签的 id 属性；在 Netscape 中，返回 name 属性。</li>
</ol>
<p>同时具有两个公共方法：</p>
<ol>
<li>addCallback(functionName:String, closure:Function):void　[static]　将 ActionScript 方法注册为可从容器调用。</li>
<li>call(functionName:String, … arguments):*　[static]　调用由 Flash Player 容器公开的函数，不传递参数或传递多个参数。</li>
</ol>
<p><strong>ActionScript调用JavaScript</strong> <a href="../../lab/call/call.html" target="_blank">demo</a></p>
<p>AS:</p>
<pre>import flash.events.MouseEvent;
import flash.external.ExternalInterface;
bt.addEventListener(MouseEvent.MOUSE_UP,alert);
function alert(e:MouseEvent):void{
 ExternalInterface.call("alert","a demo for call \n http://<strong>omiga</strong>.org");
}</pre>
<p>直接调用即可,当然,<span style="font-family: comic sans ms,sans-serif;">最好检查一下当前容器是否支持外部接口通信。</span></p>
<pre>bt.addEventListener(MouseEvent.MOUSE_UP,alert);
function alert(e:MouseEvent):void{
 if(ExternalInterface.available){
 ExternalInterface.call("alert","a demo for call \n http://<strong>omiga</strong>.org");
 }
}</pre>
<p><strong>JavaScript调用ActionScript</strong> <a href="../../lab/call/addcallback.html" target="_blank">demo</a></p>
<p>AS:</p>
<pre>import flash.external.ExternalInterface;
function setText(s){
 i_txt.text = s;
}
ExternalInterface.addCallback("setText",setText);</pre>
<p>HTML:</p>
<pre>&lt;object id="mySWF"  classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="300" height="22"&gt;
 &lt;param name="movie" value="addCallback.swf" /&gt;
 &lt;param name="quality" value="high" /&gt;
 &lt;param name="allowScriptAccess" value="always" /&gt;
 &lt;embed src="addCallback.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="300" height="22"&gt;&lt;/embed&gt;
&lt;/object&gt;
&lt;button onclick="set()"&gt;设 置&lt;/button&gt;
&lt;script type="text/javascript"&gt;
function getFlash(id){
 if(document.all) return document.getElementById(id);
 else return document.getElementById(id).getElementsByTagName("embed")[0];
}
function set(){
 var s = prompt('请输入：');
 getFlash("mySWF").setText(s);
}
&lt;/script&gt;</pre>
<hr />
<p><small>© omiga for <a href="http://omiga.org/blog">omiga</a>, 2009. |
<a href="http://omiga.org/blog/archives/1118">Permalink</a> |
<a href="http://omiga.org/blog/archives/1118#comments">No comment</a> |
Add to
<a href="http://del.icio.us/post?url=http://omiga.org/blog/archives/1118&title=ExternalInterface">del.icio.us</a>
<br/>
Post tags: <a href="http://omiga.org/blog/archives/tag/as" rel="tag">AS</a>, <a href="http://omiga.org/blog/archives/tag/as3" rel="tag">AS3</a>, <a href="http://omiga.org/blog/archives/tag/ei" rel="tag">EI</a>, <a href="http://omiga.org/blog/archives/tag/externalinterface" rel="tag">ExternalInterface</a>, <a href="http://omiga.org/blog/archives/tag/externalinterfaceas" rel="tag">ExternalInterfaceas</a>, <a href="http://omiga.org/blog/archives/tag/flash" rel="tag">flash</a>, <a href="http://omiga.org/blog/archives/tag/javascript" rel="tag">javascript</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://omiga.org/blog/archives/1118/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

