<?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>JerryQu的小站 &#187; 本地存储</title>
	<atom:link href="http://www.qgy18.com/tag/%e6%9c%ac%e5%9c%b0%e5%ad%98%e5%82%a8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.qgy18.com</link>
	<description></description>
	<lastBuildDate>Tue, 16 Mar 2010 03:42:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>如何使用Flash来实现本地存储</title>
		<link>http://www.qgy18.com/2008/09/howto_flash-localstorage/</link>
		<comments>http://www.qgy18.com/2008/09/howto_flash-localstorage/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:56:51 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[本地存储]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=49</guid>
		<description><![CDATA[我在5月份的一篇文章里列举了一些本地存储解决方案，包括常见的Cookie、UserData和不是那么常见的globalStorage、Database Storage。文章最后提到了另外两种解决方案：Google Gear和Flash，当时因为觉得用不上就没仔细研究。但实际应用中，那篇文章列出的方案还是不能满足项目的需求。这篇文章就讲一下如何使用Flash来实现本地存储，以及该方案使用的场合。 拿IE6来说，如果要在本地... ]]></description>
			<content:encoded><![CDATA[<p>我在5月份的一篇文章里列举了一些<a href="http://www.qgy18.com/2008/05/localstorage/">本地存储解决方案</a>，包括常见的Cookie、UserData和不是那么常见的globalStorage、Database Storage。文章最后提到了另外两种解决方案：Google Gear和Flash，当时因为觉得用不上就没仔细研究。但实际应用中，那篇文章列出的方案还是不能满足项目的需求。这篇文章就讲一下如何使用Flash来实现本地存储，以及该方案使用的场合。</p>
<p>拿IE6来说，如果要在本地大量存放数据，Cookie因为存放内容太少、浪费用户带宽首先就应该被淘汰掉。UserData在大多数情况下能满足需求，但是它也有一个致命的弱点：只能读取同目录存储，也就是a目录下一个文件不能读取b目录下两一个文件存放的数据。MSDN说明如下：</p>
<blockquote><p><strong>Security Alert</strong>  For security reasons, a UserData store is available only in the same directory and with the same protocol used to persist the store. <a href="http://msdn.microsoft.com/en-us/library/ms531424.aspx">全文&gt;&gt;</a></p></blockquote>
<p>也就是说如果项目中要跨文件夹操作本地存储，UserData也必须被淘汰了。IE不支持Database Storage，IE8才增加了对globalStorage的支持，这个时候Flash就派上用场了。<span id="more-49"></span></p>
<p>首先，打开Flash，建立一个工程，编写get、set、remove三个方法并提供给外部程序调用：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">package</span><span style="color: Gray;"> <br /></span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">display</span><span style="color: Gray;">.</span><span style="color: Blue;">Sprite</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">events</span><span style="color: Gray;">.</span><span style="color: Blue;">Event</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">events</span><span style="color: Gray;">.</span><span style="color: Blue;">TimerEvent</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">net</span><span style="color: Gray;">.</span><span style="color: Blue;">SharedObject</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">system</span><span style="color: Gray;">.</span><span style="color: Blue;">Security</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">external</span><span style="color: Gray;">.</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Green;">import</span><span style="color: Gray;"> </span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">utils</span><span style="color: Gray;">.</span><span style="color: Blue;">Timer</span><span style="color: Gray;">;<br />&nbsp;&nbsp; <br />&nbsp; </span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">class</span><span style="color: Gray;"> </span><span style="color: Blue;">Main</span><span style="color: Gray;"> </span><span style="color: Green;">extends</span><span style="color: Gray;"> </span><span style="color: Blue;">Sprite</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">Security</span><span style="color: Gray;">.</span><span style="color: Blue;">allowDomain</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">*</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span><span style="color: #ffa500;">//修改为自己的域名</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">const</span><span style="color: Gray;"> </span><span style="color: Blue;">storageName</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">data</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">;<br />&nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">public</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">Main</span><span style="color: Olive;">()</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">addExternalInterface</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">private</span><span style="color: Gray;"> </span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">addExternalInterface</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">set</span><span style="color: Olive;">(</span><span style="color: Blue;">key</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Gray;">, </span><span style="color: Blue;">val</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">sobj</span><span style="color: Gray;">:</span><span style="color: Blue;">SharedObject</span><span style="color: Gray;"> = </span><span style="color: Blue;">SharedObject</span><span style="color: Gray;">.</span><span style="color: Blue;">getLocal</span><span style="color: Olive;">(</span><span style="color: Blue;">storageName</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">sobj</span><span style="color: Gray;">.</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: Blue;">key</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">val</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">sobj</span><span style="color: Gray;">.</span><span style="color: Blue;">flush</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">get</span><span style="color: Olive;">(</span><span style="color: Blue;">key</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">sobj</span><span style="color: Gray;">:</span><span style="color: Blue;">SharedObject</span><span style="color: Gray;"> = </span><span style="color: Blue;">SharedObject</span><span style="color: Gray;">.</span><span style="color: Blue;">getLocal</span><span style="color: Olive;">(</span><span style="color: Blue;">storageName</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Olive;">(</span><span style="color: Blue;">sobj</span><span style="color: Gray;">.</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: Blue;">key</span><span style="color: Olive;">])</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">remove</span><span style="color: Olive;">(</span><span style="color: Blue;">key</span><span style="color: Gray;">:</span><span style="color: Teal;">String</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">sobj</span><span style="color: Gray;">:</span><span style="color: Blue;">SharedObject</span><span style="color: Gray;"> = </span><span style="color: Blue;">SharedObject</span><span style="color: Gray;">.</span><span style="color: Blue;">getLocal</span><span style="color: Olive;">(</span><span style="color: Blue;">storageName</span><span style="color: Gray;">, </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">/</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Green;">false</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">delete</span><span style="color: Gray;"> </span><span style="color: Blue;">sobj</span><span style="color: Gray;">.</span><span style="color: Blue;">data</span><span style="color: Olive;">[</span><span style="color: Blue;">key</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">sobj</span><span style="color: Gray;">.</span><span style="color: Blue;">flush</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">isJavaScriptReady</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">isReady</span><span style="color: Gray;">:</span><span style="color: Blue;">Boolean</span><span style="color: Gray;"> = </span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">call</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">isJSReady</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Blue;">isReady</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">jsReadyHandler</span><span style="color: Olive;">()</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">javascript js ready</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">addCallback</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">set</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">set</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">addCallback</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">get</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">get</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">addCallback</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">remove</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">remove</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">call</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">flashReadyHandler</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">ExternalInterface</span><span style="color: Gray;">.</span><span style="color: Blue;">available</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">try</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">isJavaScriptReady</span><span style="color: Olive;">())</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">jsReadyHandler</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">timerReady</span><span style="color: Gray;">:</span><span style="color: Blue;">Timer</span><span style="color: Gray;"> = </span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Blue;">Timer</span><span style="color: Olive;">(</span><span style="color: Maroon;">100</span><span style="color: Gray;">, </span><span style="color: Maroon;">0</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">timerReady</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: Blue;">TimerEvent</span><span style="color: Gray;">.</span><span style="color: Blue;">TIMER</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">evt</span><span style="color: Gray;">:</span><span style="color: Blue;">TimerEvent</span><span style="color: Olive;">)</span><span style="color: Gray;">:</span><span style="color: Green;">void</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">checking...</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">isJavaScriptReady</span><span style="color: Olive;">())</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">Timer</span><span style="color: Olive;">(</span><span style="color: Blue;">evt</span><span style="color: Gray;">.</span><span style="color: Blue;">target</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">stop</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">jsReadyHandler</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">timerReady</span><span style="color: Gray;">.</span><span style="color: Blue;">start</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">catch</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">:</span><span style="color: Blue;">SecurityError</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">.</span><span style="color: Blue;">message</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">catch</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">:</span><span style="color: Blue;">Error</span><span style="color: Olive;">)</span><span style="color: Gray;"> </span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">trace</span><span style="color: Olive;">(</span><span style="color: Blue;">err</span><span style="color: Gray;">.</span><span style="color: Blue;">message</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p>其中，核心功能是依靠SharedObject来实现的。对于这个对象，Adobe官方说明如下：</p>
<blockquote><p>Shared objects are quite powerful: they offer real-time data sharing between objects that are persistent on the local location. You can think of local shared objects as &#8220;cookies.&#8221;</p>
<p>You can use local shared objects to maintain local persistence. This is the simplest way to use a shared object. For example, you can call SharedObject.getLocal to create a shared object, such as a calculator with memory, in the player. Because the shared object is locally persistent, Flash saves its data attributes on the user&#8217;s machine when the movie ends. The next time the movie runs, the calculator contains the values it had when the movie ended. Alternatively, if you set the shared object&#8217;s properties to null before the movie ends, the calculator opens without any prior values the next time the movie runs. <a href="http://www.adobe.com/support/flash/action_scripts/actionscript_dictionary/actionscript_dictionary648.html">全文&gt;&gt;</a></p></blockquote>
<p>补充一下，SharedObject存储在本地的内容是可以跨浏览器读取的，也就是在IE中存储的内容，可以在firefox中读到，这是一个比较有用的特性。另外，SharedObject一般把内容存在下列位置：</p>
<blockquote><p><strong>Windows XP：</strong>C:\Documents and Settings\[1]\Application Data\Macromedia\Flash Player\#SharedObjects\[2]\[3]\[4].sol</p>
<p><strong>Windows Vista：</strong>C:\Users\[1]\AppData\Roaming\Macromedia\Flash Player\#SharedObjects\[2]\[3]\[4].sol<br />
([1]:系统当前用户,[2]:随机字符目录,[3]:网站域名,[4]:SharedObject对象名)</p></blockquote>
<p>然后用把编译得到的swf文件加到页面中，利用js来调用flash中对应的三个方法就OK了，具体方法都写在演示文件里，就懒得贴出来了。<a href="http://www.qgy18.com/lab/flashstorage/">演示地址在这里</a>。（<del datetime="2009-09-05T07:41:03+00:00">请用IE浏览器打开</del>）</p>
<p>update：更新了demo，支持所有的浏览器。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/09/howto_flash-localstorage/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>跨浏览器的本地存储解决方案</title>
		<link>http://www.qgy18.com/2008/05/localstorage/</link>
		<comments>http://www.qgy18.com/2008/05/localstorage/#comments</comments>
		<pubDate>Fri, 30 May 2008 07:43:55 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[本地存储]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=6</guid>
		<description><![CDATA[有时候我们在前端开发中为了提高用户体验，减少向服务器请求的次数，常常要在用户的电脑上存储数据，即要实现浏览器的本地存储数据功能。我在这里整理了一下常用的几种方案。 1.针对IE6以上(含)内核的浏览器，我们可以使用UserData 行为（userData Behavior） 说明： userData 行为通过将数据写入一个UserData存储区（UserData store）来保存数据，userData可以将数据以XML格式保存在客... ]]></description>
			<content:encoded><![CDATA[<p>有时候我们在前端开发中为了提高用户体验，减少向服务器请求的次数，常常要在用户的电脑上存储数据，即要实现浏览器的本地存储数据功能。我在这里整理了一下常用的几种方案。<span id="more-6"></span></p>
<p><strong>1.针对IE6以上(含)内核的浏览器，我们可以使用UserData 行为（userData Behavior）</strong></p>
<p><em><strong>说明：</strong></em></p>
<p>userData 行为通过将数据写入一个UserData存储区（UserData store）来保存数据，userData可以将数据以XML格式保存在客户端计算机上，如果你用的是 Windows 2000 或者 Windows XP，是保存在C:\Documents and Settings\Liming\UserData\文件夹下（如果操作系统不是安装在C盘，那么C就应该是操作系统所在的分区）。该数据将一直存在，除 非你人为删除或者用脚本设置了该数据的失效期。userData行为提供了一个比Cookie更具有动态性和更大容量的数据结构。每页的UserData 存储区数据大小可以达到64 Kb，每个域名可以达到640 Kb。userData 行为通过sessions为每个对象分配UserData存储区。使用save和load方法将UserData存储区数据保存在缓存（cache）中。 一旦UserData存储区保存以后，即使IE浏览器关闭或者刷新了，下一次进入该页面，数据也能够重新载入而不会丢失。出于安全的考虑，相同协议使用同 一个文件夹保存UserData存储区数据。</p>
<p><strong><em>使用：</em></strong></p>
<p>（1）首先必须在行内或文档的head部分声明如下样式：</p>
<p>.userData {behavior:url(#default#userdata);}</p>
<p>或者使用如下js代码来声明：</p>
<p>document.documentElement.addBehavior(”#default#userdata”);</p>
<p>（2）成员：</p>
<p>expires 设置或取得使用userData行为保存数据的失效日期，使用方法：对象ID.expires = UTC格式的时间字符串；</p>
<p>getAttribute() 取得指定的属性值；</p>
<p>load(存储区名) 从userData存储区载入存储的对象数据；</p>
<p>removeAttribute() 删除指定的属性值；</p>
<p>save(存储区名) 将对象存储到一个userData存储区；</p>
<p>setAttribute() 设置指定的属性值；</p>
<p>XMLDocument 取得存储该对象数据的XML DOM引用</p>
<p>（3）示例：</p>
<p><code>document.documentElement.addBehavior("#default#userdata");</code></p>
<p><code>document.documentElement.load("t");</code></p>
<p><code>document.documentElement.setAttribute("value", "test");</code></p>
<p><code>document.documentElement.save("t");</code></p>
<p><strong>2.针对Firefox2</strong><strong>(含)</strong><strong>以上内核的浏览器，我们可以使用globalStorage</strong></p>
<p><em><strong>说明：</strong></em></p>
<p>This is a global object (<code>globalStorage</code>) that maintains multiple private storage areas that can be used to hold data over a long period of time (e.g. over multiple pages and browser sessions).</p>
<p>Specifically, the globalStorage object provides access to a number of different storage objects into which data can be stored. For example, if we were to build a web page that used globalStorage on this domain (developer.mozilla.org) we’d have the following storage object available to us:</p>
<p>globalStorage[’developer.mozilla.org’] &#8211; All web pages within the developer.mozilla.org sub-domain can both read and write data to this storage object.</p>
<div>
<p><strong><em>使用：</em></strong></p>
<p><code>globalStorage[location.hostname]["t"] = "test";//赋值</code></p>
<p><code>var ret = globalStorage[location.hostname]["t"];//取值</code></p>
<p><code>globalStorage.removeItem("t");//删除</code></p>
<p><strong><em>备注：</em></strong></p>
<p>在firefox2中，我们可以在test00.aa.test.com 上的页面内使用globalStorage[<span style="font-family: Lucida Sans Unicode;">“</span>test.com<span style="font-family: Lucida Sans Unicode;">“</span>][<span style="font-family: Lucida Sans Unicode;">“</span>t<span style="font-family: Lucida Sans Unicode;">“</span>]=<span style="font-family: Lucida Sans Unicode;">“</span>test<span style="font-family: Lucida Sans Unicode;">“</span>来赋值，但是到了firefox3这么做却会得到一个错误提示，原因是firefox3的安全策略要求在使用 globalStorage时，指定的域名和实际的域名必须严格匹配！</p>
<p><strong>3.Database Storage，HTML5里的内容，目前仅有Safari支持</strong></p>
<p><em><strong>说明：</strong></em></p>
<p><em>This section is non-normative.</em></p>
<p><em><strong>使用：</strong></em></p>
<p>init:function(){<br />
if(!this._inited){<br />
this._db.transaction(function(t){<br />
t.executeSql(&#8220;CREATE TABLE &#8220;+this.name+&#8221; (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)&#8221;,[],function(){});<br />
},function(){});<br />
this._inited = true;<br />
}<br />
},<br />
get:function(key,fn){<br />
var ret = &#8220;&#8221;;<br />
this._db.transaction(function(t){<br />
t.executeSql(&#8220;SELECT v FROM &#8220;+this.name+&#8221; Where k=?&#8221;, [key], function(t, r){<br />
if(r.rows.length&gt;0){<br />
ret=r.rows.item(0)['v'];<br />
if(fn)fn.call(this,ret);};<br />
},function(){<br />
if(fn)fn.call(this,ret);<br />
});<br />
});<br />
},<br />
set:function(key,value){<br />
this.remove(key);<br />
this._db.transaction(function(t){<br />
t.executeSql(&#8220;INSERT INTO &#8220;+this.name+&#8221; (k,v) VALUES (?, ?)&#8221;, [key,value],function(){});<br />
},function(){});<br />
},<br />
remove:function(key){<br />
this._db.transaction(function(t){<br />
t.executeSql(&#8220;DELETE FROM &#8220;+this.name+&#8221; WHERE k=?&#8221;, [key],function(){});<br />
},function(){});<br />
}</p>
<p><strong>4.针对其它浏览器，如常见的Opera，我们可以使用Cookie</strong></p>
<p><em><strong>说明：</strong></em></p>
<p>A cookie is a small piece of information stored by the browser. Each cookie is stored in a name=value; pair called a crumb—that is, if the cookie name is “id” and you want to save the id’s value as “this”, the cookie would be saved as id=this. You can store up to 20 name=value pairs in a cookie, and the cookie is always returned as a string of all the cookies that apply to the page. This means that you must parse the string returned to find the values of individual cookies.</p>
<p>Cookies accumulate each time the property is set. If you try to set more than one cookie with a single call to the property, only the first cookie in the list will be retained.</p>
<p>You can use the Microsoft® JScript® split method to extract a value stored in a cookie.</p>
<p><strong><em>使用：</em></strong></p>
<p><code>function SetCookie(sName, sValue){<br />
</code><code>var </code><code>date = new Date();<br />
document.cookie = sName + "=" + escape(sValue) + "; expires=" + date.toGMTString();<br />
}<br />
function GetCookie(sName){<br />
var aCookie = document.cookie.split("; ");<br />
for (var i=0; i &lt; aCookie.length; i++){<br />
var aCrumb = aCookie[i].split("=");<br />
if (sName == aCrumb[0])<br />
return unescape(aCrumb[1]);<br />
}<br />
return null;<br />
}<br />
function DelCookie(sName){<br />
document.cookie = sName + "=" + escape(sValue) + "; expires=Fri, 31 Dec 1999 23:59:59 GMT;";<br />
}</code></p>
<p><strong><em>备注：</em></strong></p>
<p>现代浏览器一般默认都支持cookie，但是使用cookie也有几个致命的弱点：存储的信息量太少，页面向服务器发送请求的同时cookie也会被发送，无形中浪费用户的带宽。</p>
<p><strong>5.其它解决方案</strong></p>
<p>Google Gear：Google开发出的一种本地存储技术；</p>
<p>Flash：利用Flash也可以实现本地存储</p>
<p>这两种方法的优点是：能支持所有的OS和浏览器(Google Gear目前仅支持IE5+和Firefox1.5+)；缺点是需要用户安装额外的插件，使用起来不如前面其它3种方法简便。</p>
<p><strong>6.一些链接</strong></p>
<p><a href="http://developer.mozilla.org/en/docs/DOM:Storage" target="_blank">DOM:Storage</a></p>
<p><a class="external text" title="http://en.wikipedia.org/wiki/HTTP_cookie" rel="nofollow" href="http://en.wikipedia.org/wiki/HTTP_cookie" target="_blank">HTTP cookies</a></p>
<p><a class="external text" title="http://www.macromedia.com/support/documentation/en/flashplayer/help/help02.html" rel="nofollow" href="http://www.macromedia.com/support/documentation/en/flashplayer/help/help02.html" target="_blank">Flash Local Storage</a></p>
<p><a class="external text" title="http://msdn2.microsoft.com/en-us/library/ms531424.aspx" rel="nofollow" href="http://msdn2.microsoft.com/en-us/library/ms531424.aspx" target="_blank">Internet Explorer userData behavior</a></p>
<p><a href="http://www.whatwg.org/specs/web-apps/current-work/#sql">http://www.whatwg.org/specs/web-apps/current-work/#sql</a></p>
<p><a title="by Rank Liu" href="http://www.never-online.net/blog/article.asp?id=219">safari的一些杂记</a></div>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/05/localstorage/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
