<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_雨中漫步的太阳</title><subtitle type="text">雨中漫步,笑看人生百态,优哉游哉</subtitle><id>http://feed.cnblogs.com/blog/u/32598/rss</id><updated>2011-09-24T11:07:51Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/32598/rss"/><entry><id>http://www.cnblogs.com/suyuan/archive/2011/09/24/2189624.html</id><title type="text">基于跨数据库的事务的一个讨论,希望参考下大家的意见</title><summary type="text">多个数据进行数据操作, 基于性能方面的考虑首先排除掉了分布式事务, 后来参考了 ebay 的 用消息队列和消息应用状态表来消除分布式事务 原文可以看这里http://rdc.taobao.com/blog/cs/?p=671大致是这样的一个过程:begin;INSERTINTOtransactionVALUES(xid,$seller_id,$buyer_id,$amount);put_to_queue“updateuser(“seller”,$seller_id,amount);put_to_queue“updateuser(“buyer”,$buyer_id,amount);commit;</summary><published>2011-09-24T11:08:00Z</published><updated>2011-09-24T11:08:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2011/09/24/2189624.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2011/09/24/2189624.html"/><content type="html">&lt;p&gt;多个数据进行数据操作, 基于性能方面的考虑首先排除掉了分布式事务, &lt;/p&gt;&lt;p&gt;后来参考了 ebay 的 &amp;nbsp;&lt;span style="font-size: 10pt; "&gt;用消息队列和消息应用状态表来消除分布式事务 原文可以看这里&amp;nbsp;&lt;/span&gt;&lt;span style="font-size: 28px; line-height: 42px; "&gt;&lt;/span&gt;&lt;a href="http://rdc.taobao.com/blog/cs/?p=671"&gt;http://rdc.taobao.com/blog/cs/?p=671&lt;/a&gt;&lt;/p&gt;&lt;p&gt;大致是这样的一个过程:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;begin&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;INSERT&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;INTO&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;transaction&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;VALUES&lt;/span&gt;(xid,&amp;nbsp;$seller_id,&amp;nbsp;$buyer_id,&amp;nbsp;$amount);&lt;br /&gt;put_to_queue&amp;nbsp;&amp;#8220;&lt;span style="color: #0000FF;"&gt;update&lt;/span&gt;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;user&lt;/span&gt;(&amp;#8220;seller&amp;#8221;,&amp;nbsp;$seller_id,&amp;nbsp;amount);&lt;br /&gt;put_to_queue&amp;nbsp;&amp;#8220;&lt;span style="color: #0000FF;"&gt;update&lt;/span&gt;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;user&lt;/span&gt;(&amp;#8220;buyer&amp;#8221;,&amp;nbsp;$buyer_id,&amp;nbsp;amount);&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;commit&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;each&amp;nbsp;message&amp;nbsp;&lt;span style="color: #808080;"&gt;in&lt;/span&gt;&amp;nbsp;queue&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;begin&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;SELECT&lt;/span&gt;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;count&lt;/span&gt;(&lt;span style="color: #808080;"&gt;*&lt;/span&gt;)&amp;nbsp;&lt;span style="color: #0000FF;"&gt;as&lt;/span&gt;&amp;nbsp;cnt&amp;nbsp;&lt;span style="color: #0000FF;"&gt;FROM&lt;/span&gt;&amp;nbsp;message_applied&amp;nbsp;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&amp;nbsp;msg_id&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;message.id;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;cnt&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;&lt;span style="color: #800000; font-weight: bold;"&gt;0&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;message.type&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;&amp;#8220;seller&amp;#8221;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;UPDATE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;user&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;SET&lt;/span&gt;&amp;nbsp;amt_sold&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;amt_sold&amp;nbsp;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&amp;nbsp;message.amount&amp;nbsp;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&amp;nbsp;id&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;message.&lt;span style="color: #FF00FF;"&gt;user_id&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;UPDATE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #FF00FF;"&gt;user&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;SET&lt;/span&gt;&amp;nbsp;amt_bought&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;amt_bought&amp;nbsp;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&amp;nbsp;message.amount&amp;nbsp;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&amp;nbsp;id&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;message.&lt;span style="color: #FF00FF;"&gt;user_id&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;INSERT&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;INTO&lt;/span&gt;&amp;nbsp;message_applied&amp;nbsp;&lt;span style="color: #0000FF;"&gt;VALUES&lt;/span&gt;(message.id);&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;commit&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;上述事务成功&lt;br /&gt;dequeue&amp;nbsp;message&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;DELETE&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;FROM&lt;/span&gt;&amp;nbsp;message_applied&amp;nbsp;&lt;span style="color: #0000FF;"&gt;WHERE&lt;/span&gt;&amp;nbsp;msg_id&amp;nbsp;&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&amp;nbsp;message.id;&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;end&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #0000ff; font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;end&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;但是这样子搞 如果 操作A库成功了 而操作B库失败了 &amp;nbsp;我可以在很短时间内重试, 如果重试失败了的话, 我必须对A 库的数据进行手工回滚 , 但是随后提出的另外的一个意见 ,于其如此不如像这样的一个结构&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; color: #0000ff; "&gt;boolean&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;&amp;nbsp;flag&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; color: #0000ff; "&gt;false&lt;/span&gt;&lt;span style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; background-color: #f5f5f5; "&gt;;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;begin;&lt;br /&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;dosomething&amp;nbsp;A&amp;nbsp;库&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;commit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;flag&amp;nbsp;=&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;;&lt;br /&gt;}&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;(Exception&amp;nbsp;e){&lt;br /&gt;&amp;nbsp;&amp;nbsp;rollback;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(flag){&lt;br /&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;begin;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;dosomething&amp;nbsp;B&amp;nbsp;库&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;commit;&lt;br /&gt;}&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;(Exception&amp;nbsp;e){&lt;br /&gt;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;手工回滚&amp;nbsp;A&amp;nbsp;库&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;rollback;&lt;br /&gt;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;后者似乎更加简单 方便, 前者虽然可以让数据最终达到一致,但是不可避免的是由于数据获取其他的因素必须回滚 前者似乎并没有达到预期的效果.&amp;nbsp;&lt;/p&gt;&lt;p&gt;系统大家讨论下 两种方式的利于弊. &amp;nbsp;同时也讨论下夸库事务是否有更好的办法&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/suyuan/aggbug/2189624.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/suyuan/archive/2011/09/24/2189624.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/suyuan/articles/1790237.html</id><title type="text">Js 复制到剪贴板，兼容各浏览器 Zero Clipboard swf</title><summary type="text">web开发中常常要实现“复制到剪切板”功能。这个功能很实用，但是由于安全问题，浏览器的限制越来越严，实现的方法也越来越有限了。Firefox 默认下不能直接通过Javascript操作剪切板，必须开启相关的设置才行。想只通过Javascript技术实现跨浏览器的剪切板是行不通的。现在常用的方法是利用JavaScript+Flash实现，普遍流传的办法是_clipboard.swf，这是国外最早实现...</summary><published>2010-08-02T02:06:00Z</published><updated>2010-08-02T02:06:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/articles/1790237.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/articles/1790237.html"/><content type="html">&lt;p&gt;web开发中常常要实现“复制到剪切板”功能。这个功能很实用，但是由于安全问题，浏览器的限制越来越严，实现的方法也越来越有限了。Firefox 默认下不能直接通过Javascript操作剪切板，必须开启相关的设置才行。想只通过Javascript技术实现跨浏览器的剪切板是行不通的。现在常用的方法是利用JavaScript+Flash实现，普遍流传的办法是_clipboard.swf，这是国外最早实现的（著名的Clipboard Copy解决方案: &lt;a href="http://www.jeffothy.com/weblog/clipboard-copy/"&gt;http://www.jeffothy.com/weblog/clipboard-copy/&lt;/a&gt;）。但是很可惜，_clipboard.swf在新出来的flash10中无效，因为flash10中规定了只有在swf上进行了实际的操作（比如鼠标点击）才能启动剪切板。而_clipboard.swf方法的swf是隐藏的，通过JavaScript来操作flash的剪切板，显然没有对swf进行实际的用户操作。&lt;/p&gt;  &lt;p&gt;&amp;#160; 本文将介绍一个跨浏览器的库类 Zero Clipboard 。它利用 Flash 进行复制，所以只要浏览器装有 Flash 就可以运行，而且比 IE 的 document.execCommand(&amp;quot;Copy&amp;quot;) 更加灵活。&lt;/p&gt;  &lt;p&gt;Zero Clipboard 的实现原理   &lt;br /&gt;Zero Clipboard 利用 Flash 进行复制，之前有 Clipboard Copy 解决方案，其利用的是一个隐藏的 Flash。但最新的 Flash Player 10 只允许在 Flash 上进行操作才能启动剪贴板。所以 Zero Clipboard 对此进行了改进，用了一个透明的 Flash ，让其漂浮在按钮之上，这样其实点击的不是按钮而是 Flash ，也就可以使用 Flash 的复制功能了。&lt;/p&gt;  &lt;p&gt;如何使用 Zero Clipboard   &lt;br /&gt;首先下载 Zero Clipboard ，并解压缩。其中需要两个文件：ZeroClipboard.js 和 ZeroClipboard.swf ，将这两个文件放入到你的项目中。&lt;/p&gt;  &lt;p&gt;Zero Clipboard项目主页： &lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.google.com/p/zeroclipboard/"&gt;http://code.google.com/p/zeroclipboard/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;演示地址：   &lt;br /&gt;&lt;a href="http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/"&gt;http://bowser.macminicolo.net/~jhuckaby/zeroclipboard/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;核心功能   &lt;br /&gt;第一步，导入 ZeroClipboard.js 文件：&lt;/p&gt;  &lt;p&gt;XML/HTML代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;ZeroClipboard.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;再设置 ZeroClipboard.swf 文件的路径：&lt;/p&gt;  &lt;p&gt;XML/HTML代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;ZeroClipboard.setMoviePath( &amp;quot;ZeroClipboard.swf&amp;quot; );&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;注意：以上 ZeroClipboard.js, ZeroClipboard.swf 两个文件的路径都需要替换为你项目中对应文件的路径。或者也可以是一个绝对路径。&lt;/p&gt;  &lt;p&gt;然后就使用了：   &lt;br /&gt;复制代码 代码如下:&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&lt;/li&gt;    &lt;li&gt;var clip = new ZeroClipboard.Client(); // 新建一个对象 &lt;/li&gt;    &lt;li&gt;clip.setHandCursor( true ); // 设置鼠标为手型 &lt;/li&gt;    &lt;li&gt;clip.setText(&amp;quot;哈哈&amp;quot;); // 设置要复制的文本。 &lt;/li&gt;    &lt;li&gt;// 注册一个 button，参数为 id。点击这个 button 就会复制。 &lt;/li&gt;    &lt;li&gt;//这个 button 不一定要求是一个 input 按钮，也可以是其他 DOM 元素。 &lt;/li&gt;    &lt;li&gt;clip.glue(&amp;quot;copy-botton&amp;quot;); // 和上一句位置不可调换&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;这样，这样基本功能实现了，点击按钮就可以复制设置好的文本了。你可能注意到了，待复制的文本是固定的，如果想要动态改变的怎么办，比如复制一个输入框中的内容。不用担心，下面会讲到的。&lt;/p&gt;  &lt;p&gt;其他函数   &lt;br /&gt;Zero Clipboard 还提供了一些其他的函数，其中有一些非常有用。&lt;/p&gt;  &lt;p&gt;reposition() 方法   &lt;br /&gt;因为按钮上漂浮有一个 Flash 按钮，所以当页面大小发生变化时，Flash 按钮可能会错位，这样就点不着了。 不要紧，Zero Clipboard 提供了一个 reposition() 方法，可以重新计算 Flash 按钮的位置。我们可以将它绑定到 resize 事件上。    &lt;br /&gt;复制代码 代码如下:&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;bind(window, &amp;quot;resize&amp;quot;, function(){&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;clip.reposition();&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;});&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;bind 是一个跨浏览器的事件绑定函数。   &lt;br /&gt;=========================================================    &lt;br /&gt;这个想必大家都已知道。IE 的事件绑定函数是 attachEvent；而 Firefox, Safari 是 addEventListener；Opera 则两种都支持。下面进行封装。    &lt;br /&gt;复制代码 代码如下:&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;/************************************ &lt;/li&gt;    &lt;li&gt;* 添加事件绑定 &lt;/li&gt;    &lt;li&gt;* @param obj : 要绑定事件的元素 &lt;/li&gt;    &lt;li&gt;* @param type : 事件名称。不加 &amp;quot;on&amp;quot;. 如 : &amp;quot;click&amp;quot; 而不是 &amp;quot;onclick&amp;quot;. &lt;/li&gt;    &lt;li&gt;* @param fn : 事件处理函数 &lt;/li&gt;    &lt;li&gt;************************************/&lt;/li&gt;    &lt;li&gt;function bind( obj, type, fn ) {&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;if ( obj.attachEvent ) {&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;obj['e'+type+fn] = fn;&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;obj[type+fn] = function(){obj['e'+type+fn]( window.event );}&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;obj.attachEvent( 'on'+type, obj[type+fn] );&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;} else&lt;/li&gt;    &lt;li&gt;obj.addEventListener( type, fn, false );&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;}&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;例如添加一个页面点击事件：   &lt;br /&gt;复制代码 代码如下:&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;bind(document, &amp;quot;click&amp;quot;, function() {&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;alert(&amp;quot;Hello, World!!&amp;quot;);&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;});&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;=========================================================   &lt;br /&gt;hide() 和 show() 方法    &lt;br /&gt;这两个方法可以隐藏和显示 Flash 按钮 。其中 show() 方法会调用 reposition() 方法。&lt;/p&gt;  &lt;p&gt;setCSSEffects() 方法   &lt;br /&gt;当鼠标移到按钮上或点击时，由于有 Flash 按钮的遮挡，所以像 css &amp;quot;:hover&amp;quot;, &amp;quot;:active&amp;quot; 等伪类可能会失效。setCSSEffects() 方法就是解决这个问题。首先我们需要将伪类改成类，比如：    &lt;br /&gt;复制代码 代码如下:&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;#copy-botton:hover{ &lt;/li&gt;    &lt;li&gt;border-color:#FF6633;&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;}&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;// 可以改成下面的 &amp;quot;:hover&amp;quot; 改成 &amp;quot;.hover&amp;quot; &lt;/li&gt;    &lt;li&gt;#copy-botton.hover{ &lt;/li&gt;    &lt;li&gt;border-color:#FF6633;&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;}&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;我们可以调用 clip.setCSSEffects( true ); 这样 Zero Clipboard 会自动为我们处理：将类 .hover 当成伪类 :hover 。&lt;/p&gt;  &lt;p&gt;getHTML() 方法   &lt;br /&gt;如果你想自己实例一个 Flash ，不用 Zero Clipboard 的附着方法，那么这个方法就可以帮上忙了。它接受两个参数，分别为 Flash 的宽度和高度。返回的是 Flash 对应的 HTML 代码。例如：&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;var html = clip.getHTML( 150, 20 );&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;你可以用 innerHTML 或直接 document.write(); 进行输出。   &lt;br /&gt;以下是我测试下输出的 HTML 代码：&lt;/p&gt;  &lt;p&gt;XML/HTML代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&amp;lt;embed id=&amp;quot;ZeroClipboardMovie_1&amp;quot; src=&amp;quot;zeroclipboard/ZeroClipboard.swf&amp;quot; loop=&amp;quot;false&amp;quot; menu=&amp;quot;false&amp;quot; quality=&amp;quot;best&amp;quot; bgcolor=&amp;quot;#ffffff&amp;quot; width=&amp;quot;150&amp;quot; height=&amp;quot;20&amp;quot; name=&amp;quot;ZeroClipboardMovie_1&amp;quot; align=&amp;quot;middle&amp;quot; allowScriptAccess=&amp;quot;always&amp;quot; allowFullScreen=&amp;quot;false&amp;quot; type=&amp;quot;application/x-shockwave-flash&amp;quot; pluginspage=&amp;quot;http://www.macromedia.com/go/getflashplayer&amp;quot; flashvars=&amp;quot;id=1&amp;amp;width=150&amp;amp;height=20&amp;quot; wmode=&amp;quot;transparent&amp;quot; /&amp;gt;&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;IE 的 Flash JavaScript 通信接口上有一个 bug 。你必须插入一个 object 标签到一个已存在的 DOM 元素中。并且在写入 innerHTML 之前请确保该元素已经 appendChild 方法插入到 DOM 中。&lt;/p&gt;  &lt;p&gt;Zero Clipboard 事件处理   &lt;br /&gt;Zero Clipboard 提供了一些事件，你可以自定义函数处理这些事件。Zero Clipboard 事件处理函数为 addEventListener(); 例如当 Flash 完全载入后会触发一个事件 &amp;quot;load&amp;quot; 。&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;clip.addEventListener( &amp;quot;load&amp;quot;, function(client) {&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;alert(&amp;quot;Flash 加载完毕！&amp;quot;);&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;});&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Zero Clipboard 会将 clip 对象作为参数传入。即上例中的 &amp;quot;client&amp;quot; 。   &lt;br /&gt;还有 &amp;quot;load&amp;quot; 也可以写成 &amp;quot;onLoad&amp;quot;，其他的事件也可以这样。&lt;/p&gt;  &lt;p&gt;其他事件还包括：&lt;/p&gt;  &lt;p&gt;mouseOver 鼠标移上事件   &lt;br /&gt;mouseOut 鼠标移出事件    &lt;br /&gt;mouseDown 鼠标按下事件    &lt;br /&gt;mouseUp 鼠标松开事件    &lt;br /&gt;complete 复制成功事件    &lt;br /&gt;其中 mouseOver 事件和 complete 事件比较常用。    &lt;br /&gt;前面说过，如果需要动态改变待复制的内容，那 mouseOver 事件就可以派上用场了。例如需要动态复制一个 id 为 test 的输入框中的值，我们可以在鼠标 over 的时候重新设置值。&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;clip.addEventListener( &amp;quot;mouseOver&amp;quot;, function(client) {&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;var test = document.getElementById(&amp;quot;test&amp;quot;);&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;client.setText( test.value ); // 重新设置要复制的值 &lt;/li&gt;    &lt;li&gt;});&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;复制成功：&lt;/p&gt;  &lt;p&gt;JavaScript代码&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;clip.addEventListener( &amp;quot;complete&amp;quot;, function(){&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;alert(&amp;quot;复制成功！&amp;quot;);&amp;#160;&amp;#160;&amp;#160; &lt;/li&gt;    &lt;li&gt;});&amp;#160;&amp;#160; &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;好了，就介绍到这里吧。赶快自己试验下吧。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/suyuan/aggbug/1790237.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/suyuan/articles/1790237.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/11/22/1607986.html</id><title type="text">Wave帮助、技巧、术语集</title><summary type="text">Wave帮助、技巧、术语集Wave帮助、技巧、术语集【请在这里讨论和交流，请勿回复本Wave，本Wave信息将持续更新】温馨提示：欢迎加入此Wave并遵守Wave公约，勿改动删除此主题以及任何信息，让此ʅʃʅʃ更好的为您服务。Wave的术语Wave（波浪）一组会话，它可以是一个用户、一组用户或机器人的会话，有点类似于IM里的一组聊天历史记录。Wavelet（小波或小浪）Wave的子集，就像IM里一...</summary><published>2009-11-22T03:19:00Z</published><updated>2009-11-22T03:19:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/11/22/1607986.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/11/22/1607986.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/11/09/1598892.html</id><title type="text">从IBatis2.X 移植到IBatis3.0  sqlMapConfig and sqlMap XML 配置文件升级说明</title><summary type="text">以下将介绍 从Ibatis2.X 升级到 Ibatis3.0 配置文件的升级,这仅仅是一个初步的修改意见,我已经决定并开始移植工作, 我没有很多的时间去测试它,所以目前我不能保证他完全正确,但是我会通过你们的建议让他逐步的完善准确. 新的 sqlMapConfig.xml DTD:&amp;lt;!DOCTYPE configuration PUBLIC "-//ibatis.apache.org//DT...</summary><published>2009-11-09T03:10:00Z</published><updated>2009-11-09T03:10:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/11/09/1598892.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/11/09/1598892.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/11/04/1595638.html</id><title type="text">.NET正则基础&amp;mdash;&amp;mdash;.NET正则类及方法应用[转载]</title><summary type="text">1 概述  初学正则时，对于Regex类不熟悉，遇到问题不知道该用哪种方法解决，本文结合一些正则应用的典型应用场景，介绍一下Regex类的基本应用。这里重点进行.NET类的介绍，对于正则的运用，不做深入探讨。  正则的应用最终都是进行模式的匹配，而根据目的的不同，基本上可以分为以下几种应用：验证、提取、替换、分割。结合.NET提供的控件、类以及类的方法，可以很方便的实现这些应用。  以下将结合一些...</summary><published>2009-11-03T16:09:00Z</published><updated>2009-11-03T16:09:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/11/04/1595638.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/11/04/1595638.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/10/20/1586985.html</id><title type="text">按钮单击ThickBox弹出窗口</title><summary type="text">ThickBox是一个强大的jQuery弹出窗口插件，一般的用法是在链接中，如： Html代码 &amp;lt;a href=&amp;quot;SearchWin.do?TB_iframe=true&amp;amp;height=380&amp;amp;width=480&amp;amp;modal=true&amp;quot; title=&amp;quot;查询企业&amp;quot; class=&amp;quot;thickbox&amp;quot; &amp;gt; &amp;l...</summary><published>2009-10-20T08:12:00Z</published><updated>2009-10-20T08:12:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/10/20/1586985.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/10/20/1586985.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/09/27/1574899.html</id><title type="text">推荐一款界面设计工具 Balsamiq Mockups</title><summary type="text">平时工作中在界面设计的时候，我总是要求工程师先在纸上画图，初步确定后，仅仅用HTML+CSS做出静态的界面再次与用户（主要是其他业务部门）确认后，再动手写实际的代码。纸上的原型设计是经常使用（至少我自己）的初期设计方式，办公室里用白板（空间大，而且环保些）和马克笔。这种办法不仅快，能尽早发现在文字和口头的沟通上理解不一致的地方，同时也尽可能减少开发成本和因为理解不一致导致返工的情况。纸上的原型设计...</summary><published>2009-09-27T03:56:00Z</published><updated>2009-09-27T03:56:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/09/27/1574899.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/09/27/1574899.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/09/04/1560027.html</id><title type="text">jQuery.extend的用法  转载</title><summary type="text">有網友提問，看不太懂jQuery.extend的用法，本想在留言裡回覆，但寫著寫著，發現要說到淺顯白話，還真得花些篇幅，索性另起一篇，解釋得更詳細點。以jQuery.extend(objA, objB)為例，你可以想像成objA與objB各有一些屬性(方法也會比照處理，在此只提屬性)，extend()會將objB有而objA沒有的屬性加到objA裡，如果objB裡的某個屬性，objA裡剛好也有同名...</summary><published>2009-09-04T01:30:00Z</published><updated>2009-09-04T01:30:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/09/04/1560027.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/09/04/1560027.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/06/17/1505229.html</id><title type="text">qq2009 好像和金山词霸屏幕取词有冲突</title><summary type="text">qq2009 好友栏目拖一下cpu一下子飙升到50% 并且qq出现假死状态不明白什么原因 后觉得屏幕取词有点麻烦 就将金山词霸屏幕取词关闭了再看qq ,拖动速度很快也没有出现假死状态遂又开启屏幕取词,再看qq 又变慢了取消屏幕取词后,就正常了可见 是两个软件存在冲突了纯粹灌水了, 下班前灌水一篇,如果tx的人员看到了 麻烦确认下</summary><published>2009-06-17T09:30:00Z</published><updated>2009-06-17T09:30:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/06/17/1505229.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/06/17/1505229.html"/></entry><entry><id>http://www.cnblogs.com/suyuan/archive/2009/06/17/1504781.html</id><title type="text">错误 1 error C2664: 'TextOutW' : cannot convert parameter 4 from 'const char [5]' to 'LPCWSTR'</title><summary type="text">问题的原因是字符串ANSI和Unicode编码的区别, VC6与VS2003等默认使用ANSI编码,而VS2005默认采用Unicode. 简单的说,ANSI用1个字节表示字符,Unicode用2个字节表示1个字符. 若想要你的代码在VS2005中编译通过,3中方法: 1.可修改编码选项:项目属性--&amp;gt;配置属性--&amp;gt;常规--&amp;gt;字符集--&amp;gt;使用多字节字符集 2.把你字符串定义...</summary><published>2009-06-17T01:43:00Z</published><updated>2009-06-17T01:43:00Z</updated><author><name>雨中漫步的太阳</name><uri>http://www.cnblogs.com/suyuan/</uri></author><link rel="alternate" href="http://www.cnblogs.com/suyuan/archive/2009/06/17/1504781.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/suyuan/archive/2009/06/17/1504781.html"/></entry></feed>
