<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.qgy18.com/styles/temp01.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/JerryQu" type="application/rss+xml" ref="self"></atom:link><fs:self_link href="http://feed.feedsky.com/JerryQu" type="application/rss+xml"></fs:self_link><lastBuildDate>Thu, 14 Aug 2008 12:13:55 GMT</lastBuildDate><title>JerryQu的小站</title><description>漂来漂去</description><link>http://www.qgy18.com</link><language>en</language><pubDate>Thu, 14 Aug 2008 12:25:31 GMT</pubDate><dc:date>2008-08-14T12:25:31Z</dc:date><dc:language>en</dc:language><item><title>firebug导致的验证码失效问题</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/103874747/5163833/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://getfirebug.com/&quot;&gt;Firebug&lt;/a&gt;，就不多介绍了，搞web开发的，尤其是关注前端的估计没人不知道这个插件。最近发现打开firebug在特定的情况下会导致页面验证码失效，在此记录一下。&lt;/p&gt;
&lt;p&gt;打开firebug面板，选择网络下的图片tab，这里会记录当前页面上用到的图片url，鼠标移到记录上，firebug会显示出该图片。这本来是一个很人性化的设计，但是问题出在，firebug在显示图片的时候会再次请求服务器。这样如果鼠标移到验证码图片上，firebug向服务器去取，服务器会认为是用户刷新了验证码，重新生成一张验证码，但此时用户的页面上看到的验证码还是旧的，这样提交肯定会通不过。&lt;br /&gt;
&lt;span id=&quot;more-29&quot;&gt;&lt;/span&gt;&lt;br /&gt;
从下面这张图上可以清晰的看出，页面上的验证码是“1254”，但是鼠标移到firebug中验证码url上，firebug会再次向服务器请求验证码，服务器生成了新的验证码“9064”。这个时候再用页面上显示的验证码提交肯定就通不过了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.qgy18.com/wp-content/2008-08-14_191445.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;PS：google还说过firebug会影响gmail的性能：&lt;a href=&quot;https://mail.google.com/support/bin/answer.py?answer=77355&quot;&gt;Firebug can make Gmail slow&lt;/a&gt;。&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/08/firebug_vcode/feed/</wfw:commentRss><description>Firebug，就不多介绍了，搞web开发的，尤其是关注前端的估计没人不知道这个插件。最近发现打开firebug在特定的情况下会导致页面验证码失效，在此记录一下。 打开firebug面板，选择网络下的图片tab，这里会记录当前页面上用到的图片url，鼠标移到记录上，firebug会显示出该图片。这本来是一个很人性化的设计，但是问题出在，firebug在显示图片的时候会再次请求...</description><category>Firebug</category><category>未归类</category><category>Firefox</category><pubDate>Thu, 14 Aug 2008 20:13:55 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/08/firebug_vcode/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=29</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/08/firebug_vcode/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/103874747/5163833</fs:itemid></item><item><title>Opera下自定义右键菜单的研究</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102447235/5163833/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.opera.com&quot;&gt;Opera&lt;/a&gt;是一个来自挪威的浏览器，有着优秀的缓存机制，浏览网页速度很快，有着自己庞大的粉丝群。但是opera并没有支持上下文菜单事件，也就是说我们通常使用的依靠在页面中重写oncontextmenu事件来实现自定义右键菜单的方法不会工作。那么，有没有别的方法来实现自定义菜单呢？&lt;/p&gt;
&lt;p&gt;我们来看看三个著名的产品(&lt;a href=&quot;http://www.fckeditor.net/demo&quot;&gt;Fckeditor&lt;/a&gt;、&lt;a href=&quot;http://developer.yahoo.com/yui/examples/menu/tablecontextmenu.html&quot;&gt;YUI&lt;/a&gt;、&lt;a href=&quot;http://docs.google.com&quot;&gt;Google Doc&lt;/a&gt;)怎么解决opera没有oncontextmenu事件这个问题：&lt;span id=&quot;more-27&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.fckeditor.net/demo&quot;&gt;Fckeditor&lt;/a&gt;:Fckeditor这个开源的编辑器我想不用多介绍了吧，它的最新版本已经支持了opera。那么它是怎么处理右键菜单的呢？分析源码可以知道，它注册了onmousedown事件，并且判断鼠标按下的是不是右键，如果是就显示自定义菜单。这样看似很完美，但是有两个致命的弱点：1.默认情况下opera是不检测鼠标右键点击的，也就是右键按下时根本不触发mousedown事件。除非在“工具”-“首选项”-&amp;#8221;高级&amp;#8221;-&amp;#8221;内容&amp;#8221;-“Javascript选项”中勾选“允许脚本检测右键单击”；2.opera自身的上下文菜单会跟自定义菜单一起出现，也就是说无法preventDefault。这个问题解决起来有一点点巧妙，经过实验我们可以发现，opera下在type等于button的input上点击右键不会出现系统上下文菜单，于是我们可以在mousedown时在鼠标下放一个几乎透明的type=button的input，再在mouseup的时候隐藏这个button。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.yahoo.com/yui/examples/menu/tablecontextmenu.html&quot;&gt;YUI的MENU组件&lt;/a&gt;:YUI是一个先进的界面库，功能强大，使用简便。那么他是怎么解决这个问题的呢？相比于FCKEditor，YUI换了另外一种思路，既然Opera默认不支持检测右键点击，那就用左键点击来代替总可以吧，但是这样显然会干扰用户正常操作，于是YUI又加了一条规则，按下ctrl键的同时点击左键才等同于右键。“Hold down the control key and click with the left mouse button.”&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.google.com&quot;&gt;Google Doc&lt;/a&gt;:Google出品的web office套件。Google的技术不用怀疑，那么他是怎么解决这个问题的呢？答案是：既然不能完美解决，干脆就不解决。反正Google Doc的所有操作都不是只有右键菜单才能完成。不愧是Google！&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.qgy18.com/lab/contextmenu&quot;&gt;本文提到的两种解决方案实现代码&lt;/a&gt;&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/08/opera_contextmen/feed/</wfw:commentRss><description>Opera是一个来自挪威的浏览器，有着优秀的缓存机制，浏览网页速度很快，有着自己庞大的粉丝群。但是opera并没有支持上下文菜单事件，也就是说我们通常使用的依靠在页面中重写oncontextmenu事件来实现自定义右键菜单的方法不会工作。那么，有没有别的方法来实现自定义菜单呢？ 我们来看看三个著名的产品(Fckeditor、YUI、Google Doc)怎么解决opera没有oncontextmenu事...</description><category>前端开发</category><category>用户体验</category><category>Opera</category><pubDate>Sun, 10 Aug 2008 01:25:24 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/08/opera_contextmen/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=27</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/08/opera_contextmen/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102447235/5163833</fs:itemid></item><item><title>跨浏览器“复制到剪贴板”的解决方案</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431649/5163833/1/item.html</link><content:encoded>&lt;p&gt;众所周知，firefox的安全性比较高，但是安全带来的弊端就是很多功能不支持。比如说在IE下可以通过脚本来设当前网页为首页，firefox却不行。今天要讨论的是另外一个问题：怎么在firefox等不支持window.clipboardData的浏览器下实现复制呢？&lt;/p&gt;
&lt;p&gt;首先，我们来看&lt;a href=&quot;http://mail.163.com&quot;&gt;网易邮箱&lt;/a&gt;是怎么解决这个问题的。我们在firefox下进到写邮件页面，点击编辑器上的全部功能，然后点击左边的“复制”按钮，“您的浏览器安全设置不允许编辑器自动执行拷贝操作,请使用键盘快捷键(Ctrl+C)来完成”，网易邮箱给了我们这么一个提示。我觉得这个解决方案可以得80分，因为它告诉了我们两个信息：其一，之所以复制操作没有完成是因为我的浏览器很安全，为了安全损失一点用户体验一般用户是可以接受的；其二，它还提示了我们可以通过键盘快捷键ctrl+c来完成操作，这对刚上网的新手来说很人性化。但是，有没有更好的解决方案呢？&lt;span id=&quot;more-26&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;网上大致有两种解决方案，一种是需要修改firefox配置，其实firefox也是支持复制的，但是&lt;a href=&quot;http://hi.baidu.com/zhuang_yifan/blog/item/9d40d0ced706a50293457edc.html&quot;&gt;需要到about:config里去手动开启&lt;/a&gt;，这里不做介绍了；另外一种解决方案是本文要用到的flash。因为flash可以方便的把文字拷贝到系统剪切板中，所以我们利用flash来做跳板，只需要一行代码就能搞定：&lt;/p&gt;
&lt;p&gt;System.setClipboard(clipboard);&lt;/p&gt;
&lt;p&gt;这句代码的含义后面还会提到。有了这个swf的跳板，剩下的工作就简单了，如果浏览器不支持window.clipboardData，就在复制的时候把内容传给这个flash，就OK了，关键代码如下：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;div class=&quot;hl-main&quot;&gt;&lt;span style=&quot;color: Green;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;window&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;clipboardData&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;window&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;clipboardData&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;setData&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;Text&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashId&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;_clipboard_&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashContent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;&amp;lt;embed src=&amp;quot;clipboard.swf&amp;quot; FlashVars=&amp;quot;clipboard=&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;replace&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;\+&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;/g&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;%2b&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;&amp;quot; width=&amp;quot;0&amp;quot; height=&amp;quot;0&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashId&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flash&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;createElement&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Red;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flash&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashId&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flash&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashContent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;body&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;appendChild&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flash&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Green;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Teal;&quot;&gt;document&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;getElementById&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashId&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;innerHTML&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: Blue;&quot;&gt;flashContent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;http://www.qgy18.com/lab/clipboard/&quot;&gt;测试地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;adobe的文档中对setClipboard有如下解释：&lt;/p&gt;
&lt;blockquote&gt;
&lt;table class=&quot;detailHeader&quot; border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td class=&quot;detailHeaderName&quot;&gt;setClipboard&lt;/td&gt;
&lt;td class=&quot;detailHeaderParens&quot;&gt;()&lt;/td&gt;
&lt;td class=&quot;detailHeaderType&quot;&gt;方法&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;public static function setClipboard(string:&lt;a href=&quot;http://www.ahwww.cn/study/ActionScript3/String.html&quot;&gt;String&lt;/a&gt;):&lt;a href=&quot;http://www.ahwww.cn/study/ActionScript3/specialTypes.html#void&quot;&gt;void&lt;/a&gt;&lt;/code&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;white-space: nowrap;&quot; valign=&quot;top&quot;&gt;&lt;strong&gt; 语言版本 : &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ActionScript 3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;white-space: nowrap;&quot; valign=&quot;top&quot;&gt;&lt;strong&gt; Player 版本 : &lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Flash Player 9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;用指定的文本字符串替换剪贴板的内容。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;出于安全方面的考虑，您无法读取系统剪贴板的内容。 换句话说，不存在相应的 &lt;code&gt;System.getClipboard()&lt;/code&gt; 方法。&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;label&quot;&gt; 参数 &lt;/span&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;20&quot;&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;&lt;span class=&quot;label&quot;&gt;string&lt;/span&gt;:&lt;a href=&quot;http://www.ahwww.cn/study/ActionScript3/String.html&quot;&gt;String&lt;/a&gt;&lt;/code&gt; — 要放置在系统剪贴板上的纯文本字符串，用于替换系统剪贴板上的当前内容（如果有）。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/blockquote&gt;
&lt;p&gt;由此可见，我们只能利用flash把文字复制到系统剪贴板中，而不能把系统剪切板中的内容拷贝出来。&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/08/clipboard/feed/</wfw:commentRss><description>众所周知，firefox的安全性比较高，但是安全带来的弊端就是很多功能不支持。比如说在IE下可以通过脚本来设当前网页为首页，firefox却不行。今天要讨论的是另外一个问题：怎么在firefox等不支持window.clipboardData的浏览器下实现复制呢？ 首先，我们来看网易邮箱是怎么解决这个问题的。我们在firefox下进到写邮件页面，点击编辑器上的全部功能，然后点击左边的...</description><category>跨浏览器</category><category>前端开发</category><category>Flash</category><category>用户体验</category><category>JavaScript</category><pubDate>Sat, 09 Aug 2008 23:16:08 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/08/clipboard/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=26</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/08/clipboard/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431649/5163833</fs:itemid></item><item><title>慎用keyup事件</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431650/5163833/1/item.html</link><content:encoded>&lt;p&gt;手册上对onkeydown的描述为“Fires when the user presses a key”，onkeyup的描述为“Fires when the user releases a key”，onkeypress的描述为&amp;#8221;Fires when the user presses an alphanumeric key&amp;#8221;,一个是键盘按键按下时触发，一个是按键弹起时触发，另一个是按下键盘的数字、字符键触发。为什么说要慎用keyup呢？&lt;/p&gt;
&lt;p&gt;设想有这么一种情况，在web页面上有一个模拟的弹出窗口，很流行的那种，然后我们监听keyup事件，如果发现keyCode等于27，也就是说用户按了ESC键的时候隐藏窗口，这样能方便一部分高级用户，Google文档也这么做。但是如果弹出窗口中有一个输入框，情况就不那么妙了。因为我们通常用的输入法都有一个候选词的浮动窗口，有时候打错字了需要关闭这个浮动框口也会用到ESC，这个时候你会发现一旦按下ESC，输入法的候选词窗口连同那个弹出层一起消失了。&lt;span id=&quot;more-22&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;实际上，这个问题很好解决，我们只要把keyup换成keydown、keypress中的任何一个就可以了，在有候选词窗口出现的情况下按ESC是不会触发keydown/keypress事件的。这种错误监听事件的现象不仅仅在web上才有。以前的&lt;a href=&quot;http://im.baidu.com&quot;&gt;baidu hi&lt;/a&gt;在 选择表情时，鼠标在同一个表情上来回晃动，预览区的图片会一直跳动，这个很神奇的bug就是因为hi错误地监听了每个表情的mousemove事件，导致鼠标一移动，预览区图片就重新加载，如果图片是gif格式的就始终在前几帧播放，所以看上去好像在跳动。另外以前在ubuntu下用过一个第三方的msn客户端，这个客户端在聊天窗口中按ESC会关闭当前聊天窗口，这没什么，官方的msn也是这样，但是郁闷的是在有候选词窗口的时候按ESC，聊天窗口一样会关闭，而且再次打开 之前辛辛苦苦敲进去的内容全没了，这种bug让人很无奈。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/lab/keypress/&quot;&gt;keydown,keyup,keypress在有输入法窗口时对ESC处理的差异&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;PS：&lt;/span&gt;由于朋友的网站最近无法访问，原来的QGY WebIM测试地址已经失效了，新的测试地址是&lt;a href=&quot;http://anriy000.512j.com/webim/&quot;&gt;http://anriy000.512j.com/webim/&lt;/a&gt;，另外我也暂时关闭了注册入口，新用户可以用匿名帐号登录测试，基本功能都可以使用。&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/07/keydown_keyup/feed/</wfw:commentRss><description>手册上对onkeydown的描述为“Fires when the user presses a key”，onkeyup的描述为“Fires when the user releases a key”，onkeypress的描述为&amp;#8221;Fires when the user presses an alphanumeric key&amp;#8221;,一个是键盘按键按下时触发，一个是按键弹起时触发，另一个是按下键盘的数字、字符键触发。为什么说要慎用keyup呢？ 设想有这么一种情况，在web页面上有一个模拟的弹出窗口，很流行的那种，...</description><category>前端开发</category><category>JavaScript</category><pubDate>Mon, 28 Jul 2008 01:15:32 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/07/keydown_keyup/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=22</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/07/keydown_keyup/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431650/5163833</fs:itemid></item><item><title>Google文档开始支持pdf了</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431651/5163833/1/item.html</link><content:encoded>&lt;p&gt;记得一些天前，有人就在&lt;a href=&quot;http://docs.google.com&quot;&gt;Google文档&lt;/a&gt;的服务器上发现了pdf文档的小图标&lt;img src=&quot;http://docs.google.com/images/doclist/icon_3_pdf.gif&quot; alt=&quot;&quot; width=&quot;16&quot; height=&quot;16&quot; /&gt;，于是分析Google文档可能很快就会加上对pdf文档的支持。今天上去一看，首先就在上传文档页面发现以下文字：&lt;/p&gt;
&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;strong&gt;可上传的文件类型：&lt;/strong&gt;&lt;br /&gt;
&amp;#8230; &amp;#8230;&lt;br /&gt;
PDF 文件（来自计算机的 PDF 文件最大可为 10 MB，来自网络的最大可为 2MB）&lt;/p&gt;
&lt;p&gt;马上传来一个pdf测试了一下，发现google会把pdf一页页的显示出来，左边是内容区，右边是导航，看起来效果还不错。&lt;span id=&quot;more-19&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;但这样子没什么好玩的，无非是在服务器上把pdf处理成一张张图片，然后逐张显示出来。可神奇之处在于：如果上传的pdf里包含文字，那么在内容区是可以左键拖框选中文字的，选中后的文字会高亮显示，而且可以被复制。类似于下面这个效果：&lt;/p&gt;
&lt;p&gt;&lt;img class=&quot;alignnone size-medium wp-image-20&quot; title=&quot;google文档选中pdf上的文字&quot; src=&quot;http://www.qgy18.com/wp-content/2008-06-28_002659-300x100.gif&quot; alt=&quot;&quot; width=&quot;300&quot; height=&quot;100&quot; /&gt;&lt;/p&gt;
&lt;p&gt;实际上，这个时候并没有选中文字，而且也没有文字可选——底下依然是一张图片。这个高亮显示是一行行div拼出来的。google根据高亮div的位置算出哪些字应该被选中，然后把这些字放在一个隐藏的textarea里，至于ctrl+c时怎么把文字从文本框复制到粘贴板里去的就不清楚了，估计是用的flash，一会弄个不支持flash的浏览器验证一下我的猜想。&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/06/googledoc-pdf/feed/</wfw:commentRss><description>记得一些天前，有人就在Google文档的服务器上发现了pdf文档的小图标，于是分析Google文档可能很快就会加上对pdf文档的支持。今天上去一看，首先就在上传文档页面发现以下文字： 可上传的文件类型： &amp;#8230; &amp;#8230; PDF 文件（来自计算机的 PDF 文件最大可为 10 MB，来自网络的最大可为 2MB） 马上传来一个pdf测试了一下，发现google会把pdf一页页的显示出来，左边是内...</description><category>前端开发</category><category>Google文档</category><pubDate>Sat, 28 Jun 2008 00:53:34 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/06/googledoc-pdf/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=19</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/06/googledoc-pdf/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431651/5163833</fs:itemid></item><item><title>QGYWebIM新功能-支持匿名用户</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431652/5163833/1/item.html</link><content:encoded>&lt;p&gt;好久都没改过QGYWebIM程序了，今天加上了一个反映得比较多的功能：匿名用户登录。简单说来，就是系统允许用户不注册，通过点击匿名用户链接由系统分配一个临时帐号来进入聊天程序。这个功能一方面可以方便那些想体验本聊天系统又嫌注册麻烦的用户，另一方面此功能稍加改进可以应用在网上客服系统中。当然，临时帐号的权限很低，很多操作都被限制了，另外系统允许同时使用的临时帐号也有限制。&lt;/p&gt;
&lt;p&gt;测试地址还是在&lt;a href=&quot;http://www.shufou.com/chat/&quot;&gt;http://www.shufou.com/chat/&lt;/a&gt;，系统限制了只允许5个匿名用户同时使用，如果你收到了登录失败提示，就说明人数已经达到上限，你可以稍后再试，当然注册用户不受此限制。当前版本为beta1.4，我会等测试一段时间后放出升级包，暂时不提供此版本的下载。&lt;span id=&quot;more-16&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;PS：今天用&lt;a title=&quot;转到Google搜索结果&quot; href=&quot;http://www.google.cn/search?client=aff-cs-worldbrowser&amp;amp;forid=1&amp;amp;ie=utf-8&amp;amp;oe=UTF-8&amp;amp;hl=zh-CN&amp;amp;q=qgywebim&quot; target=&quot;_blank&quot;&gt;Google搜索了一下QGYWebim&lt;/a&gt;，发现网上不少网站转载了我的这个作品，很感谢大家看得起我，但是有一点希望大家注意下：转载时作者主页请链到本BLOG，测试地址请链到&lt;a href=&quot;http://www.shufou.com/chat/&quot;&gt;http://www.shufou.com/chat/&lt;/a&gt;。这样我才能比较好的收到bug反馈以及新功能需求，为下个版本的发布做好准备。&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #ff6600;&quot;&gt;再PS：&lt;/span&gt;今天仔细研究了一下&lt;a href=&quot;http://www.qgy18.com/2008/06/qgywebim-1-4/#comment-11&quot;&gt;ShowPHP反映的添加好友BUG&lt;/a&gt;，证实在添加好友那个文本框里输入一个不存在的email再敲回车键确实会出错，这个问题以前修正过，但是后来不知道是哪次版本更新又把老版本给传上去了。按下面方法即可解决：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;找到page目录下的AddFriend.asp文件，在添加好友那个表单任意位置加上：&lt;br /&gt;
&amp;lt;input name=&amp;#8221;tbHid&amp;#8221; type=&amp;#8221;text&amp;#8221; id=&amp;#8221;tbHid&amp;#8221; style=&amp;#8221;display:none&amp;#8221;/&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/06/qgywebim-1-4/feed/</wfw:commentRss><description>好久都没改过QGYWebIM程序了，今天加上了一个反映得比较多的功能：匿名用户登录。简单说来，就是系统允许用户不注册，通过点击匿名用户链接由系统分配一个临时帐号来进入聊天程序。这个功能一方面可以方便那些想体验本聊天系统又嫌注册麻烦的用户，另一方面此功能稍加改进可以应用在网上客服系统中。当然，临时帐号的权限很低，很多操作都被限制了...</description><category>后台技术</category><category>QGYWebIM</category><pubDate>Wed, 04 Jun 2008 18:27:59 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/06/qgywebim-1-4/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=16</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/06/qgywebim-1-4/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431652/5163833</fs:itemid></item><item><title>一个超简单的WP评论表情插件</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431653/5163833/1/item.html</link><content:encoded>&lt;p&gt;&lt;a href=&quot;http://www.qgy18.com/2008/05/newblog/&quot;&gt;换上新博客平台&lt;/a&gt;以来的这几天，我一直在研究wp系统，我发现它的架构还是有不少亮点的，尤其是插件系统，强大得让我也跃跃欲试。于是就有了reply-face这个超简单的评论表情插件。&lt;/p&gt;
&lt;p&gt;由于我对php以及wp api还不很了解，所以这个插件主要是靠js来实现表情插入和呈现的。这样做有好处：由于是客户端用正则表达式将表情字符转换为表情图片，所以不会占用服务器任何资源。本插件实际运行效果见&lt;a href=&quot;http://www.qgy18.com/2008/06/my-wp-plugin/#respond&quot;&gt;文后评论处&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;默认表情是老版QQ的，为了减少请求次数，选择表情时用的一张大图片，所以看上去不会动，提交评论后表情字符会被gif小图替换，会动的。JS文件大小3k，加载起来应该很快。&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/06/my-wp-plugin/feed/</wfw:commentRss><description>换上新博客平台以来的这几天，我一直在研究wp系统，我发现它的架构还是有不少亮点的，尤其是插件系统，强大得让我也跃跃欲试。于是就有了reply-face这个超简单的评论表情插件。 由于我对php以及wp api还不很了解，所以这个插件主要是靠js来实现表情插入和呈现的。这样做有好处：由于是客户端用正则表达式将表情字符转换为表情图片，所以不会占用服务器...</description><category>前端开发</category><category>WP插件</category><category>JavaScript</category><pubDate>Sun, 01 Jun 2008 20:14:02 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/06/my-wp-plugin/#comments</comments><guid isPermaLink="false">http://www.qgy18.com/?p=11</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/06/my-wp-plugin/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431653/5163833</fs:itemid></item><item><title>跨浏览器的本地存储解决方案</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431654/5163833/1/item.html</link><content:encoded>&lt;p&gt;有时候我们在前端开发中为了提高用户体验，减少向服务器请求的次数，常常要在用户的电脑上存储数据，即要实现浏览器的本地存储数据功能。我在这里整理了一下常用的几种方案。&lt;span id=&quot;more-6&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.针对IE6以上(含)内核的浏览器，我们可以使用UserData 行为（userData Behavior）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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存储区数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;使用：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;（1）首先必须在行内或文档的head部分声明如下样式：&lt;/p&gt;
&lt;p&gt;.userData {behavior:url(#default#userdata);}&lt;/p&gt;
&lt;p&gt;或者使用如下js代码来声明：&lt;/p&gt;
&lt;p&gt;document.documentElement.addBehavior(”#default#userdata”);&lt;/p&gt;
&lt;p&gt;（2）成员：&lt;/p&gt;
&lt;p&gt;expires 设置或取得使用userData行为保存数据的失效日期，使用方法：对象ID.expires = UTC格式的时间字符串；&lt;/p&gt;
&lt;p&gt;getAttribute() 取得指定的属性值；&lt;/p&gt;
&lt;p&gt;load(存储区名) 从userData存储区载入存储的对象数据；&lt;/p&gt;
&lt;p&gt;removeAttribute() 删除指定的属性值；&lt;/p&gt;
&lt;p&gt;save(存储区名) 将对象存储到一个userData存储区；&lt;/p&gt;
&lt;p&gt;setAttribute() 设置指定的属性值；&lt;/p&gt;
&lt;p&gt;XMLDocument 取得存储该对象数据的XML DOM引用&lt;/p&gt;
&lt;p&gt;（3）示例：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;document.documentElement.addBehavior(&quot;#default#userdata&quot;);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;document.documentElement.load(&quot;t&quot;);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;document.documentElement.setAttribute(&quot;value&quot;, &quot;test&quot;);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;document.documentElement.save(&quot;t&quot;);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2.针对Firefox2&lt;/strong&gt;&lt;strong&gt;(含)&lt;/strong&gt;&lt;strong&gt;以上内核的浏览器，我们可以使用globalStorage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a global object (&lt;code&gt;globalStorage&lt;/code&gt;) 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).&lt;/p&gt;
&lt;p&gt;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:&lt;/p&gt;
&lt;p&gt;globalStorage[’developer.mozilla.org’] - All web pages within the developer.mozilla.org sub-domain can both read and write data to this storage object.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;使用：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;globalStorage[location.hostname][&quot;t&quot;] = &amp;#8220;test&amp;#8221;;//赋值&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;var ret = globalStorage[location.hostname][&quot;t&quot;];//取值&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;globalStorage.removeItem(&quot;t&quot;);//删除&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;备注：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在firefox2中，我们可以在tc-eb-test00.tc.baidu.com 上的页面内使用globalStorage[&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;baidu.com&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;][&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;t&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;]=&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;test&lt;span style=&quot;font-family: Lucida Sans Unicode;&quot;&gt;“&lt;/span&gt;来赋值，但是到了firefox3这么做却会得到一个错误提示，原因是firefox3的安全策略要求在使用 globalStorage时，指定的域名和实际的域名必须严格匹配！&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3.Database Storage，HTML5里的内容，目前仅有Safari支持&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This section is non-normative.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;使用：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;init:function(){&lt;br /&gt;
if(!this._inited){&lt;br /&gt;
this._db.transaction(function(t){&lt;br /&gt;
t.executeSql(&amp;#8221;CREATE TABLE &amp;#8220;+this.name+&amp;#8221; (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)&amp;#8221;,[],function(){});&lt;br /&gt;
},function(){});&lt;br /&gt;
this._inited = true;&lt;br /&gt;
}&lt;br /&gt;
},&lt;br /&gt;
get:function(key,fn){&lt;br /&gt;
var ret = &amp;#8220;&amp;#8221;;&lt;br /&gt;
this._db.transaction(function(t){&lt;br /&gt;
t.executeSql(&amp;#8221;SELECT v FROM &amp;#8220;+this.name+&amp;#8221; Where k=?&amp;#8221;, [key], function(t, r){&lt;br /&gt;
if(r.rows.length&amp;gt;0){&lt;br /&gt;
ret=r.rows.item(0)['v'];&lt;br /&gt;
if(fn)fn.call(this,ret);};&lt;br /&gt;
},function(){&lt;br /&gt;
if(fn)fn.call(this,ret);&lt;br /&gt;
});&lt;br /&gt;
});&lt;br /&gt;
},&lt;br /&gt;
set:function(key,value){&lt;br /&gt;
this.remove(key);&lt;br /&gt;
this._db.transaction(function(t){&lt;br /&gt;
t.executeSql(&amp;#8221;INSERT INTO &amp;#8220;+this.name+&amp;#8221; (k,v) VALUES (?, ?)&amp;#8221;, [key,value],function(){});&lt;br /&gt;
},function(){});&lt;br /&gt;
},&lt;br /&gt;
remove:function(key){&lt;br /&gt;
this._db.transaction(function(t){&lt;br /&gt;
t.executeSql(&amp;#8221;DELETE FROM &amp;#8220;+this.name+&amp;#8221; WHERE k=?&amp;#8221;, [key],function(){});&lt;br /&gt;
},function(){});&lt;br /&gt;
}&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4.针对其它浏览器，如常见的Opera，我们可以使用Cookie&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;说明：&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;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.&lt;/p&gt;
&lt;p&gt;You can use the Microsoft® JScript® split method to extract a value stored in a cookie.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;使用：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;function SetCookie(sName, sValue){&lt;br /&gt;
&lt;/code&gt;&lt;code&gt;var &lt;/code&gt;&lt;code&gt;date = new Date();&lt;br /&gt;
document.cookie = sName + &quot;=&quot; + escape(sValue) + &quot;; expires=&quot; + date.toGMTString();&lt;br /&gt;
}&lt;br /&gt;
function GetCookie(sName){&lt;br /&gt;
var aCookie = document.cookie.split(&quot;; &quot;);&lt;br /&gt;
for (var i=0; i &amp;lt; aCookie.length; i++){&lt;br /&gt;
var aCrumb = aCookie[i].split(&amp;#8221;=&amp;#8221;);&lt;br /&gt;
if (sName == aCrumb[0])&lt;br /&gt;
return unescape(aCrumb[1]);&lt;br /&gt;
}&lt;br /&gt;
return null;&lt;br /&gt;
}&lt;br /&gt;
function DelCookie(sName){&lt;br /&gt;
document.cookie = sName + &amp;#8220;=&amp;#8221; + escape(sValue) + &amp;#8220;; expires=Fri, 31 Dec 1999 23:59:59 GMT;&amp;#8221;;&lt;br /&gt;
}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;备注：&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现代浏览器一般默认都支持cookie，但是使用cookie也有几个致命的弱点：存储的信息量太少，页面向服务器发送请求的同时cookie也会被发送，无形中浪费用户的带宽。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5.其它解决方案&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Google Gear：Google开发出的一种本地存储技术；&lt;/p&gt;
&lt;p&gt;Flash：利用Flash也可以实现本地存储&lt;/p&gt;
&lt;p&gt;这两种方法的优点是：能支持所有的OS和浏览器(Google Gear目前仅支持IE5+和Firefox1.5+)；缺点是需要用户安装额外的插件，使用起来不如前面其它3种方法简便。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6.一些链接&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://developer.mozilla.org/en/docs/DOM:Storage&quot; target=&quot;_blank&quot;&gt;DOM:Storage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;external text&quot; title=&quot;http://en.wikipedia.org/wiki/HTTP_cookie&quot; rel=&quot;nofollow&quot; href=&quot;http://en.wikipedia.org/wiki/HTTP_cookie&quot; target=&quot;_blank&quot;&gt;HTTP cookies&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;external text&quot; title=&quot;http://www.macromedia.com/support/documentation/en/flashplayer/help/help02.html&quot; rel=&quot;nofollow&quot; href=&quot;http://www.macromedia.com/support/documentation/en/flashplayer/help/help02.html&quot; target=&quot;_blank&quot;&gt;Flash Local Storage&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;external text&quot; title=&quot;http://msdn2.microsoft.com/en-us/library/ms531424.aspx&quot; rel=&quot;nofollow&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/ms531424.aspx&quot; target=&quot;_blank&quot;&gt;Internet Explorer userData behavior&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/#sql&quot;&gt;http://www.whatwg.org/specs/web-apps/current-work/#sql&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;by Rank Liu&quot; href=&quot;http://www.never-online.net/blog/article.asp?id=219&quot;&gt;safari的一些杂记&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/05/localstorage/feed/</wfw:commentRss><description>有时候我们在前端开发中为了提高用户体验，减少向服务器请求的次数，常常要在用户的电脑上存储数据，即要实现浏览器的本地存储数据功能。我在这里整理了一下常用的几种方案。 1.针对IE6以上(含)内核的浏览器，我们可以使用UserData 行为（userData Behavior） 说明： userData 行为通过将数据写入一个UserData存储区（UserData store）来保存数据，userData可以将数据以XM...</description><category>跨浏览器</category><category>客户端存储</category><category>前端开发</category><category>JavaScript</category><pubDate>Fri, 30 May 2008 15:43:55 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/05/localstorage/#comments</comments><guid isPermaLink="false">http://anriy001.512j.com/?p=6</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/05/localstorage/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431654/5163833</fs:itemid></item><item><title>新博客开张啦</title><link>http://item.feedsky.com/~feedsky/JerryQu/~7055806/102431655/5163833/1/item.html</link><content:encoded>&lt;p&gt;以前那个博客程序是自己写的，有不少问题。正好借这个域名到期之际换上流行的&lt;a href=&quot;http://www.wordpress.org/&quot; target=&quot;_blank&quot;&gt;WordPress&lt;/a&gt;平台吧。:-)&lt;/p&gt;
&lt;p&gt;原来那个博客仍然保留，访问地址更改为&lt;a href=&quot;http://old.qgy18.com&quot;&gt;http://old.qgy18.com&lt;/a&gt;，静态页面列表为&lt;a href=&quot;http://old.qgy18.com/html&quot;&gt;http://old.qgy18.com/html/&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;新博客，新开始～&lt;/p&gt;</content:encoded><wfw:commentRss>http://www.qgy18.com/2008/05/newblog/feed/</wfw:commentRss><description>以前那个博客程序是自己写的，有不少问题。正好借这个域名到期之际换上流行的WordPress平台吧。:-) 原来那个博客仍然保留，访问地址更改为http://old.qgy18.com，静态页面列表为http://old.qgy18.com/html/。 新博客，新开始...</description><category>未归类</category><pubDate>Fri, 30 May 2008 14:38:34 +0800</pubDate><author>admin</author><comments>http://www.qgy18.com/2008/05/newblog/#comments</comments><guid isPermaLink="false">http://anriy001.512j.com/?p=5</guid><dc:creator>admin</dc:creator><fs:srclink>http://www.qgy18.com/2008/05/newblog/</fs:srclink><fs:srcfeed>http://www.qgy18.com/feed/</fs:srcfeed><fs:itemid>feedsky/JerryQu/~7055806/102431655/5163833</fs:itemid></item></channel></rss>