<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JerryQu的小站 &#187; 用户体验</title>
	<atom:link href="http://www.qgy18.com/tag/%e7%94%a8%e6%88%b7%e4%bd%93%e9%aa%8c/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>Opera下自定义右键菜单的研究</title>
		<link>http://www.qgy18.com/2008/08/opera_contextmen/</link>
		<comments>http://www.qgy18.com/2008/08/opera_contextmen/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 17:25:24 +0000</pubDate>
		<dc:creator>Jerry Qu</dc:creator>
				<category><![CDATA[前端开发]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[用户体验]]></category>

		<guid isPermaLink="false">http://www.qgy18.com/?p=27</guid>
		<description><![CDATA[Opera是一个来自挪威的浏览器，有着优秀的缓存机制，浏览网页速度很快，有着自己庞大的粉丝群。但是opera并没有支持上下文菜单事件，也就是说我们通常使用的依靠在页面中重写oncontextmenu事件来实现自定义右键菜单的方法不会工作。那么，有没有别的方法来实现自定义菜单呢？ 我们来看看三个著名的产品(Fckeditor、YUI、Google Doc)怎么解决opera没有oncontextmenu事件这个问题： Fck... ]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.opera.com">Opera</a>是一个来自挪威的浏览器，有着优秀的缓存机制，浏览网页速度很快，有着自己庞大的粉丝群。但是opera并没有支持上下文菜单事件，也就是说我们通常使用的依靠在页面中重写oncontextmenu事件来实现自定义右键菜单的方法不会工作。那么，有没有别的方法来实现自定义菜单呢？</p>
<p>我们来看看三个著名的产品(<a href="http://www.fckeditor.net/demo">Fckeditor</a>、<a href="http://developer.yahoo.com/yui/examples/menu/tablecontextmenu.html">YUI</a>、<a href="http://docs.google.com">Google Doc</a>)怎么解决opera没有oncontextmenu事件这个问题：<span id="more-27"></span></p>
<p><a href="http://www.fckeditor.net/demo">Fckeditor</a>:Fckeditor这个开源的编辑器我想不用多介绍了吧，它的最新版本已经支持了opera。那么它是怎么处理右键菜单的呢？分析源码可以知道，它注册了onmousedown事件，并且判断鼠标按下的是不是右键，如果是就显示自定义菜单。这样看似很完美，但是有两个致命的弱点：1.默认情况下opera是不检测鼠标右键点击的，也就是右键按下时根本不触发mousedown事件。除非在“工具”-“首选项”-&#8221;高级&#8221;-&#8221;内容&#8221;-“Javascript选项”中勾选“允许脚本检测右键单击”；2.opera自身的上下文菜单会跟自定义菜单一起出现，也就是说无法preventDefault。这个问题解决起来有一点点巧妙，经过实验我们可以发现，opera下在type等于button的input上点击右键不会出现系统上下文菜单，于是我们可以在mousedown时在鼠标下放一个几乎透明的type=button的input，再在mouseup的时候隐藏这个button。</p>
<p><a href="http://developer.yahoo.com/yui/examples/menu/tablecontextmenu.html">YUI的MENU组件</a>:YUI是一个先进的界面库，功能强大，使用简便。那么他是怎么解决这个问题的呢？相比于FCKEditor，YUI换了另外一种思路，既然Opera默认不支持检测右键点击，那就用左键点击来代替总可以吧，但是这样显然会干扰用户正常操作，于是YUI又加了一条规则，按下ctrl键的同时点击左键才等同于右键。“Hold down the control key and click with the left mouse button.”</p>
<p><a href="http://docs.google.com">Google Doc</a>:Google出品的web office套件。Google的技术不用怀疑，那么他是怎么解决这个问题的呢？答案是：既然不能完美解决，干脆就不解决。反正Google Doc的所有操作都不是只有右键菜单才能完成。不愧是Google！</p>
<p><a href="http://www.qgy18.com/lab/contextmenu">本文提到的两种解决方案实现代码</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qgy18.com/2008/08/opera_contextmen/feed/</wfw:commentRss>
		<slash:comments>2</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>
