<?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; JavaScript</title>
	<atom:link href="http://www.qgy18.com/tag/javascript/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>使用js callback的一个小技巧</title>
		<link>http://www.qgy18.com/2009/04/js_callbac/</link>
		<comments>http://www.qgy18.com/2009/04/js_callbac/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 17:04:50 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=97</guid>
		<description><![CDATA[很多情况下，我们需要跨域读取数据，或者是调用别人json格式的api，都要用到js callback这种机制。通常做法是页面上定义一个A方法，再调用第三方的url并且把回调函数名A传过去。这样做固然没什么问题，但有没有更好的方法呢？ 用过jQuery的同学肯定都知道，jQuery有一个getJSON的方法，只需要两个参数（callback地址和匿名函数）就能正常工作。摘录官方示例如下： $.getJSON(&#34;htt... ]]></description>
			<content:encoded><![CDATA[<p>很多情况下，我们需要跨域读取数据，或者是调用别人json格式的api，都要用到js callback这种机制。通常做法是页面上定义一个A方法，再调用第三方的url并且把回调函数名A传过去。这样做固然没什么问题，但有没有更好的方法呢？</p>
<p>用过jQuery的同学肯定都知道，<a href="http://jQuery.com">jQuery</a>有一个getJSON的方法，只需要两个参数（callback地址和匿名函数）就能正常工作。摘录官方示例如下：</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Gray;">$.</span><span style="color: Blue;">getJSON</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=?</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; $.</span><span style="color: Blue;">each</span><span style="color: Olive;">(</span><span style="color: Blue;">data</span><span style="color: Gray;">.</span><span style="color: Blue;">items</span><span style="color: Gray;">, </span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">i</span><span style="color: Gray;">,</span><span style="color: Blue;">item</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; $</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">&lt;img/&gt;</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">attr</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">src</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">, </span><span style="color: Blue;">item</span><span style="color: Gray;">.</span><span style="color: Blue;">media</span><span style="color: Gray;">.</span><span style="color: Blue;">m</span><span style="color: Olive;">)</span><span style="color: Gray;">.</span><span style="color: Blue;">appendTo</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">#images</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Green;">if</span><span style="color: Gray;"> </span><span style="color: Olive;">(</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;"> == </span><span style="color: Maroon;">3</span><span style="color: Gray;"> </span><span style="color: Olive;">)</span><span style="color: Gray;"> </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;">;</span></div></div>
<p>很神奇吧！在这个例子中，我们并不用指定callback函数名，回调也仅仅只是一个匿名函数而已，那么它是怎么完成函数调用的呢？去看下jQuery的源代码，你会发现其实原理很简单。如果懒得看太多代码，看看下面我写的山寨版loadJSON，也能明白。</p>
<div class="hl-surround"><div class="hl-main"><span style="color: Green;">function</span><span style="color: Gray;"> </span><span style="color: Blue;">loadJSON</span><span style="color: Olive;">(</span><span style="color: Blue;">url</span><span style="color: Gray;">,</span><span style="color: Blue;">callback</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">cn</span><span style="color: Gray;"> = </span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">jscallback</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;"> + </span><span style="color: Olive;">(</span><span style="color: Gray;">+</span><span style="color: Green;">new</span><span style="color: Gray;"> </span><span style="color: Teal;">Date</span><span style="color: Olive;">())</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">s</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;">script</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Blue;">s</span><span style="color: Gray;">.</span><span style="color: Blue;">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: Gray;">;<br />&nbsp;</span><span style="color: Blue;">s</span><span style="color: Gray;">.</span><span style="color: Blue;">src</span><span style="color: Gray;"> = </span><span style="color: Blue;">url</span><span style="color: Gray;"> + </span><span style="color: Blue;">cn</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Teal;">window</span><span style="color: Olive;">[</span><span style="color: Blue;">cn</span><span style="color: Olive;">]</span><span style="color: Gray;"> = </span><span style="color: Blue;">callback</span><span style="color: Gray;">;<br />&nbsp;</span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementsByTagName</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">head</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)[</span><span style="color: Maroon;">0</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">appendChild</span><span style="color: Olive;">(</span><span style="color: Blue;">s</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Olive;">}</span><span style="color: Gray;">;<br /></span><span style="color: Blue;">loadJSON</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&amp;tagmode=any&amp;format=json&amp;jsoncallback=</span><span style="color: #8b0000;">&quot;</span><span style="color: Gray;">,<br />&nbsp;</span><span style="color: Green;">function</span><span style="color: Olive;">(</span><span style="color: Blue;">o</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp; </span><span style="color: Green;">for</span><span style="color: Olive;">(</span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">i</span><span style="color: Gray;">=</span><span style="color: Maroon;">0</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">&lt;</span><span style="color: Maroon;">3</span><span style="color: Gray;">;</span><span style="color: Blue;">i</span><span style="color: Gray;">++</span><span style="color: Olive;">){</span><span style="color: Gray;"><br />&nbsp;&nbsp; </span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">img</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;">img</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br />&nbsp;&nbsp; </span><span style="color: Blue;">img</span><span style="color: Gray;">.</span><span style="color: Blue;">src</span><span style="color: Gray;"> = </span><span style="color: Blue;">o</span><span style="color: Gray;">.</span><span style="color: Blue;">items</span><span style="color: Olive;">[</span><span style="color: Blue;">i</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">media</span><span style="color: Gray;">.</span><span style="color: Blue;">m</span><span style="color: Gray;">;<br />&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;">img</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: Olive;">})</span><span style="color: Gray;">;</span></div></div>
<p><a href="http://www.qgy18.com/lab/callback/">演示地址</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2009/04/js_callbac/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>一种很帅的JS代码书写方式</title>
		<link>http://www.qgy18.com/2008/09/cool_js_code/</link>
		<comments>http://www.qgy18.com/2008/09/cool_js_code/#comments</comments>
		<pubDate>Mon, 08 Sep 2008 16:38:19 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=47</guid>
		<description><![CDATA[最近在Dron的UCRen网站看到一种很帅的JS写法，记录一下。 UCRen是下面这样引入widget的（摘自这个页面）： &#60;script type=&#34;text/javascript&#34; src=&#34;../../ucren-engine/cache-boot.js?skin=qq&#34;&#62;&#160; import webui.FileInput;&#160; import renderfactory.FormRenderer;&#60;/script&#62; 第一眼看到这段代码，我还在想这样写JS语法分析器不报错才怪，难道是让window.onerror返回true干掉了浏览器的错误提示？这样也太... ]]></description>
			<content:encoded><![CDATA[<p>最近在Dron的<a href="http://widgets.ucren.com">UCRen网站</a>看到一种很帅的JS写法，记录一下。</p>
<p>UCRen是下面这样引入widget的（摘自<a href="http://widgets.ucren.com/ucren-documentation/examples/fileinput.html">这个页面</a>）：</p>
<div class="hl-surround"><div class="hl-main"><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: Gray;"> </span><span style="color: #00008b;">src</span><span style="color: Gray;">=</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">../../ucren-engine/cache-boot.js?skin=qq</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">&gt;</span><span style="color: Gray;"><br />&nbsp; import webui.FileInput;<br />&nbsp; import renderfactory.FormRenderer;<br /></span><span style="color: Olive;">&lt;/</span><span style="color: Green;">script</span><span style="color: Olive;">&gt;</span></div></div>
<p>第一眼看到这段代码，我还在想这样写JS语法分析器不报错才怪，难道是让window.onerror返回true干掉了浏览器的错误提示？这样也太不和谐了吧！今天仔细看了看才明白了，这个script标签是有src属性的，这样写标签里的内容会被忽略掉，不会执行也不会报错。在src链入的cache-boot.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;">scripts</span><span style="color: Gray;"> = </span><span style="color: Teal;">document</span><span style="color: Gray;">.</span><span style="color: Blue;">getElementsByTagName</span><span style="color: Olive;">(</span><span style="color: #8b0000;">&quot;</span><span style="color: Red;">script</span><span style="color: #8b0000;">&quot;</span><span style="color: Olive;">)</span><span style="color: Gray;">;<br /></span><span style="color: Green;">var</span><span style="color: Gray;"> </span><span style="color: Blue;">code</span><span style="color: Gray;"> = </span><span style="color: Blue;">scripts</span><span style="color: Olive;">[</span><span style="color: Blue;">scripts</span><span style="color: Gray;">.</span><span style="color: Blue;">length</span><span style="color: Gray;">-</span><span style="color: Maroon;">1</span><span style="color: Olive;">]</span><span style="color: Gray;">.</span><span style="color: Blue;">innerHTML</span><span style="color: Gray;">;</span></div></div>
<p>来得到那些神奇的代码，然后用正则解析成正常的script标签就OK了。原理不复杂，不过很有用。可以用它写出一些很有趣的代码来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/09/cool_js_code/feed/</wfw:commentRss>
		<slash:comments>4</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>
		<item>
		<title>慎用keyup事件</title>
		<link>http://www.qgy18.com/2008/07/keydown_keyup/</link>
		<comments>http://www.qgy18.com/2008/07/keydown_keyup/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 17:15:32 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=22</guid>
		<description><![CDATA[手册上对onkeydown的描述为“Fires when the user presses a key”，onkeyup的描述为“Fires when the user releases a key”，onkeypress的描述为&#8221;Fires when the user presses an alphanumeric key&#8221;,一个是键盘按键按下时触发，一个是按键弹起时触发，另一个是按下键盘的数字、字符键触发。为什么说要慎用keyup呢？ 设想有这么一种情况，在web页面上有一个模拟的弹出窗口，很流行的那种，然后我们监听ke... ]]></description>
			<content:encoded><![CDATA[<p>手册上对onkeydown的描述为“Fires when the user presses a key”，onkeyup的描述为“Fires when the user releases a key”，onkeypress的描述为&#8221;Fires when the user presses an alphanumeric key&#8221;,一个是键盘按键按下时触发，一个是按键弹起时触发，另一个是按下键盘的数字、字符键触发。为什么说要慎用keyup呢？</p>
<p>设想有这么一种情况，在web页面上有一个模拟的弹出窗口，很流行的那种，然后我们监听keyup事件，如果发现keyCode等于27，也就是说用户按了ESC键的时候隐藏窗口，这样能方便一部分高级用户，Google文档也这么做。但是如果弹出窗口中有一个输入框，情况就不那么妙了。因为我们通常用的输入法都有一个候选词的浮动窗口，有时候打错字了需要关闭这个浮动框口也会用到ESC，这个时候你会发现一旦按下ESC，输入法的候选词窗口连同那个弹出层一起消失了。<span id="more-22"></span></p>
<p>实际上，这个问题很好解决，我们只要把keyup换成keydown、keypress中的任何一个就可以了，在有候选词窗口出现的情况下按ESC是不会触发keydown/keypress事件的。这种错误监听事件的现象不仅仅在web上才有。以前的<a href="http://im.baidu.com">baidu hi</a>在 选择表情时，鼠标在同一个表情上来回晃动，预览区的图片会一直跳动，这个很神奇的bug就是因为hi错误地监听了每个表情的mousemove事件，导致鼠标一移动，预览区图片就重新加载，如果图片是gif格式的就始终在前几帧播放，所以看上去好像在跳动。另外以前在ubuntu下用过一个第三方的msn客户端，这个客户端在聊天窗口中按ESC会关闭当前聊天窗口，这没什么，官方的msn也是这样，但是郁闷的是在有候选词窗口的时候按ESC，聊天窗口一样会关闭，而且再次打开 之前辛辛苦苦敲进去的内容全没了，这种bug让人很无奈。</p>
<p><a href="/lab/keypress/">keydown,keyup,keypress在有输入法窗口时对ESC处理的差异</a></p>
<p><span style="color: #ff0000;">PS：</span>由于朋友的网站最近无法访问，原来的QGY WebIM测试地址已经失效了，新的测试地址是<a href="http://anriy000.512j.com/webim/">http://anriy000.512j.com/webim/</a>，另外我也暂时关闭了注册入口，新用户可以用匿名帐号登录测试，基本功能都可以使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/07/keydown_keyup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>一个超简单的WP评论表情插件</title>
		<link>http://www.qgy18.com/2008/06/my-wp-plugin/</link>
		<comments>http://www.qgy18.com/2008/06/my-wp-plugin/#comments</comments>
		<pubDate>Sun, 01 Jun 2008 12:14:02 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[WP插件]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=11</guid>
		<description><![CDATA[换上新博客平台以来的这几天，我一直在研究wp系统，我发现它的架构还是有不少亮点的，尤其是插件系统，强大得让我也跃跃欲试。于是就有了reply-face这个超简单的评论表情插件。 由于我对php以及wp api还不很了解，所以这个插件主要是靠js来实现表情插入和呈现的。这样做有好处：由于是客户端用正则表达式将表情字符转换为表情图片，所以不会占用服务器任何资源。本插... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.qgy18.com/2008/05/newblog/">换上新博客平台</a>以来的这几天，我一直在研究wp系统，我发现它的架构还是有不少亮点的，尤其是插件系统，强大得让我也跃跃欲试。于是就有了reply-face这个超简单的评论表情插件。</p>
<p>由于我对php以及wp api还不很了解，所以这个插件主要是靠js来实现表情插入和呈现的。这样做有好处：由于是客户端用正则表达式将表情字符转换为表情图片，所以不会占用服务器任何资源。本插件实际运行效果见<a href="http://www.qgy18.com/2008/06/my-wp-plugin/#respond">文后评论处</a>。</p>
<p>默认表情是老版QQ的，为了减少请求次数，选择表情时用的一张大图片，所以看上去不会动，提交评论后表情字符会被gif小图替换，会动的。JS文件大小3k，加载起来应该很快。</p>
<p><strong>下载地址：</strong><a href="http://www.qgy18.com/file/reply-face.rar">点击这里</a>。主要也就是一段JS，稍微懂点JS知识的同学应该很容易改成自己想要的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/06/my-wp-plugin/feed/</wfw:commentRss>
		<slash:comments>17</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>
