<?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; Flash</title>
	<atom:link href="http://www.qgy18.com/tag/flash/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>跨浏览器的“复制到剪贴板”.续</title>
		<link>http://www.qgy18.com/2009/08/clipboard2/</link>
		<comments>http://www.qgy18.com/2009/08/clipboard2/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 14:15:55 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[用户体验]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=145</guid>
		<description><![CDATA[很早之前，写过一篇“跨浏览器“复制到剪贴板”的解决方案”，当时给出的解决方案是，IE使用window.clipboardData，firefox等其它浏览器使用flash来调用System.setClipboard方法。但是，随着Flash10安全策略更新，只允许在flash内部调用setClipboard方法，那篇文章给出的demo已经失效。我重新写了一个demo，见这里。 新demo是在flash内部调用的setClipboard方法，原则上安装了flash的浏览器都可以用... ]]></description>
			<content:encoded><![CDATA[<p>很早之前，写过一篇“<a href="http://www.qgy18.com/2008/08/clipboard/">跨浏览器“复制到剪贴板”的解决方案</a>”，当时给出的解决方案是，IE使用window.clipboardData，firefox等其它浏览器使用flash来调用System.setClipboard方法。但是，随着<a href="http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/">Flash10安全策略更新</a>，只允许在flash内部调用setClipboard方法，那篇文章给出的demo已经失效。我重新写了一个demo，<a href="http://www.qgy18.com/lab/clipboard2/">见这里</a>。</p>
<p>新demo是在flash内部调用的setClipboard方法，原则上安装了flash的浏览器都可以用；另外，IE7及以上版本用js调用clipboardData会弹出选择是否允许的提示，往往初级用户看到这样提示还以为网站有病毒，所以这次一视同仁所有浏览器都用flash写剪切板。原理比较简单，大概说一下：</p>
<ul>
<li>页面上提供两个js方法getData和copySuccess供flash调用，getData返回需要复制的内容，copySuccess是复制成功的回调函数；</li>
<li>往flash里添加一个任意的DisplayObject，例如TextField，注册Click事件，事件响应函数里先调用页面上的js方法getData得到粘贴内容，再用System.setClipboard写入剪切板，最后通知页面上的copySuccess。</li>
</ul>
<p>完整的代码<a href="http://www.qgy18.com/file/code/2.html">见这里</a>。如果要个性化提示文字，打开clipboard.as，修改后编译即可。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/08/clipboard2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Javascript与Flash通信全解析</title>
		<link>http://www.qgy18.com/2009/08/flash_externalinterface/</link>
		<comments>http://www.qgy18.com/2009/08/flash_externalinterface/#comments</comments>
		<pubDate>Mon, 24 Aug 2009 09:08:02 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=140</guid>
		<description><![CDATA[刚开始学习flash as3编程，一些学习笔记也丢上来吧，现在还都是些初级的话题～ Flash已经提供了ExternalInterface接口与JavaScript通信，ExternalInterface有两个方法，call和addCallback，call的作用是让Flash调用js里的方法，addCallback是用来注册flash函数让js调用。下面是官方文档对call和addCallback的说明： 利用 ActionScript，可以在 HTML 页上执行以下操作： 调用任何 JavaScript 函数。 传递任意数量... ]]></description>
			<content:encoded><![CDATA[<p>刚开始学习flash as3编程，一些学习笔记也丢上来吧，现在还都是些初级的话题～</p>
<p>Flash已经提供了ExternalInterface接口与JavaScript通信，ExternalInterface有两个方法，call和addCallback，call的作用是让Flash调用js里的方法，addCallback是用来注册flash函数让js调用。下面是官方文档对call和addCallback的说明：</p>
<p>利用 ActionScript，可以在 HTML 页上执行以下操作：</p>
<ul>
<li>调用任何 JavaScript 函数。</li>
<li>传递任意数量、具有任意名称的参数。</li>
<li>传递各种数据类型（Boolean、Number、String 等等）。</li>
<li>接收来自 JavaScript 函数的返回值。</li>
</ul>
<p>通过在 HTML 页上使用 JavaScript，可以：</p>
<ul>
<li>调用 ActionScript 函数。</li>
<li>使用标准的函数调用表示法传递参数。</li>
<li>将值返回给 JavaScript 函数。</li>
</ul>
<p>实际使用的时候，需要注意以下两点：</p>
<p>一、调用时机。js调用flash对象提供的函数时，可能swf还没有完全加载完，此时调用会失败。类似的，flash调用js函数时，也存在js函数还没load到的情况。所以adobe官方示例里采用了一种比较绕的逻辑来避免这种问题：</p>
<ul>
<li>页面上有一个变量_isJSReady，初始为false。还有一个isJSReady函数用来返回_isJSReady的值，供flash调用。在合适的时机（例如：window.onload），将_isJSReady设置为true，表示flash可以使用js里的函数了；</li>
<li>flash里有一个定时器，定期（例如：100ms）去调用页面上的isJSReady方法，直到isJSReady返回true，就可以addCallback，调用页面上的flashReadyHandler方法，通知页面可以跟flash交互了。</li>
</ul>
<p>二、如何获取flash对象。将flash插入到页面有很多方法，例如swfobject.js或者AC_RunActiveContent.js类似的库。我们来看一种最原始的方法，直接在html插入标记来插入flash：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Green;">object</span><span style="color: Gray;"> </span><span style="color: #00008b;">classid</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">clsid:d27cdb6e-ae6d-11cf-96b8-444553540000</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br /></span><span style="color: #00008b;">codebase</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://download.macromedia.com/pub/shockwave/cabs<br />/flash/swflash.cab#version=10,0,0,0</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">730</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">520</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">middle</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">allowScriptAccess</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">sameDomain</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">allowFullScreen</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">movie</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">quality</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">high</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;</span><span style="color: Green;">param</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">bgcolor</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">value</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#ffffff</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">embed</span><span style="color: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test.swf</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">quality</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">high</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">bgcolor</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#ffffff</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">width</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">730</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">height</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">520</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">name</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">align</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">middle</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">allowScriptAccess</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">always</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">allowFullScreen</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">false</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> <br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">application/x-shockwave-flash</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: #00008b;">pluginspage</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://www.adobe.com/go/getflashplayer_cn</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; </span><span style="color: Olive;">/&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">object</span><span style="color: Olive;">&gt;</span></div></div>
<p>假设test.swf提供了hello的方法，我们来在js里调用这个方法，代码如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">test</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">hello</span><span style="color: Olive;">()</span><span style="color: Gray;">;</span></div></div>
<p>结果，除了IE之外，其他浏览器都不会工作，会提示找不到hello这个方法。这个问题困扰了我比较久。最后发现：在非IE浏览器里，flash提供的方法是加在embed上的，我们要得到object下的embed对象，调用embed上的方法才会成功！</p>
<p>官方示例是采用下面方法获取flash对象的：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">getFlashMovieObject</span><span style="color: Olive;">(</span><span style="color: Blue;">movieName</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Teal;">document</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Teal;">document</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Gray;"> </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">navigator</span><span style="color: Gray;">.</span><span style="color: Blue;">appName</span><span style="color: Gray;">.</span><span style="color: Blue;">indexOf</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Microsoft</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">==-</span><span style="color: Maroon;">1</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Gray;"> &amp;&amp; </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">])</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">embeds</span><span style="color: Olive;">[</span><span style="color: Blue;">movieName</span><span style="color: Olive;">]</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">movieName</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>这里罗列出所有情况，当然不会有问题。其实，没必要弄得这么复杂，我们给object和embed取不同名称，例如一个test1，一个test2，如果是IE就getElementById(“test1”)，其它浏览器getElementById(“test2”)就行了。另外，如果使用js插入swf的话，很可能js里就已经做过判断，根据不同浏览器来输出object和embed其中一种。总之，如果调用失败，首先检查得到的flash对象是不是[object HTMLEmbedElement]。</p>
<p>最后，放上一个例子，是我参照官方文档写的。</p>
<p><a href="http://www.qgy18.com/file/code/1.html">点击这里</a></p>
<p>补充一个细节：在傲游里，刷新页面后js调用flash里的方法可能会失败。<a href="http://www.qgy18.com/2008/09/maxthon-bugs/">这篇文章</a>有提到这个问题，解决方法是给swf地址加上随机数，让浏览器每次都重新加载flash。不过这样swf就不能被浏览器缓存，很无语～下面是一段判断傲游的js代码，建议只针对傲游加随机数。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">isMaxthon</span><span style="color: Gray;"> = </span><span style="color: Green;">false</span><span style="color: Gray;">;<br /></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;</span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Blue;">external</span><span style="color: Gray;">.</span><span style="color: Blue;">max_language_id</span><span style="color: Gray;"> != </span><span style="color: Blue;">undefined</span><span style="color: Olive;">){</span><span style="color: Gray;">&nbsp; <br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">isMaxthon</span><span style="color: Gray;"> = </span><span style="color: Green;">true</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></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;">e</span><span style="color: Olive;">){}</span><span style="color: Gray;"><br /></span><span style="color: Blue;">alert</span><span style="color: Olive;">(</span><span style="color: Blue;">isMaxthon</span><span style="color: Olive;">)</span><span style="color: Gray;">;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/08/flash_externalinterface/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>轻松去掉web中flash右键菜单</title>
		<link>http://www.qgy18.com/2009/04/noflashmenu/</link>
		<comments>http://www.qgy18.com/2009/04/noflashmenu/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 16:43:11 +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=107</guid>
		<description><![CDATA[今天无意中看到一个画面还不错的webgame，随手右键单击看是否用flash写的（我对flash的判断标准是看右键菜单有无About Adobe Flash Player&#8230;字样）,但是点了居然不出任何菜单。记得之前看到要完全干掉flash右键菜单要用到一些很WS的方法，不知道这个webgame怎么实现的。看了一下它的代码，原来是在flash父容器里做文章：firefox下阻止mousedown默认事件及事件传播；IE下给父容器setCaptu... ]]></description>
			<content:encoded><![CDATA[<p>今天无意中看到一个画面还不错的webgame，随手右键单击看是否用flash写的（我对flash的判断标准是看右键菜单有无About Adobe Flash Player&#8230;字样）,但是点了居然不出任何菜单。记得之前看到要完全干掉flash右键菜单要用到一些很WS的方法，不知道这个webgame怎么实现的。看了一下它的代码，原来是在flash父容器里做文章：firefox下阻止mousedown默认事件及事件传播；IE下给父容器setCapture。摘录核心代码稍加改造就是下面这个样子：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">NoRightClick</span><span style="color: Olive;">(</span><span style="color: Blue;">pid</span><span style="color: Olive;">){</span><span style="color: #ffa500;">//pid:flash's parentNode id</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">el</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">pid</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">addEventListener</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">mousedown</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">button</span><span style="color: Gray;"> == </span><span style="color: Maroon;">2</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">stopPropagation</span><span style="color: Olive;">()</span><span style="color: Gray;">; </span><span style="color: #ffa500;">//for firefox</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">preventDefault</span><span style="color: Olive;">()</span><span style="color: Gray;">;&nbsp; </span><span style="color: #ffa500;">//for chrome</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Olive;">}</span><span style="color: Gray;">,</span><span style="color: Green;">true</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">onmousedown</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Blue;">event</span><span style="color: Gray;">.</span><span style="color: Blue;">button</span><span style="color: Gray;"> == </span><span style="color: Maroon;">2</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">setCapture</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&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 />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">attachEvent</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">onmouseup</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">releaseCapture</span><span style="color: Olive;">()</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Olive;">})</span><span style="color: Gray;">;<br />&nbsp; </span><span style="color: Blue;">el</span><span style="color: Gray;">.</span><span style="color: Blue;">oncontextmenu</span><span style="color: Gray;"> = </span><span style="color: Green;">function</span><span style="color: Olive;">(){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">return</span><span style="color: Gray;"> </span><span style="color: Green;">false</span><span style="color: Gray;">;<br />&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><span style="color: Gray;">;</span></div></div>
<div class="hl-surround"><div class="hl-main"><span style="color: Olive;">&lt;</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">div</span><span style="color: Gray;"> </span><span style="color: #00008b;">id</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">testContent</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> </span><span style="color: #00008b;">style</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">width:800px</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">div</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Olive;">&lt;</span><span style="color: Green;">script</span><span style="color: Gray;"> </span><span style="color: #00008b;">type</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">text/javascript</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; var so = new SWFObject(&quot;test.swf&quot;, &quot;t1&quot;, &quot;800&quot;, &quot;550&quot;, &quot;9&quot;, &quot;#000000&quot;);<br />&nbsp; so.addParam(&quot;quality&quot;, &quot;high&quot;);<br />&nbsp; so.addParam(&quot;name&quot;, &quot;t1&quot;);<br />&nbsp; so.addParam(&quot;id&quot;, &quot;t1&quot;);<br />&nbsp; so.addParam(&quot;algin&quot;, &quot;middle&quot;);<br />&nbsp; so.addParam(&quot;AllowScriptAccess&quot;, &quot;sameDomain&quot;);<br />&nbsp; so.addParam(&quot;menu&quot;, &quot;false&quot;);<br />&nbsp; so.addParam(&quot;wmode&quot;, &quot;opaque&quot;);<br />&nbsp; so.addParam(&quot;pluginspage&quot;, &quot;http://www.adobe.com/go/getflashplayer&quot;);<br />&nbsp; so.write(&quot;testContent&quot;);<br />&nbsp;<br />&nbsp; NoRightClick(&quot;testContent&quot;);<br />&nbsp;</span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">body</span><span style="color: Olive;">&gt;</span></div></div>
<p>经过试验，该代码可以在IE、Firefox和Google Chrome里去掉flash的右键菜单，还是挺方便的。至于这样做有什么意义呢？我暂时还没有想到——但网上搜索一下，有这种需求的人还是不少的。</p>
<p><a href="http://www.qgy18.com/lab/noflashmenu/">演示地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/04/noflashmenu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Flash10安全策略更新</title>
		<link>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/</link>
		<comments>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Fri, 30 Jan 2009 03:59:35 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=91</guid>
		<description><![CDATA[之前写过一篇文章跨浏览器“复制到剪贴板”的解决方案，里面讲到在Firefox下如果安装了Flash，就可以利用js调用flash的setClipboard方法来将一段文字写进系统剪切板。但是最近发现，在很多电脑上这种方法已经失灵了。研究了一下，发现是flash10更新了安全策略：新的策略只允许在flash内部调用setClipboard方法，利用js调用无效；当然，如果在flash里添加事件来执行setClipboard是在允... ]]></description>
			<content:encoded><![CDATA[<p>之前写过一篇文章<a href="http://www.qgy18.com/2008/08/clipboard/">跨浏览器“复制到剪贴板”的解决方案</a>，里面讲到在Firefox下如果安装了Flash，就可以利用js调用flash的setClipboard方法来将一段文字写进系统剪切板。但是最近发现，在很多电脑上这种方法已经失灵了。研究了一下，发现是flash10更新了安全策略：新的策略只允许在flash内部调用setClipboard方法，利用js调用无效；当然，如果在flash里添加事件来执行setClipboard是在允许范围内的。</p>
<p>除了setClipboard的更新外，还有一个比较大的更新就是：FileReference.browse和FileReference.download将只能通过Flash 内容响应鼠标或键盘的操作来使用。也就是说类似于<a href="http://www.swfupload.org/">SWFUpload</a>一类的通过js来打开文件选择框的应用将会无法工作！SWFUpload官方采用&#8221;在SWF中引入一个按钮，用户点击此按钮来触发文件选择对话框的显示&#8221;的方案解决的这一问题。</p>
<p>Flash的这次安全升级给我的启示：最好不要用一种语言来做本来不属于他做的事(例如利用window.name跨域传输数据等等)，尽管这些Hack在很多情况下很好用，但也最容易因为某次更新升级而失效。</p>
<p>参考：<br />
<a href="http://www.jeffothy.com/weblog/clipboard-copy#comment-123736">http://www.jeffothy.com/weblog/clipboard-copy#comment-123736</a><br />
<a href="http://www.v-sky.com/blog/?p=227">http://www.v-sky.com/blog/?p=227</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/01/flash10%e5%ae%89%e5%85%a8%e7%ad%96%e7%95%a5%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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/08/clipboard/</link>
		<comments>http://www.qgy18.com/2008/08/clipboard/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 15:16:08 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[用户体验]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=26</guid>
		<description><![CDATA[众所周知，firefox的安全性比较高，但是安全带来的弊端就是很多功能不支持。比如说在IE下可以通过脚本来设当前网页为首页，firefox却不行。今天要讨论的是另外一个问题：怎么在firefox等不支持window.clipboardData的浏览器下实现复制呢？ 首先，我们来看网易邮箱是怎么解决这个问题的。我们在firefox下进到写邮件页面，点击编辑器上的全部功能，然后点击左边的“复制”按钮，... ]]></description>
			<content:encoded><![CDATA[<p>众所周知，firefox的安全性比较高，但是安全带来的弊端就是很多功能不支持。比如说在IE下可以通过脚本来设当前网页为首页，firefox却不行。今天要讨论的是另外一个问题：怎么在firefox等不支持window.clipboardData的浏览器下实现复制呢？</p>
<p>首先，我们来看<a href="http://mail.163.com">网易邮箱</a>是怎么解决这个问题的。我们在firefox下进到写邮件页面，点击编辑器上的全部功能，然后点击左边的“复制”按钮，“您的浏览器安全设置不允许编辑器自动执行拷贝操作,请使用键盘快捷键(Ctrl+C)来完成”，网易邮箱给了我们这么一个提示。我觉得这个解决方案可以得80分，因为它告诉了我们两个信息：其一，之所以复制操作没有完成是因为我的浏览器很安全，为了安全损失一点用户体验一般用户是可以接受的；其二，它还提示了我们可以通过键盘快捷键ctrl+c来完成操作，这对刚上网的新手来说很人性化。但是，有没有更好的解决方案呢？<span id="more-26"></span></p>
<p>网上大致有两种解决方案，一种是需要修改firefox配置，其实firefox也是支持复制的，但是<a href="http://hi.baidu.com/zhuang_yifan/blog/item/9d40d0ced706a50293457edc.html">需要到about:config里去手动开启</a>，这里不做介绍了；另外一种解决方案是本文要用到的flash。因为flash可以方便的把文字拷贝到系统剪切板中，所以我们利用flash来做跳板，只需要一行代码就能搞定：</p>
<p>System.setClipboard(clipboard);</p>
<p>这句代码的含义后面还会提到。有了这个swf的跳板，剩下的工作就简单了，如果浏览器不支持window.clipboardData，就在复制的时候把内容传给这个flash，就OK了，关键代码如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Blue;">clipboardData</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Teal;">window</span><span style="color: Gray;">.</span><span style="color: Blue;">clipboardData</span><span style="color: Gray;">.</span><span style="color: Blue;">setData</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">Text</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,</span><span style="color: Blue;">str</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">flashId</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">_clipboard_</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">flashContent</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">'</span><span style="color: Red;">&lt;embed src=&quot;clipboard.swf&quot; FlashVars=&quot;clipboard=</span><span style="color: #8b0000;">'</span><span style="color: Gray;">+</span><span style="color: Blue;">str</span><span style="color: Gray;">.</span><span style="color: Blue;">replace</span><span style="color: Olive;">(</span><span style="color: #8b0000;">/</span><span style="color: Red;">\+</span><span style="color: #8b0000;">/g</span><span style="color: Gray;">,</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">%2b</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">+</span><span style="color: #8b0000;">'</span><span style="color: Red;">&quot; width=&quot;0&quot; height=&quot;0&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;</span><span style="color: #8b0000;">'</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Green;">if</span><span style="color: Olive;">(</span><span style="color: Gray;">!</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">flashId</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;">flash</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">createElement</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">div</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: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">id</span><span style="color: Gray;"> = </span><span style="color: Blue;">flashId</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Blue;">flash</span><span style="color: Gray;">.</span><span style="color: Blue;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: Blue;">flashContent</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">body</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">flash</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Green;">else</span><span style="color: Olive;">{</span><span style="color: Gray;"><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementById</span><span style="color: Olive;">(</span><span style="color: Blue;">flashId</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">innerHTML</span><span style="color: Gray;"> = </span><span style="color: Blue;">flashContent</span><span style="color: Gray;">;<br />&nbsp;&nbsp; &nbsp;</span><span style="color: Olive;">}</span><span style="color: Gray;"><br /></span><span style="color: Olive;">}</span></div></div>
<p><a href="http://www.qgy18.com/lab/clipboard/">测试地址</a></p>
<p>adobe的文档中对setClipboard有如下解释：</p>
<blockquote>
<table class="detailHeader" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="detailHeaderName">setClipboard</td>
<td class="detailHeaderParens">()</td>
<td class="detailHeaderType">方法</td>
</tr>
</tbody>
</table>
<p><code>public static function setClipboard(string:<a href="http://www.ahwww.cn/study/ActionScript3/String.html">String</a>):<a href="http://www.ahwww.cn/study/ActionScript3/specialTypes.html#void">void</a></code></p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="white-space: nowrap;" valign="top"><strong> 语言版本 : </strong></td>
<td>ActionScript 3.0</td>
</tr>
</tbody>
</table>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td style="white-space: nowrap;" valign="top"><strong> Player 版本 : </strong></td>
<td>Flash Player 9</td>
</tr>
</tbody>
</table>
<p>用指定的文本字符串替换剪贴板的内容。</p>
<p><strong>注意：</strong>出于安全方面的考虑，您无法读取系统剪贴板的内容。 换句话说，不存在相应的 <code>System.getClipboard()</code> 方法。</p>
<p><span class="label"> 参数 </span></p>
<table border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="20"></td>
<td><code><span class="label">string</span>:<a href="http://www.ahwww.cn/study/ActionScript3/String.html">String</a></code> — 要放置在系统剪贴板上的纯文本字符串，用于替换系统剪贴板上的当前内容（如果有）。</td>
</tr>
</tbody>
</table>
</blockquote>
<p>由此可见，我们只能利用flash把文字复制到系统剪贴板中，而不能把系统剪切板中的内容拷贝出来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/08/clipboard/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
