<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.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:thr="http://purl.org/syndication/thread/1.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/CSSASS" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/CSSASS" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 01 Feb 2012 03:48:02 GMT</lastBuildDate><title>CSSASS</title><description>三人行必有我师焉，择其善者而从之，其不善者而改之</description><link atom:type="text/html">http://www.cssass.com/blog</link><generator xmlns="http://www.w3.org/2005/Atom" uri="http://wordpress.org/" version="2.8.4">WordPress</generator><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/index.php/feed/atom</id><link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://www.cssass.com/blog/index.php/feed/atom"></link><pubDate>Thu, 23 Feb 2012 01:57:01 GMT</pubDate><item><title>firefox10的3D Transform</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897174/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1258</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1258.html">&lt;p&gt;之前写了一篇&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/844.html&quot;&gt;CSS3的崛起——体验webkit的3D-Effect&lt;/a&gt;。&lt;br /&gt;
随着firefox10正式版发布，firefox也支持3D Transform了，所以补充一篇，将上篇中的代码移植过来，支持firefox。&lt;/p&gt;
&lt;p&gt;这里先穿插介绍下firefox10的新特性，firefox10除了支持3D Transform，还提供了Fullscreen API，令人兴奋吧。另外firefox10成为Mozila首个“长期支持版本”(Extended Support Release，简称“ESR”)，这种当然是市场考虑啦，至于是什么用意和市场反响我们就不探讨了。&lt;/p&gt;
&lt;p&gt;下面是演示demo，只支持firefox10。 chrome浏览器的用户可以参考上一篇。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_u9pBHw&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
body { background-color:#deddcd;}
#movieposters { list-style:none; margin:100px;}
#movieposters li {float:left;
	-moz-perspective: 500px;
}
/* 图片3d变换效果 */
#movieposters li img { border:10px solid #fcfafa;-moz-box-shadow:0 3px 10px #888;
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {-moz-transform: rotateY(0deg); }
/* 文字框3d变换效果 */
.movieinfo {border:10px solid #fcfafa; padding:0 10px; width:120px; height:100px; background-color:#deddcd; margin:-125px 0 0 55px; position:absolute;-moz-box-shadow:0 10px 20px #888;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, box-shadow, margin;
	-moz-transition-duration: 0.5s; }
#movieposters li:hover .movieinfo {-moz-box-shadow:0 5px 10px #888; margin:-105px 0 0 30px;
	-moz-transform: rotateY(0deg); }
.movieinfo h3 {color:#7a3f3a;font-family:Georgia; text-align:center; }
.movieinfo p {padding:10px 0;}
.movieinfo a { display:block; background:#7a3f3a; padding:3px 0; color:#eee; text-decoration:none; text-align:center; margin:0 auto;-moz-border-radius:5px; }
.movieinfo a:hover, .movieinfo a:focus { background-color:#6a191f; color:#fff; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_u9pBHw');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;去除一些效果&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_VBuknQ&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;list-style:none; }
body { background:#deddcd;margin:100px;}
#movieposters li {float:left;
	-moz-perspective: 500px;
}
#movieposters li img {
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {
	-moz-transform: rotateY(0deg);
}
.movieinfo {
	position:absolute; width:120px; height:100px; background:#fff; margin:-125px 0 0 55px;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, margin;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover .movieinfo {
	margin:-105px 0 0 40px;
	-moz-transform: rotateY(0deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			(未设置transform-style，默认为plat)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_VBuknQ');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用preserve-3d，实现全方位3D&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_AeJcTd&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;list-style:none; }
body { background:#deddcd;margin:100px;}
#movieposters{
	-moz-perspective: 1000px;
}
#movieposters li {float:left;
	-moz-animation: spin 10s infinite linear;
}
#movieposters li.first{
	-moz-transform-style: preserve-3d;
}
#movieposters li.second{
	-moz-transform-style: plat;
}
 @-moz-keyframes spin {
      from { -moz-transform: rotateY(0); }
      to   { -moz-transform: rotateY(360deg); }
    }
#movieposters li img {
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {
	-moz-transform: rotateY(0deg);
}
.movieinfo {
	position:absolute; width:120px; height:100px; background:#fff; margin:-125px 0 0 55px;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, margin;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover .movieinfo {
	margin:-105px 0 0 40px;
	-moz-transform: rotateY(0deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li class='first'&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			Avatar 2 (preserve-3d)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li class='second'&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			Avatar 2 (plat)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_AeJcTd');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最后说明一下firefox和webkit间使用的一点差别：&lt;br /&gt;
火狐10下的3D Transforms在设置perspective属性值时必须带单位px，webkit可以省略；&lt;br /&gt;
另外，webkit在用transition-property设置transform这个值时，可以不用前缀，而firefox需要写上-moz-transform;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/844.html' rel='bookmark' title='Permanent Link: CSS3的崛起——体验webkit的3D-Effect'&gt;CSS3的崛起——体验webkit的3D-Effect&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/833.html' rel='bookmark' title='Permanent Link: 纯css打造投影效果——CSS3属性transform的应用'&gt;纯css打造投影效果——CSS3属性transform的应用&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/992.html' rel='bookmark' title='Permanent Link: 采用css3的语言框效果'&gt;采用css3的语言框效果&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>0</thr:total><description>之前写了一篇CSS3的崛起——体验webkit的3D-Effect。
随着firefox10正式版发布，firefox也支持3D Transform了，所以补充一篇，将上篇中的代码移植过来，支持firefox。
这里先穿插介绍下firefox10的新特性，firefox10除了支持3D Transform，还提供了Fullscreen API，令人兴奋吧。另外firefox10成为Mozila首个“长期支持版本”(Extended Support Release，简称“ESR”)，这种当然是市场考虑啦，至于是什么用意和市场反响我们就不探讨了。
下面是演示demo，只支持firefox10。 chrome浏览器的用户可以参考上一篇。


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
&amp;#60;meta charset=&amp;#34;utf-8&amp;#34; /&amp;#62;
&amp;#60;title&amp;#62;firefox10&amp;#60;/title&amp;#62;
&amp;#60;style&amp;#62;
*{padding:0;margin:0;}
body { background-color:#deddcd;}
#movieposters { list-style:none; margin:100px;}
#movieposters li {float:left;
	-moz-perspective: 500px;
}
/* 图片3d变换效果 */
#movieposters li img { border:10px solid #fcfafa;-moz-box-shadow:0 3px 10px #888;
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {-moz-transform: rotateY(0deg); }
/* 文字框3d变换效果 */
.movieinfo {border:10px solid #fcfafa; padding:0 10px; width:120px; height:100px; background-color:#deddcd; margin:-125px 0 0 55px; position:absolute;-moz-box-shadow:0 10px 20px #888;
	-moz-transform: [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/844.html' rel='bookmark' title='Permanent Link: CSS3的崛起——体验webkit的3D-Effect'&gt;CSS3的崛起——体验webkit的3D-Effect&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/833.html' rel='bookmark' title='Permanent Link: 纯css打造投影效果——CSS3属性transform的应用'&gt;纯css打造投影效果——CSS3属性transform的应用&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/992.html' rel='bookmark' title='Permanent Link: 采用css3的语言框效果'&gt;采用css3的语言框效果&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897174/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897174/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;之前写了一篇&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/844.html&quot;&gt;CSS3的崛起——体验webkit的3D-Effect&lt;/a&gt;。&lt;br /&gt;
随着firefox10正式版发布，firefox也支持3D Transform了，所以补充一篇，将上篇中的代码移植过来，支持firefox。&lt;/p&gt;
&lt;p&gt;这里先穿插介绍下firefox10的新特性，firefox10除了支持3D Transform，还提供了Fullscreen API，令人兴奋吧。另外firefox10成为Mozila首个“长期支持版本”(Extended Support Release，简称“ESR”)，这种当然是市场考虑啦，至于是什么用意和市场反响我们就不探讨了。&lt;/p&gt;
&lt;p&gt;下面是演示demo，只支持firefox10。 chrome浏览器的用户可以参考上一篇。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_u9pBHw&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
body { background-color:#deddcd;}
#movieposters { list-style:none; margin:100px;}
#movieposters li {float:left;
	-moz-perspective: 500px;
}
/* 图片3d变换效果 */
#movieposters li img { border:10px solid #fcfafa;-moz-box-shadow:0 3px 10px #888;
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {-moz-transform: rotateY(0deg); }
/* 文字框3d变换效果 */
.movieinfo {border:10px solid #fcfafa; padding:0 10px; width:120px; height:100px; background-color:#deddcd; margin:-125px 0 0 55px; position:absolute;-moz-box-shadow:0 10px 20px #888;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, box-shadow, margin;
	-moz-transition-duration: 0.5s; }
#movieposters li:hover .movieinfo {-moz-box-shadow:0 5px 10px #888; margin:-105px 0 0 30px;
	-moz-transform: rotateY(0deg); }
.movieinfo h3 {color:#7a3f3a;font-family:Georgia; text-align:center; }
.movieinfo p {padding:10px 0;}
.movieinfo a { display:block; background:#7a3f3a; padding:3px 0; color:#eee; text-decoration:none; text-align:center; margin:0 auto;-moz-border-radius:5px; }
.movieinfo a:hover, .movieinfo a:focus { background-color:#6a191f; color:#fff; }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			&amp;lt;h3&amp;gt;Avatar 2&amp;lt;/h3&amp;gt;
			&amp;lt;p&amp;gt;You like a baby&amp;lt;/p&amp;gt;
			&amp;lt;a href=&amp;quot;http://www.cssass.com&amp;quot; title=&amp;quot;I see you&amp;quot;&amp;gt;More info&amp;lt;/a&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_u9pBHw');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;去除一些效果&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_VBuknQ&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;list-style:none; }
body { background:#deddcd;margin:100px;}
#movieposters li {float:left;
	-moz-perspective: 500px;
}
#movieposters li img {
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {
	-moz-transform: rotateY(0deg);
}
.movieinfo {
	position:absolute; width:120px; height:100px; background:#fff; margin:-125px 0 0 55px;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, margin;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover .movieinfo {
	margin:-105px 0 0 40px;
	-moz-transform: rotateY(0deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			(未设置transform-style，默认为plat)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_VBuknQ');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;使用preserve-3d，实现全方位3D&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_AeJcTd&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;firefox10&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;list-style:none; }
body { background:#deddcd;margin:100px;}
#movieposters{
	-moz-perspective: 1000px;
}
#movieposters li {float:left;
	-moz-animation: spin 10s infinite linear;
}
#movieposters li.first{
	-moz-transform-style: preserve-3d;
}
#movieposters li.second{
	-moz-transform-style: plat;
}
 @-moz-keyframes spin {
      from { -moz-transform: rotateY(0); }
      to   { -moz-transform: rotateY(360deg); }
    }
#movieposters li img {
	-moz-transform: rotateY(30deg);
	-moz-transition-property: -moz-transform;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover img {
	-moz-transform: rotateY(0deg);
}
.movieinfo {
	position:absolute; width:120px; height:100px; background:#fff; margin:-125px 0 0 55px;
	-moz-transform: translateZ(30px) rotateY(30deg);
	-moz-transition-property: -moz-transform, margin;
	-moz-transition-duration: 0.5s;
}
#movieposters li:hover .movieinfo {
	margin:-105px 0 0 40px;
	-moz-transform: rotateY(0deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;movieposters&amp;quot;&amp;gt;
	&amp;lt;li class='first'&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			Avatar 2 (preserve-3d)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
	&amp;lt;li class='second'&amp;gt;
		&amp;lt;img src='http://www.cssass.com/blog/resource/avatar/avatar_m.jpg' width='200' /&amp;gt;
		&amp;lt;div class=&amp;quot;movieinfo&amp;quot;&amp;gt;
			Avatar 2 (plat)
		&amp;lt;/div&amp;gt;
	&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_AeJcTd');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最后说明一下firefox和webkit间使用的一点差别：&lt;br /&gt;
火狐10下的3D Transforms在设置perspective属性值时必须带单位px，webkit可以省略；&lt;br /&gt;
另外，webkit在用transition-property设置transform这个值时，可以不用前缀，而firefox需要写上-moz-transform;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/844.html' rel='bookmark' title='Permanent Link: CSS3的崛起——体验webkit的3D-Effect'&gt;CSS3的崛起——体验webkit的3D-Effect&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2010/833.html' rel='bookmark' title='Permanent Link: 纯css打造投影效果——CSS3属性transform的应用'&gt;纯css打造投影效果——CSS3属性transform的应用&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/992.html' rel='bookmark' title='Permanent Link: 采用css3的语言框效果'&gt;采用css3的语言框效果&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897174/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897174/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">CSS3</category><category domain="http://www.cssass.com/blog">3D</category><category domain="http://www.cssass.com/blog">erspective</category><category domain="http://www.cssass.com/blog">preserve-3d</category><category domain="http://www.cssass.com/blog">transform</category><pubDate>Wed, 01 Feb 2012 11:48:02 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1258</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1258.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897174/5460608</fs:itemid></item><item><title>canvas的像素级操作——1.引子</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897178/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1140</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1140.html">&lt;p&gt;本文是对《&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/772.html&quot; target=&quot;_blank&quot;&gt;MDC的canvas经典教程辑和个人学习笔记&lt;/a&gt;》的补遗，也是canvas像素级操作系列文章的一个引子。&lt;br /&gt;
后面我会陆续发一些canvas素级操作的应用，特效方面的文章。&lt;/p&gt;
&lt;p&gt;既然是引子，那就不能开门见山的介绍了，我们先讲讲如何复制canvas.&lt;br /&gt;
已知一个image对象，我们将其绘制进canvas的方法是什么？drawImage。（当然使用createPattern模板填充也是一个方法）。&lt;br /&gt;
那已知一个canvas对象，我们将其绘制进另一个canvas的方法呢？&lt;br /&gt;
答案还是drawImage，drawImage算是一个很辽阔的方法了，不仅可以绘image，也可以绘canvas对象，甚至还可以绘video的帧。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;并且他拥有大量参数：(Image [, vXSrc] [, vYSrc] [, vWSrc] [, vHSrc], vXDest, vYDest [, vWDest] [, vHDest])，这个读者可以先不管，往下看。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;那么，除了drawImage这个方法，还有没有其他方法呢——有，putImageData方法隆重登场。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_fLWgp8&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;canvas绘制与复制及像素级复制&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;原图：imgObj&amp;lt;br /&amp;gt;
&amp;lt;img id=&amp;quot;imgObj&amp;quot; src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot; width=&amp;quot;200&amp;quot; /&amp;gt;
&amp;lt;p&amp;gt;canvas中绘制的图：MyCanvas&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;MyCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot; &amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;p&amp;gt;从MyCanvas复制过来的图：YourCanvas&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;YourCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot;&amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;p&amp;gt;从MyCanvas的ImageData复制来的图：GodCanvas （注意，这里只是为了引出canvas的像素级操作，通常像素级操作是很低效的）&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;GodCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot;&amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function draw(){
	/* 在canvas中绘制image */
	var canvas1 = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var ctx1 = canvas1.getContext(&amp;quot;2d&amp;quot;);
		ctx1.drawImage(imgObj,0,0);
}
function clone(){
	/* 在canvas2中绘制canvas1 ——普通复制 */
	var origin = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var canvas2 = document.getElementById(&amp;quot;YourCanvas&amp;quot;);
	var ctx2 = canvas2.getContext(&amp;quot;2d&amp;quot;);
		ctx2.drawImage(origin,0,0); //drawImage不仅可以绘image，也可以绘canvas对象，甚至还可以绘video的帧
}
function cloneData(canvasObj){
	/* 获取canvas1中的ImageData，在canvas3中输出 ——像素级复制 */
	var origin = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var canvas3 = document.getElementById(&amp;quot;GodCanvas&amp;quot;);
	var ctx3 = canvas3.getContext(&amp;quot;2d&amp;quot;);
	var canvasCtx = origin.getContext(&amp;quot;2d&amp;quot;);
	var imagePix = canvasCtx.getImageData(0,0,origin.width,origin.height); // 获取canvas1绘图环境下的参数范围内的imageData。
		ctx3.putImageData(imagePix,0,0);    //putImageData输出图像
}
/* 以下与示例代码无关 */
function Load(canvas){
	/* canvas Loading 效果 */
	var backCtx = canvas.getContext('2d');
		backWidth = canvas.width;
		backHeight = canvas.height;
	var drawIntervalID,
		spokes = 7;
	var	drawPad = document.createElement('canvas');
		drawPad.width = 30;
		drawPad.height = 30;
	var	drawCtx = drawPad.getContext('2d');
		drawCtx.translate(drawPad.width/2, drawPad.height/2);
		drawCtx.lineWidth = 5;
		drawCtx.lineCap = &amp;quot;round&amp;quot;;
		drawCtx.strokeStyle = &amp;quot;rgba(0,0,0,0.1)&amp;quot;;
		drawCtx.fillStyle = &amp;quot;#fff&amp;quot;;
	var draw = function(){
		drawCtx.fillRect(0,0, drawPad.width ,drawPad.height);
		drawCtx.rotate(Math.PI*2/spokes);
		for (var i=0; i&amp;lt;spokes; i++) {
			drawCtx.rotate(Math.PI*2/spokes);
			drawCtx.beginPath();
			drawCtx.moveTo(0,8);
			drawCtx.lineTo(0,10);
			drawCtx.stroke();
		}
		backCtx.drawImage(drawPad,(backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2);
	}
	this.loading = function(){
		 drawIntervalID = setInterval(draw,200);
	}
	this.loaded = function(){
		clearInterval(drawIntervalID);
		backCtx.clearRect((backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2, drawPad.width ,drawPad.height);
	}
}
var imgObj = document.getElementById(&amp;quot;imgObj&amp;quot;);
var canvas = document.getElementsByTagName('canvas');
for(var i = 0, l = canvas.length; i &amp;lt; l; i++ ){
	var loadObj = new Load(canvas[i]);
	(function(obj){
		obj.loading();
		imgObj.addEventListener('load',obj.loaded,false);
	})(loadObj);
}
imgObj.addEventListener('load',function(){
	draw();
	clone();
	cloneData();
},false);
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_fLWgp8');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面的cloneData方法就是通过将源canvas中像素数据ImageData，输出(putImageData)到新的canvas中，达到复制作用。&lt;/p&gt;
&lt;p&gt;不过，我们在获取和输出ImageData的过程中，并没有对ImageData做过任何处理，而这个&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata&quot;&gt;ImageData&lt;/a&gt;数据是包含{width,height,CanvasPixelArray},其中CanvasPixelArray包含了图像(canvas也可看做图像)的每一个像素的RGBA数据，可见中间的操作空间是很大的，以后我们会做重点讨论。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
插注：CanvasPixelArray——在最新标准中已引入一个&lt;dfn title=&quot;8-bit unsigned integer (clamped)&quot;&gt;&lt;code&gt;Uint8ClampedArray&lt;/code&gt;&lt;/dfn&gt;的&lt;a href=&quot;http://www.khronos.org/registry/typedarray/specs/latest/&quot;&gt;Typed Array&lt;/a&gt;来替代 ，在各浏览器实现之后，将使得对ImageData的操作更快速更便捷。参考例子：&lt;a href=&quot;http://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/&quot;&gt;http://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/&lt;/a&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;下面介绍一下像素操作的三个方法：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;createImageData();&lt;br /&gt;
getImageData();&lt;br /&gt;
putImageData();&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;createImageData的参数是(w,h)可以新建一个W*H尺寸的新的ImageData【firefox3.5开始支持】，不过也可以使用参数(anotherImageData)来创建【firefox5开始支持】。&lt;/p&gt;
&lt;p&gt;getImageData的参数（x,y,w,h）表示起点x,y,尺寸w,h。可以获取canvas.context中在参数范围内的ImageData。&lt;/p&gt;
&lt;p&gt;putImageData的参数使用要着重要介绍下（和drawImage的参数可以触类旁通）：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_KnmEFl&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;putImageData的参数&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
	canvas{border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas1&amp;quot; width=&amp;quot;300&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas2&amp;quot; width=&amp;quot;300&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
(function draw(){
	var canvas0 = document.createElement(&amp;quot;canvas&amp;quot;),
		ctx = canvas0.getContext(&amp;quot;2d&amp;quot;);
	var canvas1 = document.getElementById(&amp;quot;canvas1&amp;quot;),
		ctx1 = canvas1.getContext(&amp;quot;2d&amp;quot;);
	var canvas2 = document.getElementById(&amp;quot;canvas2&amp;quot;),
		ctx2 = canvas2.getContext(&amp;quot;2d&amp;quot;);
	var img = new Image();
	img.src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
	img.onload=function(){
		canvas0.width = img.width;
		canvas0.height = img.height;
		ctx.drawImage(img,0,0);
		var imagePix = ctx.getImageData(0,0,canvas0.width,canvas0.height);
		/* putImageData参数(ImageData, dx, dy [, DirtyX] [, DirtyX] [, DirtyWidth] [, DirtyHeight]) */
		ctx1.putImageData(imagePix,30,30);  //imageData（包含了width,height,还有一个CanvasPixelArray）；dx, dy表示绘图起始位置
		ctx2.putImageData(imagePix,0,0,100,100,50,50); //后面四个可选参数表示可见区范围。缺省为：0,0,ImageData.width,ImageData.height
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_KnmEFl');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;putImageData参数有(ImageData, dx, dy [, DirtyX] [, DirtyX] [, DirtyWidth] [, DirtyHeight])&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;imageData：包含了图像的width,height,还有一个CanvasPixelArray，前面已经提了。&lt;br /&gt;
dx, dy：表示绘图起始位置。相对于canvas区域左上角。&lt;br /&gt;
后面四个可选参数：表示可见区范围。相对于起绘点，即上面的参数dx,dy表示的点。缺省为0,0,ImageData.width,ImageData.height。
&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>0</thr:total><description>本文是对《MDC的canvas经典教程辑和个人学习笔记》的补遗，也是canvas像素级操作系列文章的一个引子。
后面我会陆续发一些canvas素级操作的应用，特效方面的文章。
既然是引子，那就不能开门见山的介绍了，我们先讲讲如何复制canvas.
已知一个image对象，我们将其绘制进canvas的方法是什么？drawImage。（当然使用createPattern模板填充也是一个方法）。
那已知一个canvas对象，我们将其绘制进另一个canvas的方法呢？
答案还是drawImage，drawImage算是一个很辽阔的方法了，不仅可以绘image，也可以绘canvas对象，甚至还可以绘video的帧。
并且他拥有大量参数：(Image [, vXSrc] [, vYSrc] [, vWSrc] [, vHSrc], vXDest, vYDest [, vWDest] [, vHDest])，这个读者可以先不管，往下看。
那么，除了drawImage这个方法，还有没有其他方法呢——有，putImageData方法隆重登场。


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
&amp;#60;title&amp;#62;canvas绘制与复制及像素级复制&amp;#60;/title&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
&amp;#60;p&amp;#62;原图：imgObj&amp;#60;br /&amp;#62;
&amp;#60;img id=&amp;#34;imgObj&amp;#34; src=&amp;#34;/blog/resource/avatar/avatar_s.jpg&amp;#34; width=&amp;#34;200&amp;#34; /&amp;#62;
&amp;#60;p&amp;#62;canvas中绘制的图：MyCanvas&amp;#60;br /&amp;#62;
&amp;#60;canvas id=&amp;#34;MyCanvas&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;220&amp;#34; &amp;#62; &amp;#60;/canvas&amp;#62;
&amp;#60;p&amp;#62;从MyCanvas复制过来的图：YourCanvas&amp;#60;br /&amp;#62;
&amp;#60;canvas id=&amp;#34;YourCanvas&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;220&amp;#34;&amp;#62; &amp;#60;/canvas&amp;#62;
&amp;#60;p&amp;#62;从MyCanvas的ImageData复制来的图：GodCanvas （注意，这里只是为了引出canvas的像素级操作，通常像素级操作是很低效的）&amp;#60;br /&amp;#62;
&amp;#60;canvas id=&amp;#34;GodCanvas&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;220&amp;#34;&amp;#62; &amp;#60;/canvas&amp;#62;
&amp;#60;/body&amp;#62;
&amp;#60;/html&amp;#62;
&amp;#60;script type=&amp;#34;text/javascript&amp;#34;&amp;#62;
function draw(){
	/* 在canvas中绘制image */
	var canvas1 = document.getElementById(&amp;#34;MyCanvas&amp;#34;);
	var ctx1 = canvas1.getContext(&amp;#34;2d&amp;#34;);
		ctx1.drawImage(imgObj,0,0);
}
function clone(){
	/* 在canvas2中绘制canvas1 ——普通复制 */
	var origin = document.getElementById(&amp;#34;MyCanvas&amp;#34;);
	var [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897178/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897178/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;本文是对《&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/772.html&quot; target=&quot;_blank&quot;&gt;MDC的canvas经典教程辑和个人学习笔记&lt;/a&gt;》的补遗，也是canvas像素级操作系列文章的一个引子。&lt;br /&gt;
后面我会陆续发一些canvas素级操作的应用，特效方面的文章。&lt;/p&gt;
&lt;p&gt;既然是引子，那就不能开门见山的介绍了，我们先讲讲如何复制canvas.&lt;br /&gt;
已知一个image对象，我们将其绘制进canvas的方法是什么？drawImage。（当然使用createPattern模板填充也是一个方法）。&lt;br /&gt;
那已知一个canvas对象，我们将其绘制进另一个canvas的方法呢？&lt;br /&gt;
答案还是drawImage，drawImage算是一个很辽阔的方法了，不仅可以绘image，也可以绘canvas对象，甚至还可以绘video的帧。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;并且他拥有大量参数：(Image [, vXSrc] [, vYSrc] [, vWSrc] [, vHSrc], vXDest, vYDest [, vWDest] [, vHDest])，这个读者可以先不管，往下看。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;那么，除了drawImage这个方法，还有没有其他方法呢——有，putImageData方法隆重登场。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_fLWgp8&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;canvas绘制与复制及像素级复制&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;p&amp;gt;原图：imgObj&amp;lt;br /&amp;gt;
&amp;lt;img id=&amp;quot;imgObj&amp;quot; src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot; width=&amp;quot;200&amp;quot; /&amp;gt;
&amp;lt;p&amp;gt;canvas中绘制的图：MyCanvas&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;MyCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot; &amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;p&amp;gt;从MyCanvas复制过来的图：YourCanvas&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;YourCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot;&amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;p&amp;gt;从MyCanvas的ImageData复制来的图：GodCanvas （注意，这里只是为了引出canvas的像素级操作，通常像素级操作是很低效的）&amp;lt;br /&amp;gt;
&amp;lt;canvas id=&amp;quot;GodCanvas&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;220&amp;quot;&amp;gt; &amp;lt;/canvas&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function draw(){
	/* 在canvas中绘制image */
	var canvas1 = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var ctx1 = canvas1.getContext(&amp;quot;2d&amp;quot;);
		ctx1.drawImage(imgObj,0,0);
}
function clone(){
	/* 在canvas2中绘制canvas1 ——普通复制 */
	var origin = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var canvas2 = document.getElementById(&amp;quot;YourCanvas&amp;quot;);
	var ctx2 = canvas2.getContext(&amp;quot;2d&amp;quot;);
		ctx2.drawImage(origin,0,0); //drawImage不仅可以绘image，也可以绘canvas对象，甚至还可以绘video的帧
}
function cloneData(canvasObj){
	/* 获取canvas1中的ImageData，在canvas3中输出 ——像素级复制 */
	var origin = document.getElementById(&amp;quot;MyCanvas&amp;quot;);
	var canvas3 = document.getElementById(&amp;quot;GodCanvas&amp;quot;);
	var ctx3 = canvas3.getContext(&amp;quot;2d&amp;quot;);
	var canvasCtx = origin.getContext(&amp;quot;2d&amp;quot;);
	var imagePix = canvasCtx.getImageData(0,0,origin.width,origin.height); // 获取canvas1绘图环境下的参数范围内的imageData。
		ctx3.putImageData(imagePix,0,0);    //putImageData输出图像
}
/* 以下与示例代码无关 */
function Load(canvas){
	/* canvas Loading 效果 */
	var backCtx = canvas.getContext('2d');
		backWidth = canvas.width;
		backHeight = canvas.height;
	var drawIntervalID,
		spokes = 7;
	var	drawPad = document.createElement('canvas');
		drawPad.width = 30;
		drawPad.height = 30;
	var	drawCtx = drawPad.getContext('2d');
		drawCtx.translate(drawPad.width/2, drawPad.height/2);
		drawCtx.lineWidth = 5;
		drawCtx.lineCap = &amp;quot;round&amp;quot;;
		drawCtx.strokeStyle = &amp;quot;rgba(0,0,0,0.1)&amp;quot;;
		drawCtx.fillStyle = &amp;quot;#fff&amp;quot;;
	var draw = function(){
		drawCtx.fillRect(0,0, drawPad.width ,drawPad.height);
		drawCtx.rotate(Math.PI*2/spokes);
		for (var i=0; i&amp;lt;spokes; i++) {
			drawCtx.rotate(Math.PI*2/spokes);
			drawCtx.beginPath();
			drawCtx.moveTo(0,8);
			drawCtx.lineTo(0,10);
			drawCtx.stroke();
		}
		backCtx.drawImage(drawPad,(backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2);
	}
	this.loading = function(){
		 drawIntervalID = setInterval(draw,200);
	}
	this.loaded = function(){
		clearInterval(drawIntervalID);
		backCtx.clearRect((backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2, drawPad.width ,drawPad.height);
	}
}
var imgObj = document.getElementById(&amp;quot;imgObj&amp;quot;);
var canvas = document.getElementsByTagName('canvas');
for(var i = 0, l = canvas.length; i &amp;lt; l; i++ ){
	var loadObj = new Load(canvas[i]);
	(function(obj){
		obj.loading();
		imgObj.addEventListener('load',obj.loaded,false);
	})(loadObj);
}
imgObj.addEventListener('load',function(){
	draw();
	clone();
	cloneData();
},false);
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_fLWgp8');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面的cloneData方法就是通过将源canvas中像素数据ImageData，输出(putImageData)到新的canvas中，达到复制作用。&lt;/p&gt;
&lt;p&gt;不过，我们在获取和输出ImageData的过程中，并没有对ImageData做过任何处理，而这个&lt;a href=&quot;http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata&quot;&gt;ImageData&lt;/a&gt;数据是包含{width,height,CanvasPixelArray},其中CanvasPixelArray包含了图像(canvas也可看做图像)的每一个像素的RGBA数据，可见中间的操作空间是很大的，以后我们会做重点讨论。&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
插注：CanvasPixelArray——在最新标准中已引入一个&lt;dfn title=&quot;8-bit unsigned integer (clamped)&quot;&gt;&lt;code&gt;Uint8ClampedArray&lt;/code&gt;&lt;/dfn&gt;的&lt;a href=&quot;http://www.khronos.org/registry/typedarray/specs/latest/&quot;&gt;Typed Array&lt;/a&gt;来替代 ，在各浏览器实现之后，将使得对ImageData的操作更快速更便捷。参考例子：&lt;a href=&quot;http://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/&quot;&gt;http://hacks.mozilla.org/2011/12/faster-canvas-pixel-manipulation-with-typed-arrays/&lt;/a&gt;
&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;下面介绍一下像素操作的三个方法：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;createImageData();&lt;br /&gt;
getImageData();&lt;br /&gt;
putImageData();&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;createImageData的参数是(w,h)可以新建一个W*H尺寸的新的ImageData【firefox3.5开始支持】，不过也可以使用参数(anotherImageData)来创建【firefox5开始支持】。&lt;/p&gt;
&lt;p&gt;getImageData的参数（x,y,w,h）表示起点x,y,尺寸w,h。可以获取canvas.context中在参数范围内的ImageData。&lt;/p&gt;
&lt;p&gt;putImageData的参数使用要着重要介绍下（和drawImage的参数可以触类旁通）：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_KnmEFl&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;putImageData的参数&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
	canvas{border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas1&amp;quot; width=&amp;quot;300&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas2&amp;quot; width=&amp;quot;300&amp;quot; height=&amp;quot;300&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
(function draw(){
	var canvas0 = document.createElement(&amp;quot;canvas&amp;quot;),
		ctx = canvas0.getContext(&amp;quot;2d&amp;quot;);
	var canvas1 = document.getElementById(&amp;quot;canvas1&amp;quot;),
		ctx1 = canvas1.getContext(&amp;quot;2d&amp;quot;);
	var canvas2 = document.getElementById(&amp;quot;canvas2&amp;quot;),
		ctx2 = canvas2.getContext(&amp;quot;2d&amp;quot;);
	var img = new Image();
	img.src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
	img.onload=function(){
		canvas0.width = img.width;
		canvas0.height = img.height;
		ctx.drawImage(img,0,0);
		var imagePix = ctx.getImageData(0,0,canvas0.width,canvas0.height);
		/* putImageData参数(ImageData, dx, dy [, DirtyX] [, DirtyX] [, DirtyWidth] [, DirtyHeight]) */
		ctx1.putImageData(imagePix,30,30);  //imageData（包含了width,height,还有一个CanvasPixelArray）；dx, dy表示绘图起始位置
		ctx2.putImageData(imagePix,0,0,100,100,50,50); //后面四个可选参数表示可见区范围。缺省为：0,0,ImageData.width,ImageData.height
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_KnmEFl');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;putImageData参数有(ImageData, dx, dy [, DirtyX] [, DirtyX] [, DirtyWidth] [, DirtyHeight])&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;imageData：包含了图像的width,height,还有一个CanvasPixelArray，前面已经提了。&lt;br /&gt;
dx, dy：表示绘图起始位置。相对于canvas区域左上角。&lt;br /&gt;
后面四个可选参数：表示可见区范围。相对于起绘点，即上面的参数dx,dy表示的点。缺省为0,0,ImageData.width,ImageData.height。
&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897178/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897178/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">HTML5</category><category domain="http://www.cssass.com/blog">canvas</category><category domain="http://www.cssass.com/blog">CanvasPixelArray</category><category domain="http://www.cssass.com/blog">drawImage</category><category domain="http://www.cssass.com/blog">imageData</category><category domain="http://www.cssass.com/blog">Uint8ClampedArray</category><pubDate>Thu, 19 Jan 2012 16:48:59 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1140</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1140.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897178/5460608</fs:itemid></item><item><title>canvas的像素级操作——2.RGBA通道调色</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897177/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1158</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1158.html">&lt;p&gt;在前文里我们已经提到了ImageData，它包含了三条数据{width,height,CanvasPixelArray}，而其中CanvasPixelArray存储了所有像素点的RGBA数据,第一个像素的red,green,blue,alpha通道值对应的就是CanvasPixelArray[0]-CanvasPixelArray[3]，如此按从左往右，由上往下依次存储。&lt;/p&gt;
&lt;p&gt;我们通过修改像素点的rgb值就能改变像素的色相，修改alpha值就能改变像素的不透明度。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_NcnYm4&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;ImageData通道操作&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
(function draw(){
	var canvas = document.getElementById('board');
	var context = canvas.getContext('2d');
	var imgPixels = false,
	w = 1000, h = 500,
	x = 0,  y = 0;
	imgPixels = context.createImageData(w, h);
	//imgPixels = context.getImageData(0, 0, w, h);
	var pix = imgPixels.data;
	for (var i = 0,n = pix.length; i &amp;lt; n;) {
		/* 设置点的rgba值。ImageData.data数据是每4个值(分别是rgba)对应1个像素点 */
		pix[i  ] = i &amp;amp; 0xff;
		pix[++i] = i &amp;amp; 0xff;
		pix[++i] = i &amp;amp; 0xff;
		pix[++i] = 255;
	}
	context.putImageData(imgPixels, x, y);
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_NcnYm4');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面的demo中，我们创建了一个50*50像素点的ImageData，那么ImageData.data包含的数据应该是有 50 x 50 x 4 条。&lt;br /&gt;
每12条一循环（即每隔两个像素），像素点的rgba值，没有经过设置的像素点，它们的缺省值是：[255,255,255,255]。&lt;/p&gt;
&lt;p&gt;上例是，创建新的ImageData，相当于所有ImageData的初始值都是255。&lt;br /&gt;
下面针对图像的ImageData进行计算设值，以此改变图像的色相。这是一个RGB彩色转gray的效果。（效果同ie的滤镜：filter:gray();已经最新出现的webkit滤镜：-webkit-filter: grayscale(1);）&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_hk4rP7&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;彩色图转灰度处理&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
鼠标过来&amp;lt;br /&amp;gt;
&amp;lt;img id=&amp;quot;imgObj&amp;quot; src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot; width=&amp;quot;200&amp;quot; onmouseover=&amp;quot;this.src=grayscale(this)&amp;quot; /&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function grayscale(img){
	/* 图像Grayscale处理函数 */
	var canvas = document.createElement('canvas');
	var ctx = canvas.getContext('2d');
	canvas.width = img.width;
	canvas.height = img.height;
	ctx.drawImage(img,0,0);
	var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
	for(var y = 0, h = imgPixels.height; y &amp;lt; h; y++){
		for(var x = 0, w = imgPixels.width; x &amp;lt; w; x++){
			var i = (y * 4) * w + x * 4;
			/* Gray = R*0.299 + G*0.587 + B*0.114 */
			var gray = 0.299*imgPixels.data[i] + 0.587*imgPixels.data[i + 1] + 0.114*imgPixels.data[i + 2];
			imgPixels.data[i] = gray;
			imgPixels.data[i + 1] = gray;
			imgPixels.data[i + 2] = gray;
		}
	}
	ctx.putImageData(imgPixels, 0, 0, 0, 0, canvas.width, canvas.height);
	return canvas.toDataURL();
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_hk4rP7');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面没有对ImageData.data做一次循环，而是对ImageData.width,ImageData.height做了两次循环。&lt;br /&gt;
两种循环其实是一样的。可以看下关系：ImageData.data.length = ImageData.width x ImageData.heigh x 4;&lt;br /&gt;
data的序号 n = ( (y * ImageData.width) + x)  x 4 ;&lt;/p&gt;
&lt;p&gt;而关于RGB转gray运算算法的知识，还可以参见这两篇文章：&lt;a href=&quot;http://www.cnblogs.com/zyl910/archive/2006/05/22/2186658.html&quot;&gt;彩色转灰度算法&lt;/a&gt;，&lt;a href=&quot;http://hi.baidu.com/rucio/blog/item/4e44d04f7149c83aafc3ab83.html&quot;&gt;RGB向灰度转换的原理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在上例中，出现了一个canvas对象的新方法&lt;a href=&quot;https://developer.mozilla.org/en/DOM/HTMLCanvasElement&quot;&gt;toDataURL&lt;/a&gt;,这个方法会将canvas对象转换成&lt;a href=&quot;&quot;&gt;data_URIs&lt;/a&gt;,一个base64 strings。这样就能出现在image标签下中的src中了。&lt;/p&gt;
&lt;p&gt;canvas提供像素级数据，为很多算法的应用提供了平台，实现photoshop中的众多神奇图像效果在前端都已成为可能。&lt;br /&gt;
甚至于我们还能实现电影的蓝幕效果——针对video的帧,通过drawImage绘进canvas，再做rgba处理，将规定颜色的像素的alpha值设为0，就能使特定部分变成透明，进而实现视频合成。&lt;a href=&quot;https://developer.mozilla.org/samples/video/chroma-key/index.xhtml&quot;&gt;查看演示&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>0</thr:total><description>在前文里我们已经提到了ImageData，它包含了三条数据{width,height,CanvasPixelArray}，而其中CanvasPixelArray存储了所有像素点的RGBA数据,第一个像素的red,green,blue,alpha通道值对应的就是CanvasPixelArray[0]-CanvasPixelArray[3]，如此按从左往右，由上往下依次存储。
我们通过修改像素点的rgb值就能改变像素的色相，修改alpha值就能改变像素的不透明度。


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
	&amp;#60;meta charset=&amp;#34;utf-8&amp;#34;&amp;#62;
	&amp;#60;title&amp;#62;ImageData通道操作&amp;#60;/title&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
&amp;#60;canvas id=&amp;#34;board&amp;#34; width=&amp;#34;1000&amp;#34; height=&amp;#34;500&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;script type=&amp;#34;text/javascript&amp;#34;&amp;#62;
(function draw(){
	var canvas = document.getElementById('board');
	var context = canvas.getContext('2d');
	var imgPixels = false,
	w = 1000, h = 500,
	x = 0,  y = 0;
	imgPixels = context.createImageData(w, h);
	//imgPixels = context.getImageData(0, 0, w, h);
	var pix = imgPixels.data;
	for (var i = 0,n = pix.length; i &amp;#60; n;) {
		/* 设置点的rgba值。ImageData.data数据是每4个值(分别是rgba)对应1个像素点 */
		pix[i  ] = i [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897177/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897177/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;在前文里我们已经提到了ImageData，它包含了三条数据{width,height,CanvasPixelArray}，而其中CanvasPixelArray存储了所有像素点的RGBA数据,第一个像素的red,green,blue,alpha通道值对应的就是CanvasPixelArray[0]-CanvasPixelArray[3]，如此按从左往右，由上往下依次存储。&lt;/p&gt;
&lt;p&gt;我们通过修改像素点的rgb值就能改变像素的色相，修改alpha值就能改变像素的不透明度。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_NcnYm4&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;ImageData通道操作&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;1000&amp;quot; height=&amp;quot;500&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
(function draw(){
	var canvas = document.getElementById('board');
	var context = canvas.getContext('2d');
	var imgPixels = false,
	w = 1000, h = 500,
	x = 0,  y = 0;
	imgPixels = context.createImageData(w, h);
	//imgPixels = context.getImageData(0, 0, w, h);
	var pix = imgPixels.data;
	for (var i = 0,n = pix.length; i &amp;lt; n;) {
		/* 设置点的rgba值。ImageData.data数据是每4个值(分别是rgba)对应1个像素点 */
		pix[i  ] = i &amp;amp; 0xff;
		pix[++i] = i &amp;amp; 0xff;
		pix[++i] = i &amp;amp; 0xff;
		pix[++i] = 255;
	}
	context.putImageData(imgPixels, x, y);
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_NcnYm4');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面的demo中，我们创建了一个50*50像素点的ImageData，那么ImageData.data包含的数据应该是有 50 x 50 x 4 条。&lt;br /&gt;
每12条一循环（即每隔两个像素），像素点的rgba值，没有经过设置的像素点，它们的缺省值是：[255,255,255,255]。&lt;/p&gt;
&lt;p&gt;上例是，创建新的ImageData，相当于所有ImageData的初始值都是255。&lt;br /&gt;
下面针对图像的ImageData进行计算设值，以此改变图像的色相。这是一个RGB彩色转gray的效果。（效果同ie的滤镜：filter:gray();已经最新出现的webkit滤镜：-webkit-filter: grayscale(1);）&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_hk4rP7&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;彩色图转灰度处理&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
鼠标过来&amp;lt;br /&amp;gt;
&amp;lt;img id=&amp;quot;imgObj&amp;quot; src=&amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot; width=&amp;quot;200&amp;quot; onmouseover=&amp;quot;this.src=grayscale(this)&amp;quot; /&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function grayscale(img){
	/* 图像Grayscale处理函数 */
	var canvas = document.createElement('canvas');
	var ctx = canvas.getContext('2d');
	canvas.width = img.width;
	canvas.height = img.height;
	ctx.drawImage(img,0,0);
	var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
	for(var y = 0, h = imgPixels.height; y &amp;lt; h; y++){
		for(var x = 0, w = imgPixels.width; x &amp;lt; w; x++){
			var i = (y * 4) * w + x * 4;
			/* Gray = R*0.299 + G*0.587 + B*0.114 */
			var gray = 0.299*imgPixels.data[i] + 0.587*imgPixels.data[i + 1] + 0.114*imgPixels.data[i + 2];
			imgPixels.data[i] = gray;
			imgPixels.data[i + 1] = gray;
			imgPixels.data[i + 2] = gray;
		}
	}
	ctx.putImageData(imgPixels, 0, 0, 0, 0, canvas.width, canvas.height);
	return canvas.toDataURL();
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_hk4rP7');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面没有对ImageData.data做一次循环，而是对ImageData.width,ImageData.height做了两次循环。&lt;br /&gt;
两种循环其实是一样的。可以看下关系：ImageData.data.length = ImageData.width x ImageData.heigh x 4;&lt;br /&gt;
data的序号 n = ( (y * ImageData.width) + x)  x 4 ;&lt;/p&gt;
&lt;p&gt;而关于RGB转gray运算算法的知识，还可以参见这两篇文章：&lt;a href=&quot;http://www.cnblogs.com/zyl910/archive/2006/05/22/2186658.html&quot;&gt;彩色转灰度算法&lt;/a&gt;，&lt;a href=&quot;http://hi.baidu.com/rucio/blog/item/4e44d04f7149c83aafc3ab83.html&quot;&gt;RGB向灰度转换的原理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在上例中，出现了一个canvas对象的新方法&lt;a href=&quot;https://developer.mozilla.org/en/DOM/HTMLCanvasElement&quot;&gt;toDataURL&lt;/a&gt;,这个方法会将canvas对象转换成&lt;a href=&quot;&quot;&gt;data_URIs&lt;/a&gt;,一个base64 strings。这样就能出现在image标签下中的src中了。&lt;/p&gt;
&lt;p&gt;canvas提供像素级数据，为很多算法的应用提供了平台，实现photoshop中的众多神奇图像效果在前端都已成为可能。&lt;br /&gt;
甚至于我们还能实现电影的蓝幕效果——针对video的帧,通过drawImage绘进canvas，再做rgba处理，将规定颜色的像素的alpha值设为0，就能使特定部分变成透明，进而实现视频合成。&lt;a href=&quot;https://developer.mozilla.org/samples/video/chroma-key/index.xhtml&quot;&gt;查看演示&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897177/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897177/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">HTML5</category><category domain="http://www.cssass.com/blog">data_URIs</category><category domain="http://www.cssass.com/blog">gray</category><category domain="http://www.cssass.com/blog">grayscale</category><category domain="http://www.cssass.com/blog">imageData</category><category domain="http://www.cssass.com/blog">rgba</category><category domain="http://www.cssass.com/blog">toDataURL</category><pubDate>Thu, 19 Jan 2012 16:48:52 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1158</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1158.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897177/5460608</fs:itemid></item><item><title>canvas的像素级操作——3.使用卷积矩阵</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897176/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1165</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1165.html">&lt;p&gt;利用卷积矩阵(Convolution Matrix)操作像素，我们可以很方便的得到诸如模糊、边缘检测、锐化、浮雕和斜角这样的效果。&lt;/p&gt;
&lt;p&gt;常用的矩阵类型是 3 x 3 矩阵，另外还有5 x 5的矩阵。&lt;/p&gt;
&lt;p&gt;工作原理：&lt;a href=&quot;http://flex4jiaocheng.com/blog/280&quot;&gt;http://flex4jiaocheng.com/blog/280&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点阵图中的每一个像素被称为“初步像素”，用与卷积矩阵同样面积的“初步像素”从左到右从上到下与卷积矩阵中相应位置的值相乘，再将得到的9个或25个中间值相加，就得到了“初步像素”矩阵中央的一个值的结果值再与Divisor（因子）相除，与Offset（偏移量）相加，最后得到终值。如下图所示：&lt;br /&gt;
&lt;img src=&quot;http://flex4jiaocheng.com/sites/rhythmtechnology.com/files/diagrams/convolution-calculate.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;应用卷积矩阵实现特效:&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_Rsb6SY&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;利用卷积矩阵实现特效&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas1&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;浮雕效果&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas2&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;边缘检测&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas3&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;锐化&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas4&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;基本模糊&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas5&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; &amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function convolution(imgPixels, matrix, divisor, offset){
	/* 卷积矩阵应用函数 */
    var w = imgPixels.width,
		h = imgPixels.height,
		d = imgPixels.data;
	var canvas = document.createElement('canvas'),
		ctx = canvas.getContext('2d'),
		newImgPixels = ctx.createImageData(w,h);
	for (var y = 1; y &amp;lt; h-1; y++) {
			for (var x = 1; x &amp;lt; w-1; x++) {
				for (var c = 0; c &amp;lt; 3; c++) {
					/* RGB通道 */
					var i = (y*w + x)*4 + c;
					newImgPixels.data[i]=(matrix[0]*d[i-(w+1)*4] + matrix[1]*d[i-w*4] + matrix[2]*d[i-(w-1)*4]
										+ matrix[3]*d[i-4]       + matrix[4]*d[i]     + matrix[5]*d[i+4]
										+ matrix[6]*d[i+(w-1)*4] + matrix[7]*d[i+w*4] + matrix[8]*d[i+(w+1)*4])
										/ divisor + offset;
				}
				newImgPixels.data[(y*w + x)*4 + 3] = 255;
			}
		}
    return newImgPixels;
}
(function(){
	/* demo */
	var imgObj = new Image();
		imgObj.src = '/blog/resource/avatar/avatar_s.jpg';
	var embossing = {
		/* 浮雕效果 */
			matrix : [-2, -1, 0,
					  -1,  1, 1,
					   0,  1, 2],
			divisor: 1,
			offset : 0
		},
		edge = {
		/* 边缘检测 */
			matrix : [0, -1, 0,
					 -1,  4, -1,
					  0, -1, 0],
			divisor: 1,
			offset : 0
		},
		sharpening = {
		/* 锐化 */
			matrix : [ 0, -1, 0,
					  -1,  5, -1,
					  0,  -1, 0],
			divisor: 1,
			offset : 0
		},
		blur = {
		/* 基本模糊 */
			matrix : [0, 1, 0,
					  1, 1, 1,
					  0, 1, 0],
			divisor: 5,
			offset : 0
		},
		oneboys = {
		/* 胡诌的一个矩阵 */
			matrix : [ 0, 1, 4,
					  -1,  5, -1,
					  3,  -1, 2],
			divisor: 5,
			offset : 0
		};
	function process(obj,effect){
		var context = document.getElementById(obj).getContext('2d');
			context.drawImage(imgObj, 0, 0);
		var imgPixels = context.getImageData(0, 0, imgObj.width, imgObj.height);
		imgPixels = convolution(imgPixels, effect.matrix, effect.divisor, effect.offset)
		context.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
	}
	var canvas = document.getElementsByTagName('canvas');
	for(var i = 0, l = canvas.length; i &amp;lt; l; i++ ){
		var loadObj = new Load(canvas[i]);
		(function(obj){
			obj.loading();
			imgObj.addEventListener('load',obj.loaded,false);
		})(loadObj);
	};
	imgObj.addEventListener('load',function(){
		process('canvas1',embossing);
		process('canvas2',edge);
		process('canvas3',sharpening);
		process('canvas4',blur);
		process('canvas5',oneboys);
	},false);
})()
/* 以下与示例代码无关 */
function Load(canvas){
	/* canvas Loading 效果 */
	var backCtx = canvas.getContext('2d');
		backWidth = canvas.width;
		backHeight = canvas.height;
	var drawIntervalID,
		spokes = 7;
	var	drawPad = document.createElement('canvas');
		drawPad.width = 30;
		drawPad.height = 30;
	var	drawCtx = drawPad.getContext('2d');
		drawCtx.translate(drawPad.width/2, drawPad.height/2);
		drawCtx.lineWidth = 5;
		drawCtx.lineCap = &amp;quot;round&amp;quot;;
		drawCtx.strokeStyle = &amp;quot;rgba(0,0,0,0.1)&amp;quot;;
		drawCtx.fillStyle = &amp;quot;#fff&amp;quot;;
	var draw = function(){
		drawCtx.fillRect(0,0, drawPad.width ,drawPad.height);
		drawCtx.rotate(Math.PI*2/spokes);
		for (var i=0; i&amp;lt;spokes; i++) {
			drawCtx.rotate(Math.PI*2/spokes);
			drawCtx.beginPath();
			drawCtx.moveTo(0,8);
			drawCtx.lineTo(0,10);
			drawCtx.stroke();
		}
		backCtx.drawImage(drawPad,(backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2);
	}
	this.loading = function(){
		 drawIntervalID = setInterval(draw,200);
	}
	this.loaded = function(){
		clearInterval(drawIntervalID);
		backCtx.clearRect((backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2, drawPad.width ,drawPad.height);
	}
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_Rsb6SY');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面demo中卷积的实现函数来自于&lt;a href=&quot;http://shawphy.com/2011/08/convolution-matrix-in-canvas.html&quot;&gt;在HTML 5 的 Canvas 中应用卷积矩阵对图像处理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐一篇有趣的文章：&lt;a href=&quot;http://www.douban.com/group/topic/15957958/&quot;&gt;卷积的物理意义&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>1</thr:total><description>利用卷积矩阵(Convolution Matrix)操作像素，我们可以很方便的得到诸如模糊、边缘检测、锐化、浮雕和斜角这样的效果。
常用的矩阵类型是 3 x 3 矩阵，另外还有5 x 5的矩阵。
工作原理：http://flex4jiaocheng.com/blog/280
点阵图中的每一个像素被称为“初步像素”，用与卷积矩阵同样面积的“初步像素”从左到右从上到下与卷积矩阵中相应位置的值相乘，再将得到的9个或25个中间值相加，就得到了“初步像素”矩阵中央的一个值的结果值再与Divisor（因子）相除，与Offset（偏移量）相加，最后得到终值。如下图所示：

应用卷积矩阵实现特效:


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
	&amp;#60;meta charset=&amp;#34;utf-8&amp;#34;&amp;#62;
	&amp;#60;title&amp;#62;利用卷积矩阵实现特效&amp;#60;/title&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
&amp;#60;canvas id=&amp;#34;canvas1&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;200&amp;#34; title=&amp;#34;浮雕效果&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;canvas id=&amp;#34;canvas2&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;200&amp;#34; title=&amp;#34;边缘检测&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;canvas id=&amp;#34;canvas3&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;200&amp;#34; title=&amp;#34;锐化&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;canvas id=&amp;#34;canvas4&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;200&amp;#34; title=&amp;#34;基本模糊&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;canvas id=&amp;#34;canvas5&amp;#34; width=&amp;#34;200&amp;#34; height=&amp;#34;200&amp;#34; &amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;script type=&amp;#34;text/javascript&amp;#34;&amp;#62;
function convolution(imgPixels, matrix, divisor, offset){
	/* 卷积矩阵应用函数 */
    var w = imgPixels.width,
		h = imgPixels.height,
		d = imgPixels.data;
	var canvas = document.createElement('canvas'),
		ctx = canvas.getContext('2d'),
		newImgPixels = ctx.createImageData(w,h);
	for [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897176/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897176/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;利用卷积矩阵(Convolution Matrix)操作像素，我们可以很方便的得到诸如模糊、边缘检测、锐化、浮雕和斜角这样的效果。&lt;/p&gt;
&lt;p&gt;常用的矩阵类型是 3 x 3 矩阵，另外还有5 x 5的矩阵。&lt;/p&gt;
&lt;p&gt;工作原理：&lt;a href=&quot;http://flex4jiaocheng.com/blog/280&quot;&gt;http://flex4jiaocheng.com/blog/280&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;点阵图中的每一个像素被称为“初步像素”，用与卷积矩阵同样面积的“初步像素”从左到右从上到下与卷积矩阵中相应位置的值相乘，再将得到的9个或25个中间值相加，就得到了“初步像素”矩阵中央的一个值的结果值再与Divisor（因子）相除，与Offset（偏移量）相加，最后得到终值。如下图所示：&lt;br /&gt;
&lt;img src=&quot;http://flex4jiaocheng.com/sites/rhythmtechnology.com/files/diagrams/convolution-calculate.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;应用卷积矩阵实现特效:&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_Rsb6SY&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;利用卷积矩阵实现特效&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas1&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;浮雕效果&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas2&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;边缘检测&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas3&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;锐化&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas4&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; title=&amp;quot;基本模糊&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;canvas id=&amp;quot;canvas5&amp;quot; width=&amp;quot;200&amp;quot; height=&amp;quot;200&amp;quot; &amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function convolution(imgPixels, matrix, divisor, offset){
	/* 卷积矩阵应用函数 */
    var w = imgPixels.width,
		h = imgPixels.height,
		d = imgPixels.data;
	var canvas = document.createElement('canvas'),
		ctx = canvas.getContext('2d'),
		newImgPixels = ctx.createImageData(w,h);
	for (var y = 1; y &amp;lt; h-1; y++) {
			for (var x = 1; x &amp;lt; w-1; x++) {
				for (var c = 0; c &amp;lt; 3; c++) {
					/* RGB通道 */
					var i = (y*w + x)*4 + c;
					newImgPixels.data[i]=(matrix[0]*d[i-(w+1)*4] + matrix[1]*d[i-w*4] + matrix[2]*d[i-(w-1)*4]
										+ matrix[3]*d[i-4]       + matrix[4]*d[i]     + matrix[5]*d[i+4]
										+ matrix[6]*d[i+(w-1)*4] + matrix[7]*d[i+w*4] + matrix[8]*d[i+(w+1)*4])
										/ divisor + offset;
				}
				newImgPixels.data[(y*w + x)*4 + 3] = 255;
			}
		}
    return newImgPixels;
}
(function(){
	/* demo */
	var imgObj = new Image();
		imgObj.src = '/blog/resource/avatar/avatar_s.jpg';
	var embossing = {
		/* 浮雕效果 */
			matrix : [-2, -1, 0,
					  -1,  1, 1,
					   0,  1, 2],
			divisor: 1,
			offset : 0
		},
		edge = {
		/* 边缘检测 */
			matrix : [0, -1, 0,
					 -1,  4, -1,
					  0, -1, 0],
			divisor: 1,
			offset : 0
		},
		sharpening = {
		/* 锐化 */
			matrix : [ 0, -1, 0,
					  -1,  5, -1,
					  0,  -1, 0],
			divisor: 1,
			offset : 0
		},
		blur = {
		/* 基本模糊 */
			matrix : [0, 1, 0,
					  1, 1, 1,
					  0, 1, 0],
			divisor: 5,
			offset : 0
		},
		oneboys = {
		/* 胡诌的一个矩阵 */
			matrix : [ 0, 1, 4,
					  -1,  5, -1,
					  3,  -1, 2],
			divisor: 5,
			offset : 0
		};
	function process(obj,effect){
		var context = document.getElementById(obj).getContext('2d');
			context.drawImage(imgObj, 0, 0);
		var imgPixels = context.getImageData(0, 0, imgObj.width, imgObj.height);
		imgPixels = convolution(imgPixels, effect.matrix, effect.divisor, effect.offset)
		context.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
	}
	var canvas = document.getElementsByTagName('canvas');
	for(var i = 0, l = canvas.length; i &amp;lt; l; i++ ){
		var loadObj = new Load(canvas[i]);
		(function(obj){
			obj.loading();
			imgObj.addEventListener('load',obj.loaded,false);
		})(loadObj);
	};
	imgObj.addEventListener('load',function(){
		process('canvas1',embossing);
		process('canvas2',edge);
		process('canvas3',sharpening);
		process('canvas4',blur);
		process('canvas5',oneboys);
	},false);
})()
/* 以下与示例代码无关 */
function Load(canvas){
	/* canvas Loading 效果 */
	var backCtx = canvas.getContext('2d');
		backWidth = canvas.width;
		backHeight = canvas.height;
	var drawIntervalID,
		spokes = 7;
	var	drawPad = document.createElement('canvas');
		drawPad.width = 30;
		drawPad.height = 30;
	var	drawCtx = drawPad.getContext('2d');
		drawCtx.translate(drawPad.width/2, drawPad.height/2);
		drawCtx.lineWidth = 5;
		drawCtx.lineCap = &amp;quot;round&amp;quot;;
		drawCtx.strokeStyle = &amp;quot;rgba(0,0,0,0.1)&amp;quot;;
		drawCtx.fillStyle = &amp;quot;#fff&amp;quot;;
	var draw = function(){
		drawCtx.fillRect(0,0, drawPad.width ,drawPad.height);
		drawCtx.rotate(Math.PI*2/spokes);
		for (var i=0; i&amp;lt;spokes; i++) {
			drawCtx.rotate(Math.PI*2/spokes);
			drawCtx.beginPath();
			drawCtx.moveTo(0,8);
			drawCtx.lineTo(0,10);
			drawCtx.stroke();
		}
		backCtx.drawImage(drawPad,(backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2);
	}
	this.loading = function(){
		 drawIntervalID = setInterval(draw,200);
	}
	this.loaded = function(){
		clearInterval(drawIntervalID);
		backCtx.clearRect((backWidth - drawPad.width)/2, (backHeight - drawPad.height)/2, drawPad.width ,drawPad.height);
	}
}
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_Rsb6SY');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;上面demo中卷积的实现函数来自于&lt;a href=&quot;http://shawphy.com/2011/08/convolution-matrix-in-canvas.html&quot;&gt;在HTML 5 的 Canvas 中应用卷积矩阵对图像处理&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;推荐一篇有趣的文章：&lt;a href=&quot;http://www.douban.com/group/topic/15957958/&quot;&gt;卷积的物理意义&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1179.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——4.关注性能'&gt;canvas的像素级操作——4.关注性能&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897176/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897176/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">HTML5</category><category domain="http://www.cssass.com/blog">blur</category><category domain="http://www.cssass.com/blog">Convolution</category><category domain="http://www.cssass.com/blog">imageData</category><category domain="http://www.cssass.com/blog">Matrix</category><category domain="http://www.cssass.com/blog">sharpening</category><pubDate>Thu, 19 Jan 2012 16:48:41 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1165</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1165.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897176/5460608</fs:itemid></item><item><title>canvas的像素级操作——4.关注性能</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897175/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1179</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1179.html">&lt;p&gt;我们开篇就提过，canvas的像素级操作相对来说是很低效的。&lt;/p&gt;
&lt;p&gt;我们试着写一个图片切割效果。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_iJIjU1&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,imgPixels){
	var round = 0; //统计循环次数
	for(var y = 0; y &amp;lt; imgPixels.height; y++){
		for(var x = 0; x &amp;lt; imgPixels.width; x++){
			/* 虽然只调用了putImageData一个方法，但是操作的data非常多 */
			ctx.putImageData(imgPixels, x, y, x, y, 1 ,1); //后四个参数控制显示区域
			round ++ ;
		}
	}
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx = document.getElementById('board').getContext('2d');
	var imgPixels = tempCtx.getImageData(0, 0, w, h);
	return splinter(ctx,imgPixels);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共执行了&amp;quot; + func + &amp;quot;次的putImageData&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_iJIjU1');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;对于这个效果，因为我们并不需要操作图像的rgba数据，而只是把图像进行分割，所以利用putImageData的后四个可见区参数进行了设置就行了。&lt;br /&gt;
但是，这样做的性能却非常不理想。因为我们操作的ImageData数据实在太多了，循环执行了2750遍，相当于我们对整幅图像进行了2750次的像素级复制，而其实在可见区之外的ImageData数据并不是我们所需要的。&lt;/p&gt;
&lt;p&gt;那么，我们在对源图getImageData的时候，可以只获取我们需要的ImageData。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode__12mcG&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,tempCtx, w, h){
	var newData = [];
	var round = 0; //统计循环次数
	for(var y = 0; y &amp;lt; h; y++){
		newData[y] = [];
		for(var x = 0; x &amp;lt; w; x++){
			newData[y][x] = tempCtx.getImageData(x, y, 1, 1); //分开获取所需要的ImageData
			ctx.putImageData(newData[y][x], x*2, y*2);
			round ++ ;
		}
	}
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx =  document.getElementById('board').getContext('2d');
	return round = splinter(ctx,tempCtx, w, h);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共执行了&amp;quot; + func + &amp;quot;次的getImageData和putImageData&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode__12mcG');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二种做法虽然在循环的时候多运行了一个方法（共执行2750次的getImageData和putImageData方法），但因为操作的ImageData少了2750倍，所以在效率上比第一种方式高了很多。&lt;/p&gt;
&lt;p&gt;但从流程上来讲，我们只需要在刚开始的时候获取一次源图的ImageData（执行getImageData），对数据进行再排列后，最后再输出一次新的ImageData（执行putImageData）就可以了。&lt;br /&gt;
根本不需要在循环中反复调用getImageData和putImageData。所以现在的关键点是get和put之间的如何对数据进行重排列。&lt;/p&gt;
&lt;p&gt;ImageData.data可以看做一个矩形矩阵，我们已知，它的序列号（n）与ImageData.width(w),及x轴序列号(x),y轴序列号（y）的关系是：n = ((y * w) + x) * 4;  （其中的4表示了RGBA四个数据）。我们要的新的输出ImageData，其实是x加倍，y加倍，w加倍的一个新矩阵。那么新矩阵序号与原x,y,w的关系式应该是：t = ((y * 2 * w * 2) + x * 2) * 4;&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_cDRg9u&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,imgPixels){
	var round = 0; //统计循环次数
	var n = 0,
		w = imgPixels.width,
		h = imgPixels.height,
		newdata = ctx.createImageData(w*2, h*2);
	for(var y = 0; y &amp;lt; h; y++){
		for(var x = 0; x &amp;lt; w; x++){
			n = ((y * w) + x) * 4; /* data序号n与x,y,w的关系 */
			t = ((y * 2 * w * 2) + x * 2) * 4; /* 分割后，y,x,w都变大了一倍 */
			newdata.data[t] =  imgPixels.data[n];
			newdata.data[t + 1] =  imgPixels.data[n + 1];
			newdata.data[t + 2] =  imgPixels.data[n + 2];
			newdata.data[t + 3] =  imgPixels.data[n + 3];
			round ++ ;
		}
	}
	ctx.putImageData(newdata, 0, 0);
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx = document.getElementById('board').getContext('2d');
	var imgPixels = tempCtx.getImageData(0, 0, w, h);
	return splinter(ctx,imgPixels);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共循环了&amp;quot; + func + &amp;quot;次,循环内不执行getImageData和putImageData方法&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_cDRg9u');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第三种方法相对于第二种方法的效率提高了十几倍。第三种方法的关键点是找出新旧矩阵之间的关系，对于我们这一例来说还比较容易，复杂一点的，算法可就没这么简单了。&lt;/p&gt;
&lt;p&gt;——————————————&lt;br /&gt;
重要补充：&lt;/p&gt;
&lt;p&gt;我们先总结下三种方法：第一种：效率低差，但理解起来最简单。第三种，算法复杂，但效率最高。第二种，折中。&lt;br /&gt;
然而，如果使用的是webkit，opera浏览器，我们会发现第一种方法的效率比之第三种方法居然差不了多少！&lt;br /&gt;
可以看出webkit,opera对putImageData做过优化。对于putImageData(imgdata, x, y, x, y, 1 ,1)方法，webkit,opera只对（x,y,1,1）这个1平方px区域内的数据进行了put操作，区域外的数据并没有进行操作，这样在效率上会有很大的提高。&lt;br /&gt;
可惜的是firefox(9)就没有做过优化。要加油啊，Mozila！&lt;br /&gt;
最新测试了下ie9，结果显示第一种方法的效率的确很低，而第二种方法比第一种方法的效率还要低一倍。看来ie9果然也没用对putImageData进行优化，而且ie9下的getImageData也没用像其他浏览器下那么优化。对于getImageData(x,y,1,1)的获取，它操作的整个图像的像素数据的，而不是那个1平方px内的数据。&lt;/p&gt;
&lt;p&gt;目前来说，考虑到各个浏览器原生方法的效率问题，第三种方法是最优的，即不要反复调用getImageData和putmageData，因为某些浏览器下一旦调用就是操作全部imageData的，而不会看你的参数。不过在未来，各个浏览器肯定会对原生方法进行优化的，在考虑第一种方法的时候就不用有所顾忌了！&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>2</thr:total><description>我们开篇就提过，canvas的像素级操作相对来说是很低效的。
我们试着写一个图片切割效果。


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
	&amp;#60;meta charset=&amp;#34;utf-8&amp;#34;&amp;#62;
	&amp;#60;title&amp;#62;效率相关&amp;#60;/title&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
&amp;#60;canvas id=&amp;#34;board&amp;#34; width=&amp;#34;100&amp;#34; height=&amp;#34;110&amp;#34;&amp;#62;&amp;#60;/canvas&amp;#62;
&amp;#60;script type=&amp;#34;text/javascript&amp;#34;&amp;#62;
function splinter(ctx,imgPixels){
	var round = 0; //统计循环次数
	for(var y = 0; y &amp;#60; imgPixels.height; y++){
		for(var x = 0; x &amp;#60; imgPixels.width; x++){
			/* 虽然只调用了putImageData一个方法，但是操作的data非常多 */
			ctx.putImageData(imgPixels, x, y, x, y, 1 ,1); //后四个参数控制显示区域
			round ++ ;
		}
	}
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897175/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897175/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;我们开篇就提过，canvas的像素级操作相对来说是很低效的。&lt;/p&gt;
&lt;p&gt;我们试着写一个图片切割效果。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_iJIjU1&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,imgPixels){
	var round = 0; //统计循环次数
	for(var y = 0; y &amp;lt; imgPixels.height; y++){
		for(var x = 0; x &amp;lt; imgPixels.width; x++){
			/* 虽然只调用了putImageData一个方法，但是操作的data非常多 */
			ctx.putImageData(imgPixels, x, y, x, y, 1 ,1); //后四个参数控制显示区域
			round ++ ;
		}
	}
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx = document.getElementById('board').getContext('2d');
	var imgPixels = tempCtx.getImageData(0, 0, w, h);
	return splinter(ctx,imgPixels);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共执行了&amp;quot; + func + &amp;quot;次的putImageData&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_iJIjU1');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;对于这个效果，因为我们并不需要操作图像的rgba数据，而只是把图像进行分割，所以利用putImageData的后四个可见区参数进行了设置就行了。&lt;br /&gt;
但是，这样做的性能却非常不理想。因为我们操作的ImageData数据实在太多了，循环执行了2750遍，相当于我们对整幅图像进行了2750次的像素级复制，而其实在可见区之外的ImageData数据并不是我们所需要的。&lt;/p&gt;
&lt;p&gt;那么，我们在对源图getImageData的时候，可以只获取我们需要的ImageData。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode__12mcG&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,tempCtx, w, h){
	var newData = [];
	var round = 0; //统计循环次数
	for(var y = 0; y &amp;lt; h; y++){
		newData[y] = [];
		for(var x = 0; x &amp;lt; w; x++){
			newData[y][x] = tempCtx.getImageData(x, y, 1, 1); //分开获取所需要的ImageData
			ctx.putImageData(newData[y][x], x*2, y*2);
			round ++ ;
		}
	}
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx =  document.getElementById('board').getContext('2d');
	return round = splinter(ctx,tempCtx, w, h);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共执行了&amp;quot; + func + &amp;quot;次的getImageData和putImageData&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode__12mcG');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二种做法虽然在循环的时候多运行了一个方法（共执行2750次的getImageData和putImageData方法），但因为操作的ImageData少了2750倍，所以在效率上比第一种方式高了很多。&lt;/p&gt;
&lt;p&gt;但从流程上来讲，我们只需要在刚开始的时候获取一次源图的ImageData（执行getImageData），对数据进行再排列后，最后再输出一次新的ImageData（执行putImageData）就可以了。&lt;br /&gt;
根本不需要在循环中反复调用getImageData和putImageData。所以现在的关键点是get和put之间的如何对数据进行重排列。&lt;/p&gt;
&lt;p&gt;ImageData.data可以看做一个矩形矩阵，我们已知，它的序列号（n）与ImageData.width(w),及x轴序列号(x),y轴序列号（y）的关系是：n = ((y * w) + x) * 4;  （其中的4表示了RGBA四个数据）。我们要的新的输出ImageData，其实是x加倍，y加倍，w加倍的一个新矩阵。那么新矩阵序号与原x,y,w的关系式应该是：t = ((y * 2 * w * 2) + x * 2) * 4;&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_cDRg9u&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
	&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;
	&amp;lt;title&amp;gt;效率相关&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;canvas id=&amp;quot;board&amp;quot; width=&amp;quot;100&amp;quot; height=&amp;quot;110&amp;quot;&amp;gt;&amp;lt;/canvas&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function splinter(ctx,imgPixels){
	var round = 0; //统计循环次数
	var n = 0,
		w = imgPixels.width,
		h = imgPixels.height,
		newdata = ctx.createImageData(w*2, h*2);
	for(var y = 0; y &amp;lt; h; y++){
		for(var x = 0; x &amp;lt; w; x++){
			n = ((y * w) + x) * 4; /* data序号n与x,y,w的关系 */
			t = ((y * 2 * w * 2) + x * 2) * 4; /* 分割后，y,x,w都变大了一倍 */
			newdata.data[t] =  imgPixels.data[n];
			newdata.data[t + 1] =  imgPixels.data[n + 1];
			newdata.data[t + 2] =  imgPixels.data[n + 2];
			newdata.data[t + 3] =  imgPixels.data[n + 3];
			round ++ ;
		}
	}
	ctx.putImageData(newdata, 0, 0);
	return round;
}
function demo(img){
	var w = img.width,
		h = img.height;
	var temp = document.createElement('canvas');
		temp.width = w;
		temp.height = h;
	var tempCtx = temp.getContext('2d');
		tempCtx.drawImage(img, 0, 0, w, h);
	var ctx = document.getElementById('board').getContext('2d');
	var imgPixels = tempCtx.getImageData(0, 0, w, h);
	return splinter(ctx,imgPixels);
}
(function(){
	var img = new Image();
		img.src = &amp;quot;/blog/resource/avatar/avatar_s.jpg&amp;quot;;
		img.width = 50;
		img.height = 55;
		img.onload = function(){
			var d = new Date();
			var func = demo(img);
			alert(&amp;quot;耗时：&amp;quot; + (new Date() - d) + &amp;quot;(ms)，\n共循环了&amp;quot; + func + &amp;quot;次,循环内不执行getImageData和putImageData方法&amp;quot;);
		}
})()
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_cDRg9u');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第三种方法相对于第二种方法的效率提高了十几倍。第三种方法的关键点是找出新旧矩阵之间的关系，对于我们这一例来说还比较容易，复杂一点的，算法可就没这么简单了。&lt;/p&gt;
&lt;p&gt;——————————————&lt;br /&gt;
重要补充：&lt;/p&gt;
&lt;p&gt;我们先总结下三种方法：第一种：效率低差，但理解起来最简单。第三种，算法复杂，但效率最高。第二种，折中。&lt;br /&gt;
然而，如果使用的是webkit，opera浏览器，我们会发现第一种方法的效率比之第三种方法居然差不了多少！&lt;br /&gt;
可以看出webkit,opera对putImageData做过优化。对于putImageData(imgdata, x, y, x, y, 1 ,1)方法，webkit,opera只对（x,y,1,1）这个1平方px区域内的数据进行了put操作，区域外的数据并没有进行操作，这样在效率上会有很大的提高。&lt;br /&gt;
可惜的是firefox(9)就没有做过优化。要加油啊，Mozila！&lt;br /&gt;
最新测试了下ie9，结果显示第一种方法的效率的确很低，而第二种方法比第一种方法的效率还要低一倍。看来ie9果然也没用对putImageData进行优化，而且ie9下的getImageData也没用像其他浏览器下那么优化。对于getImageData(x,y,1,1)的获取，它操作的整个图像的像素数据的，而不是那个1平方px内的数据。&lt;/p&gt;
&lt;p&gt;目前来说，考虑到各个浏览器原生方法的效率问题，第三种方法是最优的，即不要反复调用getImageData和putmageData，因为某些浏览器下一旦调用就是操作全部imageData的，而不会看你的参数。不过在未来，各个浏览器肯定会对原生方法进行优化的，在考虑第一种方法的时候就不用有所顾忌了！&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1158.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——2.RGBA通道调色'&gt;canvas的像素级操作——2.RGBA通道调色&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1165.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——3.使用卷积矩阵'&gt;canvas的像素级操作——3.使用卷积矩阵&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2012/1140.html' rel='bookmark' title='Permanent Link: canvas的像素级操作——1.引子'&gt;canvas的像素级操作——1.引子&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897175/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897175/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">HTML5</category><category domain="http://www.cssass.com/blog">imageData</category><pubDate>Thu, 19 Jan 2012 16:48:34 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1179</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1179.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897175/5460608</fs:itemid></item><item><title>获取元素尺寸和位置的两个冷门方法</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897179/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1136</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2012/1136.html">&lt;p&gt;获取元素的尺寸，似乎offsetWidth/Height就可以了，还需要什么方法吗？&lt;br /&gt;
的确，一般情况下，获取元素尺寸，用offsetWidth/Height就搞定了，但如果这个元素是display:none的呢？&lt;br /&gt;
试验一下就知道，none元素的尺寸是0。&lt;/p&gt;
&lt;p&gt;所以需要我们下面的这个方法来获取。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_cZrJ4U&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;获取display:none元素的size&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{color:#ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;width:100px;height:100px;padding:20px;border:10px solid #ccc;display:none;&amp;quot;&amp;gt;asdd&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function $id(o){
	return document.getElementById(o);
}
var getSize = function(elem){
	if(elem.offsetWidth !== 0){
		/* 元素不是display:none的情况，这个时候是能得到尺寸的 */
		return {'width':elem.offsetWidth,
				'height':elem.offsetHeight
		};
	}
	var old = {};
	/* 将display:none元素设成visibility:hidden */
	var options = { position: &amp;quot;absolute&amp;quot;, visibility: &amp;quot;hidden&amp;quot;, display:&amp;quot;block&amp;quot; }
	for ( var name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}
	var temp = {'width':elem.offsetWidth,
				'height':elem.offsetHeight};
	for ( var name in options ) {
		elem.style[ name ] = old[ name ];
	}
	return temp;
};
alert(getSize($id(&amp;quot;box&amp;quot;)).height)
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_cZrJ4U');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二个，获取元素的位置。&lt;br /&gt;
或许你经常使用offsetLeft/Top来获取位置，不过offsetLeft/Top是相对 offsetParent的位置（在ie6，7下是相对直接父级的),并且在firefox下还有些&lt;a href=&quot;http://www.cssass.com/blog/index.php/2011/917.html&quot;&gt;小bug&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下面这个方法提供获取元素相对于窗口（页面可视区）的距离。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_9D8uqY&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;元素相对窗口左上角的值（ie下没有width，height值）&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
#box{position:absolute;left:200px;width:100px;height:200px;border:5px solid #ccc;background:#eee;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
	var box = document.getElementById(&amp;quot;box&amp;quot;);
	var pos = box.getBoundingClientRect();
	box.innerHTML = &amp;quot;top:&amp;quot;+pos.top +
					&amp;quot;&amp;lt;br /&amp;gt;left:&amp;quot;+pos.left +
					&amp;quot;&amp;lt;br /&amp;gt;bottom:&amp;quot;+pos.bottom +
					&amp;quot;&amp;lt;br /&amp;gt;right:&amp;quot;+pos.right +
					&amp;quot;&amp;lt;br /&amp;gt;width:&amp;quot;+pos.width +
					&amp;quot;&amp;lt;br /&amp;gt;height:&amp;quot;+pos.height
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_9D8uqY');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这个方法是由ie提出的，不过在其他浏览器吸收之后，还加了width，height两个值。&lt;/p&gt;
&lt;p&gt;重复一下，这个方法是相对于页面窗口的，至于相对于整个页面文档的距离，那只需加上scrollTop这些值就行了，不做赘述。&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/1048.html' rel='bookmark' title='Permanent Link: 如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸'&gt;如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>0</thr:total><description>获取元素的尺寸，似乎offsetWidth/Height就可以了，还需要什么方法吗？
的确，一般情况下，获取元素尺寸，用offsetWidth/Height就搞定了，但如果这个元素是display:none的呢？
试验一下就知道，none元素的尺寸是0。
所以需要我们下面的这个方法来获取。


&amp;#60;!doctype html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
&amp;#60;meta charset=&amp;#34;utf-8&amp;#34; /&amp;#62;
&amp;#60;title&amp;#62;获取display:none元素的size&amp;#60;/title&amp;#62;
&amp;#60;style&amp;#62;
body{color:#ccc;}
&amp;#60;/style&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
	&amp;#60;div id=&amp;#34;box&amp;#34; style=&amp;#34;width:100px;height:100px;padding:20px;border:10px solid #ccc;display:none;&amp;#34;&amp;#62;asdd&amp;#60;/div&amp;#62;
&amp;#60;/body&amp;#62;
&amp;#60;script type=&amp;#34;text/javascript&amp;#34;&amp;#62;
function $id(o){
	return document.getElementById(o);
}
var getSize = function(elem){
	if(elem.offsetWidth !== 0){
		/* 元素不是display:none的情况，这个时候是能得到尺寸的 */
		return {'width':elem.offsetWidth,
				'height':elem.offsetHeight
		};
	}
	var old = {};
	/* 将display:none元素设成visibility:hidden */
	var options = { position: &amp;#34;absolute&amp;#34;, visibility: &amp;#34;hidden&amp;#34;, display:&amp;#34;block&amp;#34; }
	for ( var name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}
	var temp = {'width':elem.offsetWidth,
				'height':elem.offsetHeight};
	for [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/1048.html' rel='bookmark' title='Permanent Link: 如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸'&gt;如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897179/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897179/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;获取元素的尺寸，似乎offsetWidth/Height就可以了，还需要什么方法吗？&lt;br /&gt;
的确，一般情况下，获取元素尺寸，用offsetWidth/Height就搞定了，但如果这个元素是display:none的呢？&lt;br /&gt;
试验一下就知道，none元素的尺寸是0。&lt;/p&gt;
&lt;p&gt;所以需要我们下面的这个方法来获取。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_cZrJ4U&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;获取display:none元素的size&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{color:#ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div id=&amp;quot;box&amp;quot; style=&amp;quot;width:100px;height:100px;padding:20px;border:10px solid #ccc;display:none;&amp;quot;&amp;gt;asdd&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
function $id(o){
	return document.getElementById(o);
}
var getSize = function(elem){
	if(elem.offsetWidth !== 0){
		/* 元素不是display:none的情况，这个时候是能得到尺寸的 */
		return {'width':elem.offsetWidth,
				'height':elem.offsetHeight
		};
	}
	var old = {};
	/* 将display:none元素设成visibility:hidden */
	var options = { position: &amp;quot;absolute&amp;quot;, visibility: &amp;quot;hidden&amp;quot;, display:&amp;quot;block&amp;quot; }
	for ( var name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}
	var temp = {'width':elem.offsetWidth,
				'height':elem.offsetHeight};
	for ( var name in options ) {
		elem.style[ name ] = old[ name ];
	}
	return temp;
};
alert(getSize($id(&amp;quot;box&amp;quot;)).height)
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_cZrJ4U');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;第二个，获取元素的位置。&lt;br /&gt;
或许你经常使用offsetLeft/Top来获取位置，不过offsetLeft/Top是相对 offsetParent的位置（在ie6，7下是相对直接父级的),并且在firefox下还有些&lt;a href=&quot;http://www.cssass.com/blog/index.php/2011/917.html&quot;&gt;小bug&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下面这个方法提供获取元素相对于窗口（页面可视区）的距离。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_9D8uqY&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;元素相对窗口左上角的值（ie下没有width，height值）&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
#box{position:absolute;left:200px;width:100px;height:200px;border:5px solid #ccc;background:#eee;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
	&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
	var box = document.getElementById(&amp;quot;box&amp;quot;);
	var pos = box.getBoundingClientRect();
	box.innerHTML = &amp;quot;top:&amp;quot;+pos.top +
					&amp;quot;&amp;lt;br /&amp;gt;left:&amp;quot;+pos.left +
					&amp;quot;&amp;lt;br /&amp;gt;bottom:&amp;quot;+pos.bottom +
					&amp;quot;&amp;lt;br /&amp;gt;right:&amp;quot;+pos.right +
					&amp;quot;&amp;lt;br /&amp;gt;width:&amp;quot;+pos.width +
					&amp;quot;&amp;lt;br /&amp;gt;height:&amp;quot;+pos.height
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_9D8uqY');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这个方法是由ie提出的，不过在其他浏览器吸收之后，还加了width，height两个值。&lt;/p&gt;
&lt;p&gt;重复一下，这个方法是相对于页面窗口的，至于相对于整个页面文档的距离，那只需加上scrollTop这些值就行了，不做赘述。&lt;/p&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2011/1048.html' rel='bookmark' title='Permanent Link: 如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸'&gt;如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897179/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897179/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">DOM</category><category domain="http://www.cssass.com/blog">Javascript</category><category domain="http://www.cssass.com/blog">getBoundingClientRect</category><category domain="http://www.cssass.com/blog">offsetHeight</category><pubDate>Thu, 19 Jan 2012 13:57:37 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1136</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2012/1136.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897179/5460608</fs:itemid></item><item><title>mouseenter/mouseleave事件和delegate方法的实现</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897180/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1127</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2011/1127.html">&lt;p&gt;众所周知，事件onmouseover和onmouseout有一个极其不好的问题，就是在绑定元素内部的子元素上滑动会反复触发事件，及执行绑定的方法。&lt;/p&gt;
&lt;p&gt;而ie在很早的时候有提供了另一对事件：mouseenter和mouseleaver。顾名思义，就是只有当mouse滑进滑出绑定元素的时候，才会触发。&lt;/p&gt;
&lt;p&gt;但是，这本来只是ie的私有属性，虽然已属于DOM3 Event草案当中，其他浏览器的支持率并不是很高，目前看来，Opera11.10已提供支持，而Firefox到10.0会提供支持，Webkit的暂无消息。&lt;br /&gt;
所以，如果想要用，我们得自己动手。&lt;/p&gt;
&lt;p&gt;先搞一个通用的事件绑定函数：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;ol class=&quot;hl-main ln-show&quot; title=&quot;Double click to hide line number.&quot; ondblclick = &quot;linenumber(this)&quot;&gt;&lt;li class=&quot;hl-firstline&quot;&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&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: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;detachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;p&gt;我们的mouseenter/leave是通过mouseover/out来实现的，只需屏蔽mouseover/out在元素内部触发时的事件传播即可。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_n0f09C&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;实现mouseenter、mouseleave事件&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;}
.inner{height:100px;background:#eee;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	只有移进移出外框的时候才执行方法。对内框操作不执行。click点击解除绑定。
	&amp;lt;div id=&amp;quot;inner&amp;quot; class=&amp;quot;inner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._mouseFn ={}; //保存“onmouseenter”和“onmouseleave”所绑定的方法
events._mouseHandle = function(fn){
	/* 转换方法，符合条件时才会执行 */
	var func = function(event){
		var target = event.target;
		var parent = event.relatedTarget; //在onmouseover/out操作中，相关的另一个节点
		while( parent &amp;amp;&amp;amp; parent != this ){
			try{ parent = parent.parentNode; }
			catch(e){break;}
		}
		/* 只有当相关节点的父级不会是绑定的节点时（即二者不是父子的包含关系），才调用fn，否则不做处理 */
		( parent != this ) &amp;amp;&amp;amp; (fn.call(target,event));
	};
	return func;
}
events.addEvent = function( obj,type,fn ) {
	if(obj.addEventListener)
    {
		if(obj.onmouseenter !== undefined){
			//for opera11，firefox10。他们也支持“onmouseenter”和“onmouseleave”，可以直接绑定
			obj.addEventListener(type,fn,false);
			return ;
		}
		if(type==&amp;quot;mouseenter&amp;quot; || type==&amp;quot;mouseleave&amp;quot; ){
			var eType = (type==&amp;quot;mouseenter&amp;quot;) ? &amp;quot;mouseover&amp;quot; : &amp;quot;mouseout&amp;quot;;
			var fnNew = events._mouseHandle(fn);
			obj.addEventListener(eType,fnNew,false);
			 /* 将方法存入events._mouseFn，以便以后remove */
			if(!events._mouseFn[obj]) events._mouseFn[obj] = {};
			if(!events._mouseFn[obj][eType]) events._mouseFn[obj][eType] = {};
				events._mouseFn[obj][eType][fn] = fnNew;
		}else{
			obj.addEventListener(type,fn,false);
		}
    }else if(obj.attachEvent)
    {
		// for ie
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fn);
    }
};
events.removeEvent = function(obj,type,fn ) {
    if(obj.addEventListener)
    {
		if(obj.onmouseenter !== undefined){
			obj.removeEventListener(type,fn,false);
			return ;
		}
		if(type==&amp;quot;mouseenter&amp;quot; || type==&amp;quot;mouseleave&amp;quot; ){
			var eType = (type==&amp;quot;mouseenter&amp;quot;) ? &amp;quot;mouseover&amp;quot; : &amp;quot;mouseout&amp;quot;;
			if(!events._mouseFn[obj][eType][fn]) return;
			obj.removeEventListener(eType,events._mouseFn[obj][eType][fn],false);
			events._mouseFn[obj][eType][fn] = null;
		}else{
			obj.removeEventListener(type,fn,false);
		}
    }
    else if(obj.attachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fn);
    }
};
(function(){
	/* 这里是演示demo 绑定解除事件 */
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = $id(&amp;quot;inner&amp;quot;);
	events.addEvent(outer,&amp;quot;mouseenter&amp;quot;,add);
	events.addEvent(outer,&amp;quot;mouseleave&amp;quot;,add);
	events.addEvent(outer,&amp;quot;click&amp;quot;,remove);
	function add(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		inner.innerHTML = target.id + ' ' + e.type;
	}
	function remove(){
		events.removeEvent(outer,&amp;quot;mouseenter&amp;quot;,add);
		events.removeEvent(outer,&amp;quot;mouseleave&amp;quot;,add)
		inner.innerHTML = &amp;quot;click&amp;quot;;
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_n0f09C');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;为了解除绑定，我们设计了一个events._mouseFn来保存绑定的方法，在解除操作时读取对应的方法进行解绑。因为事件可以绑定多个方法，我们需要保存对应的方法，以便之后对应解除。&lt;br /&gt;
当然如果这里如果按面向对象的思路实现，就可以各自保存，而不需要保持在同一个events._mouseFn对象下。但每绑定一个事件，都需实例化一个对象，显得很多余，所以不采用面向对象的模式。&lt;/p&gt;
&lt;p&gt;接下来是文章的第二部分，我们来实现下jquery中提供的delegate方法。&lt;br /&gt;
（delegate是live方法的扩展版。delegate是基于live的，live是基于bind的。在jquery1.7中又被封装进了on方法。1.7中的on方法是一个很辽阔的方法。其实封装的越厉害，效率就越差了，这也是为什么我们选择自己做简单封装的原因，而不是使用jquery已封装好的）。&lt;br /&gt;
这个方法可以将想要绑定在子级元素上的事件方法，委托绑定在其父级上，用事件传播机制来触发执行。&lt;br /&gt;
这么做的好处有：&lt;br /&gt;
1：如果子级有n个并列元素需要绑定，绑子级需要绑n次，而将其绑定在父级上则只需绑定一次，这是很高效的。&lt;br /&gt;
2：如果子级元素有动态增加的话，新增元素是没有绑定过任何事件方法的。而如果之前选择的是绑定其父级，就不会有这个问题。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_2jGUZ9&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;delegate委托绑定事件方法的实现&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;zoom:1;}
.inner{display:block;height:50px;margin:5px;background:#eee;border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	&amp;lt;div id=&amp;quot;message&amp;quot;&amp;gt;点击下面框体&amp;lt;/div&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;1:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;2:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;3:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;4:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;5:&amp;lt;/span&amp;gt;
	&amp;lt;div id=&amp;quot;unbind&amp;quot;&amp;gt;点击解除绑定&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._deleFn = {};
events._delegateHandle = function(obj,elm,fn){
	var func = function(event){
		var event = event || window.event;
		var target = event.srcElement || event.target;
		var parent = target;
		function contain(item,list){
			/* item对象是否就是list对象 */
			if(list.length == undefined ) return (item === list);
			/* item对象是否是list对象数组中的一个 */
			for(var i=0 ; i&amp;lt;list.length; i++){
				if(item === list[i]) return true;
			}
			return false;
		}
		while(parent){
			/* 如果触发的元素，属于绑定元素(elm)的子级。才执行方法 */
			if(contain(parent,elm)){
				fn.call(obj,event);
				return;
			}
			parent = parent.parentNode;
		}
	};
	return func;
};
events.delegate = function(obj,elm,type,fn){
	/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */
	var fnNew = events._delegateHandle(obj,elm,fn);
	if(!events._deleFn[elm]) events._deleFn[elm] = {};
	if(!events._deleFn[elm][type]) events._deleFn[elm][type] = {};
	events._deleFn[elm][type][fn] = fnNew;
	if(obj.addEventListener)
    {
		obj.addEventListener(type,fnNew,false);
    }else if(obj.attachEvent)
    {
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
};
events.undelegate = function(obj,elm,type,fn){
	var fnNew = events._deleFn[elm][type][fn];
	if(!fnNew) return;
	if(obj.removeEventListener)
    {
		obj.removeEventListener(type,fnNew,false);
    }else if(obj.detachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
	events._deleFn[elm][type][fn] = null;
};
(function(){
	/* 这里是演示demo*/
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = outer.getElementsByTagName(&amp;quot;span&amp;quot;),
		msg = $id(&amp;quot;message&amp;quot;),
		unbind = $id(&amp;quot;unbind&amp;quot;);
	var add = function(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		msg.innerHTML =  target.innerHTML + ' ' + e.type;
	}
	function color(){
		msg.style.color = &amp;quot;#c00&amp;quot;
	}
	function remove(){
		events.undelegate(outer,inner,&amp;quot;click&amp;quot;,color);
		events.undelegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
		msg.style.color = &amp;quot;#000&amp;quot;
		msg.innerHTML = &amp;quot;已解除绑定color方法.add方法仍在&amp;quot;;
	}
	events.delegate(outer,inner,&amp;quot;click&amp;quot;,add);
	events.delegate(outer,inner,&amp;quot;click&amp;quot;,color);
	events.delegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_2jGUZ9');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这里的实现思路是这样的：如果触发事件的元素，是你想要绑定的元素的子级（当然他肯定已是委托实际绑定元素的子级），就执行绑定的事件方法，否则方法就不执行，看上去就像方法没绑定过一样。&lt;br /&gt;
同实现onmouseenter一样，我们也设计了一个events._deleFn来用于后面的解绑方法undelegate的实现。&lt;/p&gt;
&lt;p&gt;在使用delegate时，我们同样遇到了mouseover/out的问题。&lt;br /&gt;
我们的解决方案是：不罗嗦，直接将mouseover/out处理成mouseenter/leave&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_UARiws&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;delegate委托绑定事件方法的实现&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;zoom:1;}
.inner{display:block;height:50px;background:#eee;border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	&amp;lt;div id=&amp;quot;message&amp;quot;&amp;gt;划过下面框体&amp;lt;/div&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;1:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;2:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;3:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;4:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;5:&amp;lt;/span&amp;gt;
	&amp;lt;div id=&amp;quot;unbind&amp;quot;&amp;gt;点击解除绑定&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._deleFn = {};
events._delegateHandle = function(obj,elm,fn){
	var func = function(event){
		var event = event || window.event;
		var target = event.srcElement || event.target;
		var parent = target;
		function contain(item,list){
			/* item对象是否就是list对象 */
			if(list.length == undefined ) return (item === list);
			/* item对象是否是list对象数组中的一个 */
			for(var i=0 ; i&amp;lt;list.length; i++){
				if(item === list[i]) return true;
			}
			return false;
		}
		while(parent){
			/* 如果触发的元素，属于绑定元素(elm)的子级。 */
			if(contain(parent,elm)){
				if(event.type == 'mouseover' || event.type == 'mouseout'){
					/*
					* 将mouseover/out直接处理成mouseenter/leave: 事件相关元素不属于绑定元素的子级，才绑定方法
					*/
					//事件相关元素。ie下使用toElement和fromElement，其他用relatedTarget。
					var related = event.relatedTarget || ((event.type == 'mouseout') ? event.toElement : event.fromElement);
					if(contain(target,elm) &amp;amp;&amp;amp; contain(related,elm)) {
						/* 如果，触发元素和相关元素都属于绑定元素(elm)。执行方法 */
						fn.call(obj,event);
						return;
					}
					while( related &amp;amp;&amp;amp; !contain(related,elm)){
						  related = related.parentNode;
					}
					/* 事件相关元素，不属于绑定元素(elm)的子级，执行方法  */
					!contain(related,elm) &amp;amp;&amp;amp; (fn.call(obj,event));
				}else{
					fn.call(obj,event);
				}
				return;
			}
			parent = parent.parentNode;
		}
	};
	return func;
};
events.delegate = function(obj,elm,type,fn){
	/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */
	var fnNew = events._delegateHandle(obj,elm,fn);
	if(!events._deleFn[elm]) events._deleFn[elm] = {};
	if(!events._deleFn[elm][type]) events._deleFn[elm][type] = {};
	events._deleFn[elm][type][fn] = fnNew;
	if(obj.addEventListener)
    {
		obj.addEventListener(type,fnNew,false);
    }else if(obj.attachEvent)
    {
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
};
events.undelegate = function(obj,elm,type,fn){
	var fnNew = events._deleFn[elm][type][fn];
	if(!fnNew) return;
	if(obj.removeEventListener)
    {
		obj.removeEventListener(type,fnNew,false);
    }else if(obj.detachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
events._deleFn[elm][type][fn] = null;
};
(function(){
	/* 这里是演示demo*/
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = outer.getElementsByTagName(&amp;quot;span&amp;quot;),
		msg = $id(&amp;quot;message&amp;quot;),
		unbind = $id(&amp;quot;unbind&amp;quot;);
	events.delegate(outer,inner,&amp;quot;mouseover&amp;quot;,add);
	events.delegate(outer,inner,&amp;quot;mouseout&amp;quot;,add);
	events.delegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
	function add(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		msg.innerHTML =  target.innerHTML + ' ' + e.type;
	}
	function remove(){
		events.undelegate(outer,inner,&amp;quot;mouseover&amp;quot;,add);
		events.undelegate(outer,inner,&amp;quot;mouseout&amp;quot;,add);
		events.undelegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_UARiws');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最后，整理一下，封装一个支持mouseenter 和 mouseleave事件，delegate方法 及其他们的解除绑定的方法的 功能函数库。&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;ol class=&quot;hl-main ln-show&quot; title=&quot;Double click to hide line number.&quot; ondblclick = &quot;linenumber(this)&quot;&gt;&lt;li class=&quot;hl-firstline&quot;&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&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: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//保存delegate所绑定的方法&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&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: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//保存“onmouseenter”和“onmouseleave”所绑定的方法&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseHandle&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 实现mouseenter/leave 的转换方法，符合条件时才会执行 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;relatedTarget&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//在onmouseover/out操作中，相关的另一个节点&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; != &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;this&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: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;break&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 只有当相关节点的父级不会是绑定的节点时（即二者不是父子的包含关系），才调用fn，否则不做处理 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; != &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;this&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: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_delegateHandle&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 实现delegate 的转换方法，符合条件时才会执行 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;srcElement&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; || &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* item对象是否就是list对象 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; == &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&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: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* item对象是否是list对象数组中的一个 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: Maroon;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 如果触发的元素，属于绑定元素(elm)的子级。 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseover&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseout&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * 将mouseover/out直接处理成mouseenter/leave: 事件相关元素不属于绑定元素的子级，才绑定方法 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//事件相关元素。ie下使用toElement和fromElement，其他用relatedTarget。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;relatedTarget&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseout&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;toElement&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fromElement&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 如果，触发元素和相关元素都属于绑定元素(elm)。执行方法 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; !&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 事件相关元素，不属于绑定元素(elm)的子级，执行方法&amp;nbsp; */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;onmouseenter&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//for opera11，firefox10。他们也支持“onmouseenter”和“onmouseleave”，可以直接绑定&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseleave&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseover&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: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseout&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseHandle&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 将方法存入events._mouseFn，以便以后remove */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;// for ie &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;onmouseenter&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseleave&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseover&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: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseout&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;detachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_delegateHandle&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undelegate&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #9c3;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;


&lt;p&gt;No related posts. From:&lt;a href=\</content><thr:total>0</thr:total><description>众所周知，事件onmouseover和onmouseout有一个极其不好的问题，就是在绑定元素内部的子元素上滑动会反复触发事件，及执行绑定的方法。
而ie在很早的时候有提供了另一对事件：mouseenter和mouseleaver。顾名思义，就是只有当mouse滑进滑出绑定元素的时候，才会触发。
但是，这本来只是ie的私有属性，虽然已属于DOM3 Event草案当中，其他浏览器的支持率并不是很高，目前看来，Opera11.10已提供支持，而Firefox到10.0会提供支持，Webkit的暂无消息。
所以，如果想要用，我们得自己动手。
先搞一个通用的事件绑定函数：
var addEvent = function( target,type,fn ) {
&amp;#160; &amp;#160; if(target.addEventListener)
&amp;#160; &amp;#160; {
&amp;#160; &amp;#160; &amp;#160; &amp;#160; target.addEventListener(type,fn,false);
&amp;#160; &amp;#160; }
&amp;#160; &amp;#160; else&amp;#160;if(target.attachEvent)
&amp;#160; &amp;#160; {
&amp;#160; &amp;#160; &amp;#160; &amp;#160; target.attachEvent(&amp;#34;on&amp;#34; + type,fn);
&amp;#160; &amp;#160; }
};
var&amp;#160;removeEvent = function(target,type,fn ) {
&amp;#160; &amp;#160; if(target.addEventListener)
&amp;#160; &amp;#160; {
&amp;#160; &amp;#160; &amp;#160; &amp;#160; target.removeEventListener(type,fn,false);
&amp;#160; &amp;#160; }
&amp;#160; &amp;#160; else&amp;#160;if(target.attachEvent)
&amp;#160; &amp;#160; {
&amp;#160; &amp;#160; &amp;#160; &amp;#160; target.detachEvent(&amp;#34;on&amp;#34; + type,fn);
&amp;#160; &amp;#160; [...]


No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897180/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897180/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;众所周知，事件onmouseover和onmouseout有一个极其不好的问题，就是在绑定元素内部的子元素上滑动会反复触发事件，及执行绑定的方法。&lt;/p&gt;
&lt;p&gt;而ie在很早的时候有提供了另一对事件：mouseenter和mouseleaver。顾名思义，就是只有当mouse滑进滑出绑定元素的时候，才会触发。&lt;/p&gt;
&lt;p&gt;但是，这本来只是ie的私有属性，虽然已属于DOM3 Event草案当中，其他浏览器的支持率并不是很高，目前看来，Opera11.10已提供支持，而Firefox到10.0会提供支持，Webkit的暂无消息。&lt;br /&gt;
所以，如果想要用，我们得自己动手。&lt;/p&gt;
&lt;p&gt;先搞一个通用的事件绑定函数：&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;ol class=&quot;hl-main ln-show&quot; title=&quot;Double click to hide line number.&quot; ondblclick = &quot;linenumber(this)&quot;&gt;&lt;li class=&quot;hl-firstline&quot;&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&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: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;detachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;
&lt;p&gt;我们的mouseenter/leave是通过mouseover/out来实现的，只需屏蔽mouseover/out在元素内部触发时的事件传播即可。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_n0f09C&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;实现mouseenter、mouseleave事件&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;}
.inner{height:100px;background:#eee;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	只有移进移出外框的时候才执行方法。对内框操作不执行。click点击解除绑定。
	&amp;lt;div id=&amp;quot;inner&amp;quot; class=&amp;quot;inner&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._mouseFn ={}; //保存“onmouseenter”和“onmouseleave”所绑定的方法
events._mouseHandle = function(fn){
	/* 转换方法，符合条件时才会执行 */
	var func = function(event){
		var target = event.target;
		var parent = event.relatedTarget; //在onmouseover/out操作中，相关的另一个节点
		while( parent &amp;amp;&amp;amp; parent != this ){
			try{ parent = parent.parentNode; }
			catch(e){break;}
		}
		/* 只有当相关节点的父级不会是绑定的节点时（即二者不是父子的包含关系），才调用fn，否则不做处理 */
		( parent != this ) &amp;amp;&amp;amp; (fn.call(target,event));
	};
	return func;
}
events.addEvent = function( obj,type,fn ) {
	if(obj.addEventListener)
    {
		if(obj.onmouseenter !== undefined){
			//for opera11，firefox10。他们也支持“onmouseenter”和“onmouseleave”，可以直接绑定
			obj.addEventListener(type,fn,false);
			return ;
		}
		if(type==&amp;quot;mouseenter&amp;quot; || type==&amp;quot;mouseleave&amp;quot; ){
			var eType = (type==&amp;quot;mouseenter&amp;quot;) ? &amp;quot;mouseover&amp;quot; : &amp;quot;mouseout&amp;quot;;
			var fnNew = events._mouseHandle(fn);
			obj.addEventListener(eType,fnNew,false);
			 /* 将方法存入events._mouseFn，以便以后remove */
			if(!events._mouseFn[obj]) events._mouseFn[obj] = {};
			if(!events._mouseFn[obj][eType]) events._mouseFn[obj][eType] = {};
				events._mouseFn[obj][eType][fn] = fnNew;
		}else{
			obj.addEventListener(type,fn,false);
		}
    }else if(obj.attachEvent)
    {
		// for ie
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fn);
    }
};
events.removeEvent = function(obj,type,fn ) {
    if(obj.addEventListener)
    {
		if(obj.onmouseenter !== undefined){
			obj.removeEventListener(type,fn,false);
			return ;
		}
		if(type==&amp;quot;mouseenter&amp;quot; || type==&amp;quot;mouseleave&amp;quot; ){
			var eType = (type==&amp;quot;mouseenter&amp;quot;) ? &amp;quot;mouseover&amp;quot; : &amp;quot;mouseout&amp;quot;;
			if(!events._mouseFn[obj][eType][fn]) return;
			obj.removeEventListener(eType,events._mouseFn[obj][eType][fn],false);
			events._mouseFn[obj][eType][fn] = null;
		}else{
			obj.removeEventListener(type,fn,false);
		}
    }
    else if(obj.attachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fn);
    }
};
(function(){
	/* 这里是演示demo 绑定解除事件 */
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = $id(&amp;quot;inner&amp;quot;);
	events.addEvent(outer,&amp;quot;mouseenter&amp;quot;,add);
	events.addEvent(outer,&amp;quot;mouseleave&amp;quot;,add);
	events.addEvent(outer,&amp;quot;click&amp;quot;,remove);
	function add(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		inner.innerHTML = target.id + ' ' + e.type;
	}
	function remove(){
		events.removeEvent(outer,&amp;quot;mouseenter&amp;quot;,add);
		events.removeEvent(outer,&amp;quot;mouseleave&amp;quot;,add)
		inner.innerHTML = &amp;quot;click&amp;quot;;
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_n0f09C');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;为了解除绑定，我们设计了一个events._mouseFn来保存绑定的方法，在解除操作时读取对应的方法进行解绑。因为事件可以绑定多个方法，我们需要保存对应的方法，以便之后对应解除。&lt;br /&gt;
当然如果这里如果按面向对象的思路实现，就可以各自保存，而不需要保持在同一个events._mouseFn对象下。但每绑定一个事件，都需实例化一个对象，显得很多余，所以不采用面向对象的模式。&lt;/p&gt;
&lt;p&gt;接下来是文章的第二部分，我们来实现下jquery中提供的delegate方法。&lt;br /&gt;
（delegate是live方法的扩展版。delegate是基于live的，live是基于bind的。在jquery1.7中又被封装进了on方法。1.7中的on方法是一个很辽阔的方法。其实封装的越厉害，效率就越差了，这也是为什么我们选择自己做简单封装的原因，而不是使用jquery已封装好的）。&lt;br /&gt;
这个方法可以将想要绑定在子级元素上的事件方法，委托绑定在其父级上，用事件传播机制来触发执行。&lt;br /&gt;
这么做的好处有：&lt;br /&gt;
1：如果子级有n个并列元素需要绑定，绑子级需要绑n次，而将其绑定在父级上则只需绑定一次，这是很高效的。&lt;br /&gt;
2：如果子级元素有动态增加的话，新增元素是没有绑定过任何事件方法的。而如果之前选择的是绑定其父级，就不会有这个问题。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_2jGUZ9&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;delegate委托绑定事件方法的实现&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;zoom:1;}
.inner{display:block;height:50px;margin:5px;background:#eee;border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	&amp;lt;div id=&amp;quot;message&amp;quot;&amp;gt;点击下面框体&amp;lt;/div&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;1:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;2:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;3:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;4:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;5:&amp;lt;/span&amp;gt;
	&amp;lt;div id=&amp;quot;unbind&amp;quot;&amp;gt;点击解除绑定&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._deleFn = {};
events._delegateHandle = function(obj,elm,fn){
	var func = function(event){
		var event = event || window.event;
		var target = event.srcElement || event.target;
		var parent = target;
		function contain(item,list){
			/* item对象是否就是list对象 */
			if(list.length == undefined ) return (item === list);
			/* item对象是否是list对象数组中的一个 */
			for(var i=0 ; i&amp;lt;list.length; i++){
				if(item === list[i]) return true;
			}
			return false;
		}
		while(parent){
			/* 如果触发的元素，属于绑定元素(elm)的子级。才执行方法 */
			if(contain(parent,elm)){
				fn.call(obj,event);
				return;
			}
			parent = parent.parentNode;
		}
	};
	return func;
};
events.delegate = function(obj,elm,type,fn){
	/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */
	var fnNew = events._delegateHandle(obj,elm,fn);
	if(!events._deleFn[elm]) events._deleFn[elm] = {};
	if(!events._deleFn[elm][type]) events._deleFn[elm][type] = {};
	events._deleFn[elm][type][fn] = fnNew;
	if(obj.addEventListener)
    {
		obj.addEventListener(type,fnNew,false);
    }else if(obj.attachEvent)
    {
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
};
events.undelegate = function(obj,elm,type,fn){
	var fnNew = events._deleFn[elm][type][fn];
	if(!fnNew) return;
	if(obj.removeEventListener)
    {
		obj.removeEventListener(type,fnNew,false);
    }else if(obj.detachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
	events._deleFn[elm][type][fn] = null;
};
(function(){
	/* 这里是演示demo*/
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = outer.getElementsByTagName(&amp;quot;span&amp;quot;),
		msg = $id(&amp;quot;message&amp;quot;),
		unbind = $id(&amp;quot;unbind&amp;quot;);
	var add = function(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		msg.innerHTML =  target.innerHTML + ' ' + e.type;
	}
	function color(){
		msg.style.color = &amp;quot;#c00&amp;quot;
	}
	function remove(){
		events.undelegate(outer,inner,&amp;quot;click&amp;quot;,color);
		events.undelegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
		msg.style.color = &amp;quot;#000&amp;quot;
		msg.innerHTML = &amp;quot;已解除绑定color方法.add方法仍在&amp;quot;;
	}
	events.delegate(outer,inner,&amp;quot;click&amp;quot;,add);
	events.delegate(outer,inner,&amp;quot;click&amp;quot;,color);
	events.delegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_2jGUZ9');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这里的实现思路是这样的：如果触发事件的元素，是你想要绑定的元素的子级（当然他肯定已是委托实际绑定元素的子级），就执行绑定的事件方法，否则方法就不执行，看上去就像方法没绑定过一样。&lt;br /&gt;
同实现onmouseenter一样，我们也设计了一个events._deleFn来用于后面的解绑方法undelegate的实现。&lt;/p&gt;
&lt;p&gt;在使用delegate时，我们同样遇到了mouseover/out的问题。&lt;br /&gt;
我们的解决方案是：不罗嗦，直接将mouseover/out处理成mouseenter/leave&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_UARiws&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;delegate委托绑定事件方法的实现&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
.outer{padding:50px;background:#aaa;zoom:1;}
.inner{display:block;height:50px;background:#eee;border:1px solid #ccc;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;outer&amp;quot; class=&amp;quot;outer&amp;quot;&amp;gt;
	&amp;lt;div id=&amp;quot;message&amp;quot;&amp;gt;划过下面框体&amp;lt;/div&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;1:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;2:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;3:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;4:&amp;lt;/span&amp;gt;
	&amp;lt;span class=&amp;quot;inner&amp;quot;&amp;gt;5:&amp;lt;/span&amp;gt;
	&amp;lt;div id=&amp;quot;unbind&amp;quot;&amp;gt;点击解除绑定&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o;}
var events = {}
events._deleFn = {};
events._delegateHandle = function(obj,elm,fn){
	var func = function(event){
		var event = event || window.event;
		var target = event.srcElement || event.target;
		var parent = target;
		function contain(item,list){
			/* item对象是否就是list对象 */
			if(list.length == undefined ) return (item === list);
			/* item对象是否是list对象数组中的一个 */
			for(var i=0 ; i&amp;lt;list.length; i++){
				if(item === list[i]) return true;
			}
			return false;
		}
		while(parent){
			/* 如果触发的元素，属于绑定元素(elm)的子级。 */
			if(contain(parent,elm)){
				if(event.type == 'mouseover' || event.type == 'mouseout'){
					/*
					* 将mouseover/out直接处理成mouseenter/leave: 事件相关元素不属于绑定元素的子级，才绑定方法
					*/
					//事件相关元素。ie下使用toElement和fromElement，其他用relatedTarget。
					var related = event.relatedTarget || ((event.type == 'mouseout') ? event.toElement : event.fromElement);
					if(contain(target,elm) &amp;amp;&amp;amp; contain(related,elm)) {
						/* 如果，触发元素和相关元素都属于绑定元素(elm)。执行方法 */
						fn.call(obj,event);
						return;
					}
					while( related &amp;amp;&amp;amp; !contain(related,elm)){
						  related = related.parentNode;
					}
					/* 事件相关元素，不属于绑定元素(elm)的子级，执行方法  */
					!contain(related,elm) &amp;amp;&amp;amp; (fn.call(obj,event));
				}else{
					fn.call(obj,event);
				}
				return;
			}
			parent = parent.parentNode;
		}
	};
	return func;
};
events.delegate = function(obj,elm,type,fn){
	/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */
	var fnNew = events._delegateHandle(obj,elm,fn);
	if(!events._deleFn[elm]) events._deleFn[elm] = {};
	if(!events._deleFn[elm][type]) events._deleFn[elm][type] = {};
	events._deleFn[elm][type][fn] = fnNew;
	if(obj.addEventListener)
    {
		obj.addEventListener(type,fnNew,false);
    }else if(obj.attachEvent)
    {
        obj.attachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
};
events.undelegate = function(obj,elm,type,fn){
	var fnNew = events._deleFn[elm][type][fn];
	if(!fnNew) return;
	if(obj.removeEventListener)
    {
		obj.removeEventListener(type,fnNew,false);
    }else if(obj.detachEvent)
    {
        obj.detachEvent(&amp;quot;on&amp;quot; + type,fnNew);
    }
events._deleFn[elm][type][fn] = null;
};
(function(){
	/* 这里是演示demo*/
	var outer = $id(&amp;quot;outer&amp;quot;),
		inner = outer.getElementsByTagName(&amp;quot;span&amp;quot;),
		msg = $id(&amp;quot;message&amp;quot;),
		unbind = $id(&amp;quot;unbind&amp;quot;);
	events.delegate(outer,inner,&amp;quot;mouseover&amp;quot;,add);
	events.delegate(outer,inner,&amp;quot;mouseout&amp;quot;,add);
	events.delegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
	function add(){
		var e = arguments[0] || window.event;
		var target = e.srcElement || e.target;
		msg.innerHTML =  target.innerHTML + ' ' + e.type;
	}
	function remove(){
		events.undelegate(outer,inner,&amp;quot;mouseover&amp;quot;,add);
		events.undelegate(outer,inner,&amp;quot;mouseout&amp;quot;,add);
		events.undelegate(outer,unbind,&amp;quot;click&amp;quot;,remove);
	}
})()
&amp;lt;/script&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_UARiws');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;最后，整理一下，封装一个支持mouseenter 和 mouseleave事件，delegate方法 及其他们的解除绑定的方法的 功能函数库。&lt;/p&gt;
&lt;div class=&quot;hl-surround&quot;&gt;&lt;ol class=&quot;hl-main ln-show&quot; title=&quot;Double click to hide line number.&quot; ondblclick = &quot;linenumber(this)&quot;&gt;&lt;li class=&quot;hl-firstline&quot;&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&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: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//保存delegate所绑定的方法&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&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: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//保存“onmouseenter”和“onmouseleave”所绑定的方法&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseHandle&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 实现mouseenter/leave 的转换方法，符合条件时才会执行 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;relatedTarget&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//在onmouseover/out操作中，相关的另一个节点&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; != &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;this&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: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;try&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;catch&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;break&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 只有当相关节点的父级不会是绑定的节点时（即二者不是父子的包含关系），才调用fn，否则不做处理 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; != &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;this&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: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_delegateHandle&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 实现delegate 的转换方法，符合条件时才会执行 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;srcElement&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; || &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* item对象是否就是list对象 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; == &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&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: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* item对象是否是list对象数组中的一个 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: Maroon;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;item&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; === &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 如果触发的元素，属于绑定元素(elm)的子级。 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseover&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseout&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * 将mouseover/out直接处理成mouseenter/leave: 事件相关元素不属于绑定元素的子级，才绑定方法 &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//事件相关元素。ie下使用toElement和fromElement，其他用relatedTarget。&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;relatedTarget&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseout&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;'&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: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;toElement&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; : &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fromElement&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;target&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;))&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 如果，触发元素和相关元素都属于绑定元素(elm)。执行方法 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; !&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 事件相关元素，不属于绑定元素(elm)的子级，执行方法&amp;nbsp; */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; !&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;contain&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;related&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;call&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;event&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;parentNode&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;func&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Gray;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;onmouseenter&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;//for opera11，firefox10。他们也支持“onmouseenter”和“onmouseleave”，可以直接绑定&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseleave&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseover&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: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseout&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseHandle&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 将方法存入events._mouseFn，以便以后remove */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;// for ie &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&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;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;onmouseenter&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; !== &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undefined&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; ;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseleave&lt;/span&gt;&lt;span style=&quot;color: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&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: #39c;&quot;&gt;type&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: #E33100;&quot;&gt;mouseenter&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;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseover&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: #8b0000;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #E33100;&quot;&gt;mouseout&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_mouseFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;eType&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &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: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEventListener&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;false&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;attachEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;{&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;detachEvent&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: #E33100;&quot;&gt;on&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: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;delegate&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_delegateHandle&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;addEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #aaa;&quot;&gt;/* 将绑定的方法存入events._deleFn，以便之后解绑操作 */&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;])&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&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: Olive;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;undelegate&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;){&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;var&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9c3;&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: #39c;&quot;&gt;fnNew&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9c3;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;removeEvent&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;obj&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fnNew&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;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Gray;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;events&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;_deleFn&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;elm&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: Olive;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #39c;&quot;&gt;fn&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: #9c3;&quot;&gt;null&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: Olive;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: Gray;&quot;&gt;;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;


&lt;p&gt;No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897180/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897180/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">Javascript</category><category domain="http://www.cssass.com/blog">delegate</category><category domain="http://www.cssass.com/blog">mouseenter</category><category domain="http://www.cssass.com/blog">mouseleave</category><pubDate>Mon, 16 Jan 2012 15:59:12 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1127</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2011/1127.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897180/5460608</fs:itemid></item><item><title>瀑布流布局及扩展——格子块的智能堆砌</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897181/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1095</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2011/1095.html">&lt;p&gt;图片分享网站&lt;a href=&quot;http://pinterest.com/&quot;&gt;Pinterest&lt;/a&gt;（beta），在不久前获得了2700$的投资，估值已超2亿元（据说现该公司团队有8人）。该网站的一大特色就是每一张分享的图片被拟作“Pin”被钉在页面上面，每一Pin依尺寸智能排列，同时滚动页面时异步加载新Pin，极具效果。这种创新模式被在国内也被广泛copy，其中最有前途的当属&lt;a href=&quot;http://www.markzhi.com&quot; target=&quot;_blank&quot;&gt;Mark之&lt;/a&gt;，以&amp;#8221;Mark&amp;#8221;代&amp;#8221;Pin&amp;#8221;,也算有些想法。&lt;/p&gt;
&lt;p&gt;以下是利用豆瓣API数据做的效果：&lt;a href=&quot;http://www.cssass.com/blog/index.php/douban&quot; target=&quot;_blank&quot;&gt;完整效果&lt;/a&gt;&lt;br /&gt;
部分代码：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_PyZEk6&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;等宽格子堆砌&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
#wrap{position:relative;zoom:1;margin:0px auto;}
#wrap li{width:250px;float:left;list-style:none;}
.boxCont{position:relative;margin:15px;border:1px solid #ccc;background:#eee;
	background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
	background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	-webkit-border-radius: 60px / 5px;
	-moz-border-radius: 60px / 5px;
	border-radius:60px / 5px;
	-webkit-box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
	-moz-box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
	box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
}
.boxCont:before{
	content: '';
	width: 50px;
	height: 50px;
	top:0; right:0;
	position:absolute;
	display: inline-block;
	z-index:-1;
	-webkit-box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	-webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	-moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	-o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
}
.boxCont:after{
	content: '';
	width: 100px;
	height: 100px;
	top:0; left:0;
	position:absolute;
	z-index:-1;
	display: inline-block;
	-webkit-box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	-webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	-moz-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	-o-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	transform: rotate(2deg) translate(20px,25px) skew(20deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;wrap&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var $id = function(o){ return document.getElementById(o) || o};
function sort(el){
	var h = [];
	var box = el.getElementsByTagName(&amp;quot;li&amp;quot;);
	var minH = box[0].offsetHeight,
		boxW = box[0].offsetWidth,
		boxH,
		n = document.documentElement.offsetWidth / boxW | 0;  //计算页面能排下多少Pin
	el.style.width = n * boxW + &amp;quot;px&amp;quot;;
	for(var i = 0; i &amp;lt; box.length; i++) {
		boxh = box[i].offsetHeight; //获取每个Pin的高度
		if(i &amp;lt; n) { //第一行Pin以浮动排列，不需绝对定位
			h[i] = boxh;
			box[i].style.position = '';
		} else {
			minH =  Math.min.apply({},h); //取得各列累计高度最低的一列
			minKey = getarraykey(h, minH);
			h[minKey] += boxh ; //加上新高度后更新高度值
			box[i].style.position = 'absolute';
			box[i].style.top = minH + 'px';
			box[i].style.left = (minKey * boxW) + 'px';
		}
	}
};
/* 返回数组中某一值的对应项数 */
function getarraykey(s, v) {
	for(k in s) {
		if(s[k] == v) {
			return k;
		}
	}
};
/* 随机创建Pin */
var pin = '';
for(i = 0; i &amp;lt; 30; i++) {
	height = Math.floor(Math.random()*200 + 200);
	pin += '&amp;lt;li&amp;gt;&amp;lt;div class=&amp;quot;boxCont&amp;quot; style=&amp;quot;height:' + height + 'px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;';
};
$id(&amp;quot;wrap&amp;quot;).innerHTML = pin;
window.onload = window.onresize = function() {
	sort($id(&amp;quot;wrap&amp;quot;));
};
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_PyZEk6');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这种布局中虽然每个Pin的高度不尽相同，但是他们的宽度都是一样的。&lt;br /&gt;
那么假如，很邪恶的提出一个要求，宽度也不尽相同，只是说宽高都按比例成倍增加，那还怎么排列呢？&lt;br /&gt;
呵呵，如下：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_HQmfys&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;宽高尺寸不同的格子堆砌&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{background:#F6F7F8;}
.myWidget{position:relative;overflow:hidden;zoom:1;margin:0 auto;}
.MBox{float:left;}
.widgetBox{position:relative;overflow:hidden;zoom:1;width:186px;height:166px;margin:6px;border:1px solid #E1E1E3;
	border-radius:10px;
	-moz-border-radius:10px;
	-webkit-border-radius:10px;
	box-shadow:2px 3px 5px #d3d3d3;
	-moz-box-shadow:2px 3px 5px #d3d3d3;
	-webkit-box-shadow:2px 3px 5px #d3d3d3;
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#fefefe, endColorstr=#e0e0e2);
	background: linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -moz-linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -webkit-gradient(linear, 0 0, 0 100% , from(#fefefe),to(#e0e0e2));
	background: -webkit-linear-gradient(0 0, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
}
&amp;lt;/style&amp;gt;
&amp;lt;script&amp;gt;
var $id = function(o){ return document.getElementById(o) || o ;};
var getElementsByClassName = function(className,parent,tag) {
	parent = parent || document;
    if(parent.getElementsByClassName){
        return  parent.getElementsByClassName(className)
    }else{
        tag = tag || '*';
        var returnElements = []
        var els =  parent.getElementsByTagName(tag);
        className = className.replace(/\-/g, &amp;quot;\\-&amp;quot;);
        var pattern = new RegExp(&amp;quot;(^|\\s)&amp;quot;+className+&amp;quot;(\\s|$)&amp;quot;);
		var i = 0;
        while(i &amp;lt; els.length){
            if (pattern.test(els[i].className) ) {
                returnElements.push(els[i]);
            }
			i++;
        }
        return returnElements;
    }
};
/* 格子排序 */
var box={};
box.gen={w:200,h:180};
box.init=function(el){
	box.size=[]; //格子,[1,2]表示1X2的大格子
	box.obj={};
	box.oArray=[];
	box.maxY=-1;
	box.mbox = getElementsByClassName(&amp;quot;MBox&amp;quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &amp;gt;&amp;gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &amp;quot;px&amp;quot;;
	var i = 0 , nx, ny;
	while( i &amp;lt; this.mbox.length){
		if( getElementsByClassName(&amp;quot;bigBox&amp;quot;,this.mbox[i],'div').length &amp;gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &amp;gt; this.row) ? this.row : nx; //大小超出限制
			ny=Math.ceil(this.mbox[i].offsetHeight / this.gen.h);
			this.size.push([nx,ny]);
		}else{
			this.size.push(1);
		}
		i++;
	}
	box.sort(el);
};
box.setIfr=function(el){  //大格子初始化
 	var ifr = getElementsByClassName(&amp;quot;bigBox&amp;quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &amp;lt; ifr.length){
		theifr =  getElementsByClassName(&amp;quot;innerBox&amp;quot;,ifr[i],'div');
		nx=Math.ceil(theifr[0].offsetWidth / this.gen.w); //bigBox横向占的块数
		ny=Math.ceil(theifr[0].offsetHeight / this.gen.h);
		ifr[i].style.width = nx*this.gen.w-14 + 'px' ;
		ifr[i].style.height = ny*this.gen.h-14 + 'px' ;
		i++;
	}
};
box.sort=function(el){
	var y=0, x=0, temp={x:Infinity, y:Infinity}, flag=Infinity, name;
	for(var n=0; n &amp;lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x&amp;gt;box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&amp;lt;Infinity) flag=flag+1;
			continue;
		}
		if(!this.size[n].length){  //普通格子
			this.obj[name]=[x,y];  //项值（反映坐标值）
			x++;
		}
		else{  //大格子
			if(this.over(x,y,n)) {
				if(temp.y &amp;gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &amp;lt; Infinity){
					flag=1;
				}
				n--;
				x++;
				continue;
			}
			this.obj[name]=[x,y];
			this.apply(x,y,n);
			x+=this.size[n][0];
		}
		if(flag==-1) {
			flag = 	Infinity;
			temp.y = Infinity;
			temp.x = Infinity;
		}
		var h=this.size[n][1]-1 || 0;
		box.maxY=(box.maxY &amp;gt; y+h)? box.maxY : y+h;
	}
	for(var i in this.obj){
		if(this.obj[i]===0 || !this.obj.hasOwnProperty(i)) continue;
		this.oArray.push(this.obj[i]);
	}
	box.put(el);
};
box.hasN=function(n){
	return n in this.obj;
};
box.over=function(x,y,n){  //判断是否会重叠
	var name;
	if(x+this.size[n][0] &amp;gt; this.row) return true; //超出显示范围
	for(var k=1; k&amp;lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&amp;lt;this.size[n][0];k++){
		name=(x-0+k)+'_'+y;
		if(this.hasN(name)) {return true;}  //上侧一行有无重叠
	}
	return false;
};
box.apply=function(x,y,n){  //大格子中多占的位置
	var posX=x, //大格子左上角位置
		posY=y;
	for(var t=0; t&amp;lt;this.size[n][0]; t++) {
		for(var k=0; k&amp;lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;amp;&amp;amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&amp;lt; this.oArray.length; i++){
		x=box.gen.w*this.oArray[i][0];
		y=box.gen.h*this.oArray[i][1];
		box.mbox[i].style.cssText = &amp;quot;position:absolute;left:&amp;quot;+ x +&amp;quot;px;top:&amp;quot; + y + &amp;quot;px;&amp;quot;;
	}
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;myWidget&amp;quot; class=&amp;quot;myWidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
var myWidget = $id(&amp;quot;myWidget&amp;quot;);
//创建随机内容
var content = '';
for(i = 0; i &amp;lt; 30; i++) {
	if(!(Math.random()*3 &amp;gt;&amp;gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox bigBox&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&amp;quot; class=&amp;quot;innerBox&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}else{
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}
};
myWidget.innerHTML = content;
window.onload = function(){
	box.setIfr(myWidget);
	box.init(myWidget);
};
window.onresize = function(){
	box.init(myWidget);
};
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_HQmfys');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;现在这种布局已经不能叫瀑布流了，我们称之为格子块，格子块通过算法智能堆砌。&lt;/p&gt;
&lt;p&gt;到最后，说点下睛也好，说添下足也好，我们再加一个拖动交换格子的效果。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_TrZ1qw&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;宽高尺寸不同的格子堆砌(可拖动换位)&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{background:#F6F7F8;}
.myWidget{position:relative;overflow:hidden;zoom:1;margin:0 auto;}
.MBox{float:left;}
.widgetBox{position:relative;overflow:hidden;zoom:1;width:186px;height:166px;margin:6px;border:1px solid #E1E1E3;cursor:move;
	border-radius:10px;
	-moz-border-radius:10px;
	-webkit-border-radius:10px;
	box-shadow:2px 3px 5px #d3d3d3;
	-moz-box-shadow:2px 3px 5px #d3d3d3;
	-webkit-box-shadow:2px 3px 5px #d3d3d3;
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#fefefe, endColorstr=#e0e0e2);
	background: linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -moz-linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -webkit-gradient(linear, 0 0, 0 100% , from(#fefefe),to(#e0e0e2));
	background: -webkit-linear-gradient(0 0, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
}
&amp;lt;/style&amp;gt;
&amp;lt;script&amp;gt;
var $id = function(o){ return document.getElementById(o) || o ;};
var getElementsByClassName = function(className,parent,tag) {
	parent = parent || document;
    if(parent.getElementsByClassName){
        return  parent.getElementsByClassName(className)
    }else{
        tag = tag || '*';
        var returnElements = []
        var els =  parent.getElementsByTagName(tag);
        className = className.replace(/\-/g, &amp;quot;\\-&amp;quot;);
        var pattern = new RegExp(&amp;quot;(^|\\s)&amp;quot;+className+&amp;quot;(\\s|$)&amp;quot;);
		var i = 0;
        while(i &amp;lt; els.length){
            if (pattern.test(els[i].className) ) {
                returnElements.push(els[i]);
            }
			i++;
        }
        return returnElements;
    }
};
var Util = new Object();
Util.getOffset = function (el, isLeft) {
    var retValue = 0;
   // while (el != null) {
        retValue += el[&amp;quot;offset&amp;quot; + (isLeft ? &amp;quot;Left&amp;quot; : &amp;quot;Top&amp;quot;)];
     //   el = el.offsetParent;
    //}
    return retValue;
};
Util.bindFunction = function (el, fucName) {
    return function () {
        return el[fucName].apply(el, arguments);
    };
};
Util.re_calcOff = function (el) {
    for (var i = 0; i &amp;lt; Util.dragArray.length; i++) {
        var ele = Util.dragArray[i];
        ele.elm.pagePosLeft = Util.getOffset(ele.elm, true);
        ele.elm.pagePosTop = Util.getOffset(ele.elm, false);
    }
    var nextSib = el.elm.nextSibling;
    while (nextSib) {
        nextSib.pagePosTop -= el.elm.offsetHeight;
        nextSib = nextSib.nextSibling;
    }
};
Util.hide = function () {
    Util.rootElement.style.display = &amp;quot;none&amp;quot;;
};
Util.show = function () {
    Util.rootElement.style.display = &amp;quot;&amp;quot;;
};
ghostElement = null;
found = null;
getGhostElement = function () {
    if (!ghostElement) {
        ghostElement = document.createElement(&amp;quot;DIV&amp;quot;);
        ghostElement.className = &amp;quot;MBox ghostBox&amp;quot;;
    }
    return ghostElement;
};
function draggable(el) {
    this._dragStart = start_Drag;
    this._drag = when_Drag;
    this._dragEnd = end_Drag;
    this._afterDrag = after_Drag;
    this.isDragging = false;
    this.elm = el;
	this.hasIFrame = this.elm.getElementsByTagName(&amp;quot;IFRAME&amp;quot;).length &amp;gt; 0;
        Drag.init(el, this.elm);
        this.elm.onDragStart = Util.bindFunction(this, &amp;quot;_dragStart&amp;quot;);
        this.elm.onDrag = Util.bindFunction(this, &amp;quot;_drag&amp;quot;);
        this.elm.onDragEnd = Util.bindFunction(this, &amp;quot;_dragEnd&amp;quot;);
};
function start_Drag() {
	Util.re_calcOff(this);
    this.origNextSibling = this.elm.nextSibling;
    var _ghostElement = getGhostElement();
    var offH = this.elm.offsetHeight;
    var offW = this.elm.offsetWidth;
    var offLeft = Util.getOffset(this.elm, true);
    var offTop = Util.getOffset(this.elm, false);
   // Util.hide();
   //this.elm.parentNode.getElementsByTagName('iframe')[0].style.visibility = 'hidden';
    this.elm.style.width = offW + &amp;quot;px&amp;quot;;
    _ghostElement.style.height = offH + &amp;quot;px&amp;quot;;
    _ghostElement.style.width = offW + &amp;quot;px&amp;quot;;
    this.elm.parentNode.insertBefore(_ghostElement, this.elm.nextSibling);
    this.elm.style.position = &amp;quot;absolute&amp;quot;;
    this.elm.style.zIndex = 100;
    this.elm.style.left = offLeft + &amp;quot;px&amp;quot;;
    this.elm.style.top = offTop + &amp;quot;px&amp;quot;;
    //Util.show();
    this.isDragging = false;
    return false;
};
function when_Drag(clientX, clientY) {
	    if (!this.isDragging) {
        this.elm.style.filter = &amp;quot;alpha(opacity=70)&amp;quot;;
        this.elm.style.opacity = 0.7;
        this.isDragging = true;
    }
    found = null;
    var max_distance = 100000000;
    for (var i = 0; i &amp;lt; Util.dragArray.length; i++) {
        var ele = Util.dragArray[i];
        var distance = Math.sqrt(Math.pow(clientX - ele.elm.pagePosLeft, 2) + Math.pow(clientY -  ele.elm.offsetTop, 2));
        if (ele == this) {
            continue;
        }
        if (isNaN(distance)) {
            continue;
        }
        if (distance &amp;lt; max_distance) {
            max_distance = distance;
           	 found = ele;
        }
    };
    var _ghostElement = getGhostElement();
    if (found != null) {
    	if(this.elm.pagePosLeft &amp;lt; clientX){
    		found.elm.parentNode.insertBefore(_ghostElement, found.elm.nextSibling);
    	}else{
    		found.elm.parentNode.insertBefore(_ghostElement, found.elm);
    	}
    };
};
function end_Drag() {
	//this.elm.parentNode.getElementsByTagName('iframe')[0].style.visibility = 'visible';
	if (this._afterDrag()) {
	}
	return true;
};
function after_Drag() {
    var returnValue = false;
   // Util.hide();
    this.elm.style.position = &amp;quot;&amp;quot;;
    this.elm.style.width = &amp;quot;&amp;quot;;
    this.elm.style.zIndex = &amp;quot;&amp;quot;;
    this.elm.style.filter = &amp;quot;&amp;quot;;
    this.elm.style.opacity = &amp;quot;&amp;quot;;
    var ele = getGhostElement();
    if (ele.nextSibling != this.origNextSibling) {
    	ele.parentNode.insertBefore(found.elm, this.elm);
    	ele.parentNode.insertBefore(this.elm, ele.nextSibling);
        returnValue = true;
    }
    ele.parentNode.removeChild(ele);
    //Util.show();
   box.init(Util.rootElement);
   return returnValue;
};
var Drag = {
		obj:null,
		init:function (elementHeader, element) {
		    	elementHeader.onmousedown = Drag.start;
    		    elementHeader.obj = element;
		    if (isNaN(parseInt(element.style.left))) {
				element.style.left = &amp;quot;0px&amp;quot;;
			}
			if (isNaN(parseInt(element.style.top))) {
				element.style.top = &amp;quot;0px&amp;quot;;
			}
			element.onDragStart = new Function();
			element.onDragEnd = new Function();
			element.onDrag = new Function();
		},
		start:function (event) {
	    var element = Drag.obj = this.obj;
		    event = Drag.fixE(event);
		    if (event.which != 1) {
	    		return true;
    		}
    		element.onDragStart();
		    element.lastMouseX = event.clientX;
			element.lastMouseY = event.clientY;
		    document.onmouseup = Drag.end;
			document.onmousemove = Drag.drag;
			return false;
		},
		drag:function (event) {
			event = Drag.fixE(event);
		    if (event.which == 0) {
	    		return Drag.end();
    		}
    		var element = Drag.obj;
		    var _clientX = event.clientY;
			var _clientY = event.clientX;
		    if (element.lastMouseX == _clientY &amp;amp;&amp;amp; element.lastMouseY == _clientX) {
				return false;
			};
			if(_clientX + document.documentElement.scrollTop + document.body.scrollTop &amp;lt; 0 ||  _clientX &amp;gt; document.documentElement.offsetHeight){
				return false;
			};
			var sTo=0;
			if( _clientX &amp;lt; 0 ){
				sTo=_clientX;
			};
			if((_clientX - document.documentElement.clientHeight) &amp;gt; 0){
		    	sTo=_clientX - document.documentElement.clientHeight;
			};
			window.scrollBy(0,sTo);
		    var _lastX = parseInt(element.style.top);
			var _lastY = parseInt(element.style.left);
		    var newX, newY;
		    newX = _lastY + _clientY - element.lastMouseX;
			newY = _lastX + _clientX - element.lastMouseY;
		    element.style.left = newX  + &amp;quot;px&amp;quot;;
			element.style.top = newY + sTo + &amp;quot;px&amp;quot;;
		    element.lastMouseX = _clientY;
			element.lastMouseY = _clientX;
		    element.onDrag(newX, newY);
			return false;
		},
		end:function (event) {
			event = Drag.fixE(event);
		    document.onmousemove = null;
			document.onmouseup = null;
		    var _onDragEndFuc = Drag.obj.onDragEnd();
		    Drag.obj = null;
	    return _onDragEndFuc;
		},
		fixE:function (ig_) {
	    if (typeof ig_ == &amp;quot;undefined&amp;quot;) {
	        ig_ = window.event;
	    }
	    if (typeof ig_.layerX == &amp;quot;undefined&amp;quot;) {
	        ig_.layerX = ig_.offsetX;
	    }
	    if (typeof ig_.layerY == &amp;quot;undefined&amp;quot;) {
	        ig_.layerY = ig_.offsetY;
	    }
	    if (typeof ig_.which == &amp;quot;undefined&amp;quot;) {
	        ig_.which = ig_.button;
	    }
    	return ig_;
	}
};
var initDrag = function (el) {
	Util.rootElement = el;
    Util.elem = Util.rootElement.children;
    Util.dragArray = new Array();
    var counter = 0;
    for (var i = 0; i &amp;lt; Util.elem.length; i++) {
    	var elem = Util.elem[i];
		Util.dragArray[counter] = new draggable(elem);
		counter++;
    };
	box.setIfr(Util.rootElement);
	box.init(Util.rootElement);
};
/* 格子排序 */
var box={};
box.gen={w:200,h:180};
box.init=function(el){
	box.size=[]; //格子,[1,2]表示1X2的大格子
	box.obj={};
	box.oArray=[];
	box.maxY=-1;
	box.mbox = getElementsByClassName(&amp;quot;MBox&amp;quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &amp;gt;&amp;gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &amp;quot;px&amp;quot;;
	var i = 0 , nx, ny;
	while( i &amp;lt; this.mbox.length){
		if( getElementsByClassName(&amp;quot;bigBox&amp;quot;,this.mbox[i],'div').length &amp;gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &amp;gt; this.row) ? this.row : nx; //大小超出限制
			ny=Math.ceil(this.mbox[i].offsetHeight / this.gen.h);
			this.size.push([nx,ny]);
		}else{
			this.size.push(1);
		}
		i++;
	}
	box.sort(el);
};
box.setIfr=function(el){  //大格子初始化
 	var ifr = getElementsByClassName(&amp;quot;bigBox&amp;quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &amp;lt; ifr.length){
		theifr =  getElementsByClassName(&amp;quot;innerBox&amp;quot;,ifr[i],'div');
		nx=Math.ceil(theifr[0].offsetWidth / this.gen.w); //bigBox横向占的块数
		ny=Math.ceil(theifr[0].offsetHeight / this.gen.h);
		ifr[i].style.width = nx*this.gen.w-14 + 'px' ;
		ifr[i].style.height = ny*this.gen.h-14 + 'px' ;
		i++;
	}
};
box.sort=function(el){
	var y=0, x=0, temp={x:Infinity, y:Infinity}, flag=Infinity, name;
	for(var n=0; n &amp;lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x &amp;gt; box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&amp;lt;Infinity) flag=flag+1;
			continue;
		}
		if(!this.size[n].length){  //普通格子
			this.obj[name]=[x,y];  //（反映坐标值）
			x++;
		}
		else{  //大格子
			if(this.over(x,y,n)) {
				if(temp.y &amp;gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &amp;lt; Infinity){
					flag=1;
				}
				n--;
				x++;
				continue;
			}
			this.obj[name]=[x,y];
			this.apply(x,y,n);
			x+=this.size[n][0];
		}
		if(flag==-1) {
			flag = 	Infinity;
			temp.y = Infinity;
			temp.x = Infinity;
		}
		var h=this.size[n][1]-1 || 0;
		box.maxY=(box.maxY &amp;gt; y+h)? box.maxY : y+h;
	}
	for(var i in this.obj){
		if(this.obj[i]===0 || !this.obj.hasOwnProperty(i)) continue;
		this.oArray.push(this.obj[i]);
	}
	box.put(el);
};
box.hasN=function(n){
	return n in this.obj;
};
box.over=function(x,y,n){  //判断是否会重叠
	var name;
	if(x+this.size[n][0] &amp;gt; this.row) return true; //超出显示范围
	for(var k=1; k&amp;lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&amp;lt;this.size[n][0];k++){
		name=(x-0+k)+'_'+y;
		if(this.hasN(name)) {return true;}  //上侧一行有无重叠
	}
	return false;
};
box.apply=function(x,y,n){  //大格子中多占的位置
	var posX=x, //大格子左上角位置
		posY=y;
	for(var t=0; t&amp;lt;this.size[n][0]; t++) {
		for(var k=0; k&amp;lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;amp;&amp;amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&amp;lt; this.oArray.length; i++){
		x=box.gen.w*this.oArray[i][0];
		y=box.gen.h*this.oArray[i][1];
		box.mbox[i].style.cssText = &amp;quot;position:absolute;left:&amp;quot;+ x +&amp;quot;px;top:&amp;quot; + y + &amp;quot;px;&amp;quot;;
	};
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;myWidget&amp;quot; class=&amp;quot;myWidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
var myWidget = $id(&amp;quot;myWidget&amp;quot;);
//创建随机内容
var content = '';
for(i = 0; i &amp;lt; 20; i++) {
	if(!(Math.random()*5 &amp;gt;&amp;gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox bigBox&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&amp;quot; class=&amp;quot;innerBox&amp;quot;&amp;gt;'+ i +'&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}else{
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox&amp;quot;&amp;gt;'+ i +'&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}
};
myWidget.innerHTML = content;
//绑定拖动元素
initDrag(myWidget);
window.onresize = function(){box.init(myWidget)};
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_TrZ1qw');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2008/31.html' rel='bookmark' title='Permanent Link: 二列左列宽度固定，右列宽度自适应布局的四种方法'&gt;二列左列宽度固定，右列宽度自适应布局的四种方法&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;</content><thr:total>6</thr:total><description>图片分享网站Pinterest（beta），在不久前获得了2700$的投资，估值已超2亿元（据说现该公司团队有8人）。该网站的一大特色就是每一张分享的图片被拟作“Pin”被钉在页面上面，每一Pin依尺寸智能排列，同时滚动页面时异步加载新Pin，极具效果。这种创新模式被在国内也被广泛copy，其中最有前途的当属Mark之，以&amp;#8221;Mark&amp;#8221;代&amp;#8221;Pin&amp;#8221;,也算有些想法。
以下是利用豆瓣API数据做的效果：完整效果
部分代码：


&amp;#60;!doctype html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
&amp;#60;meta charset=&amp;#34;UTF-8&amp;#34; /&amp;#62;
&amp;#60;title&amp;#62;等宽格子堆砌&amp;#60;/title&amp;#62;
&amp;#60;style&amp;#62;
*{padding:0;margin:0;}
#wrap{position:relative;zoom:1;margin:0px auto;}
#wrap li{width:250px;float:left;list-style:none;}
.boxCont{position:relative;margin:15px;border:1px solid #ccc;background:#eee;
	background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
	background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	-webkit-border-radius: 60px / 5px;
	-moz-border-radius: 60px / 5px;
	border-radius:60px / 5px;
	-webkit-box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
	-moz-box-shadow: 0px 0px [...]


Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2008/31.html' rel='bookmark' title='Permanent Link: 二列左列宽度固定，右列宽度自适应布局的四种方法'&gt;二列左列宽度固定，右列宽度自适应布局的四种方法&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897181/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897181/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;图片分享网站&lt;a href=&quot;http://pinterest.com/&quot;&gt;Pinterest&lt;/a&gt;（beta），在不久前获得了2700$的投资，估值已超2亿元（据说现该公司团队有8人）。该网站的一大特色就是每一张分享的图片被拟作“Pin”被钉在页面上面，每一Pin依尺寸智能排列，同时滚动页面时异步加载新Pin，极具效果。这种创新模式被在国内也被广泛copy，其中最有前途的当属&lt;a href=&quot;http://www.markzhi.com&quot; target=&quot;_blank&quot;&gt;Mark之&lt;/a&gt;，以&amp;#8221;Mark&amp;#8221;代&amp;#8221;Pin&amp;#8221;,也算有些想法。&lt;/p&gt;
&lt;p&gt;以下是利用豆瓣API数据做的效果：&lt;a href=&quot;http://www.cssass.com/blog/index.php/douban&quot; target=&quot;_blank&quot;&gt;完整效果&lt;/a&gt;&lt;br /&gt;
部分代码：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_PyZEk6&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;等宽格子堆砌&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
*{padding:0;margin:0;}
#wrap{position:relative;zoom:1;margin:0px auto;}
#wrap li{width:250px;float:left;list-style:none;}
.boxCont{position:relative;margin:15px;border:1px solid #ccc;background:#eee;
	background: -webkit-gradient(linear, 0% 20%, 0% 92%, from(#fff), to(#f3f3f3), color-stop(.1,#fff));
	background: -webkit-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -moz-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	background: -o-linear-gradient(0 0 270deg, #f3f3f3, #f3f3f3 10%, #fff);
	-webkit-border-radius: 60px / 5px;
	-moz-border-radius: 60px / 5px;
	border-radius:60px / 5px;
	-webkit-box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
	-moz-box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
	box-shadow: 0px 0px 35px rgba(0, 0, 0, 0.1) inset;
}
.boxCont:before{
	content: '';
	width: 50px;
	height: 50px;
	top:0; right:0;
	position:absolute;
	display: inline-block;
	z-index:-1;
	-webkit-box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	box-shadow: 10px -10px 8px rgba(0, 0, 0, 0.2);
	-webkit-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	-moz-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	-o-transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
	transform: rotate(2deg) translate(-14px,20px) skew(-20deg);
}
.boxCont:after{
	content: '';
	width: 100px;
	height: 100px;
	top:0; left:0;
	position:absolute;
	z-index:-1;
	display: inline-block;
	-webkit-box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	-moz-box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	box-shadow: -10px -10px 10px rgba(0, 0, 0, 0.2);
	-webkit-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	-moz-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	-o-transform: rotate(2deg) translate(20px,25px) skew(20deg);
	transform: rotate(2deg) translate(20px,25px) skew(20deg);
}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;ul id=&amp;quot;wrap&amp;quot;&amp;gt;&amp;lt;/ul&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
var $id = function(o){ return document.getElementById(o) || o};
function sort(el){
	var h = [];
	var box = el.getElementsByTagName(&amp;quot;li&amp;quot;);
	var minH = box[0].offsetHeight,
		boxW = box[0].offsetWidth,
		boxH,
		n = document.documentElement.offsetWidth / boxW | 0;  //计算页面能排下多少Pin
	el.style.width = n * boxW + &amp;quot;px&amp;quot;;
	for(var i = 0; i &amp;lt; box.length; i++) {
		boxh = box[i].offsetHeight; //获取每个Pin的高度
		if(i &amp;lt; n) { //第一行Pin以浮动排列，不需绝对定位
			h[i] = boxh;
			box[i].style.position = '';
		} else {
			minH =  Math.min.apply({},h); //取得各列累计高度最低的一列
			minKey = getarraykey(h, minH);
			h[minKey] += boxh ; //加上新高度后更新高度值
			box[i].style.position = 'absolute';
			box[i].style.top = minH + 'px';
			box[i].style.left = (minKey * boxW) + 'px';
		}
	}
};
/* 返回数组中某一值的对应项数 */
function getarraykey(s, v) {
	for(k in s) {
		if(s[k] == v) {
			return k;
		}
	}
};
/* 随机创建Pin */
var pin = '';
for(i = 0; i &amp;lt; 30; i++) {
	height = Math.floor(Math.random()*200 + 200);
	pin += '&amp;lt;li&amp;gt;&amp;lt;div class=&amp;quot;boxCont&amp;quot; style=&amp;quot;height:' + height + 'px;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/li&amp;gt;';
};
$id(&amp;quot;wrap&amp;quot;).innerHTML = pin;
window.onload = window.onresize = function() {
	sort($id(&amp;quot;wrap&amp;quot;));
};
&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_PyZEk6');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;这种布局中虽然每个Pin的高度不尽相同，但是他们的宽度都是一样的。&lt;br /&gt;
那么假如，很邪恶的提出一个要求，宽度也不尽相同，只是说宽高都按比例成倍增加，那还怎么排列呢？&lt;br /&gt;
呵呵，如下：&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_HQmfys&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;宽高尺寸不同的格子堆砌&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{background:#F6F7F8;}
.myWidget{position:relative;overflow:hidden;zoom:1;margin:0 auto;}
.MBox{float:left;}
.widgetBox{position:relative;overflow:hidden;zoom:1;width:186px;height:166px;margin:6px;border:1px solid #E1E1E3;
	border-radius:10px;
	-moz-border-radius:10px;
	-webkit-border-radius:10px;
	box-shadow:2px 3px 5px #d3d3d3;
	-moz-box-shadow:2px 3px 5px #d3d3d3;
	-webkit-box-shadow:2px 3px 5px #d3d3d3;
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#fefefe, endColorstr=#e0e0e2);
	background: linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -moz-linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -webkit-gradient(linear, 0 0, 0 100% , from(#fefefe),to(#e0e0e2));
	background: -webkit-linear-gradient(0 0, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
}
&amp;lt;/style&amp;gt;
&amp;lt;script&amp;gt;
var $id = function(o){ return document.getElementById(o) || o ;};
var getElementsByClassName = function(className,parent,tag) {
	parent = parent || document;
    if(parent.getElementsByClassName){
        return  parent.getElementsByClassName(className)
    }else{
        tag = tag || '*';
        var returnElements = []
        var els =  parent.getElementsByTagName(tag);
        className = className.replace(/\-/g, &amp;quot;\\-&amp;quot;);
        var pattern = new RegExp(&amp;quot;(^|\\s)&amp;quot;+className+&amp;quot;(\\s|$)&amp;quot;);
		var i = 0;
        while(i &amp;lt; els.length){
            if (pattern.test(els[i].className) ) {
                returnElements.push(els[i]);
            }
			i++;
        }
        return returnElements;
    }
};
/* 格子排序 */
var box={};
box.gen={w:200,h:180};
box.init=function(el){
	box.size=[]; //格子,[1,2]表示1X2的大格子
	box.obj={};
	box.oArray=[];
	box.maxY=-1;
	box.mbox = getElementsByClassName(&amp;quot;MBox&amp;quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &amp;gt;&amp;gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &amp;quot;px&amp;quot;;
	var i = 0 , nx, ny;
	while( i &amp;lt; this.mbox.length){
		if( getElementsByClassName(&amp;quot;bigBox&amp;quot;,this.mbox[i],'div').length &amp;gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &amp;gt; this.row) ? this.row : nx; //大小超出限制
			ny=Math.ceil(this.mbox[i].offsetHeight / this.gen.h);
			this.size.push([nx,ny]);
		}else{
			this.size.push(1);
		}
		i++;
	}
	box.sort(el);
};
box.setIfr=function(el){  //大格子初始化
 	var ifr = getElementsByClassName(&amp;quot;bigBox&amp;quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &amp;lt; ifr.length){
		theifr =  getElementsByClassName(&amp;quot;innerBox&amp;quot;,ifr[i],'div');
		nx=Math.ceil(theifr[0].offsetWidth / this.gen.w); //bigBox横向占的块数
		ny=Math.ceil(theifr[0].offsetHeight / this.gen.h);
		ifr[i].style.width = nx*this.gen.w-14 + 'px' ;
		ifr[i].style.height = ny*this.gen.h-14 + 'px' ;
		i++;
	}
};
box.sort=function(el){
	var y=0, x=0, temp={x:Infinity, y:Infinity}, flag=Infinity, name;
	for(var n=0; n &amp;lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x&amp;gt;box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&amp;lt;Infinity) flag=flag+1;
			continue;
		}
		if(!this.size[n].length){  //普通格子
			this.obj[name]=[x,y];  //项值（反映坐标值）
			x++;
		}
		else{  //大格子
			if(this.over(x,y,n)) {
				if(temp.y &amp;gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &amp;lt; Infinity){
					flag=1;
				}
				n--;
				x++;
				continue;
			}
			this.obj[name]=[x,y];
			this.apply(x,y,n);
			x+=this.size[n][0];
		}
		if(flag==-1) {
			flag = 	Infinity;
			temp.y = Infinity;
			temp.x = Infinity;
		}
		var h=this.size[n][1]-1 || 0;
		box.maxY=(box.maxY &amp;gt; y+h)? box.maxY : y+h;
	}
	for(var i in this.obj){
		if(this.obj[i]===0 || !this.obj.hasOwnProperty(i)) continue;
		this.oArray.push(this.obj[i]);
	}
	box.put(el);
};
box.hasN=function(n){
	return n in this.obj;
};
box.over=function(x,y,n){  //判断是否会重叠
	var name;
	if(x+this.size[n][0] &amp;gt; this.row) return true; //超出显示范围
	for(var k=1; k&amp;lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&amp;lt;this.size[n][0];k++){
		name=(x-0+k)+'_'+y;
		if(this.hasN(name)) {return true;}  //上侧一行有无重叠
	}
	return false;
};
box.apply=function(x,y,n){  //大格子中多占的位置
	var posX=x, //大格子左上角位置
		posY=y;
	for(var t=0; t&amp;lt;this.size[n][0]; t++) {
		for(var k=0; k&amp;lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;amp;&amp;amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&amp;lt; this.oArray.length; i++){
		x=box.gen.w*this.oArray[i][0];
		y=box.gen.h*this.oArray[i][1];
		box.mbox[i].style.cssText = &amp;quot;position:absolute;left:&amp;quot;+ x +&amp;quot;px;top:&amp;quot; + y + &amp;quot;px;&amp;quot;;
	}
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;myWidget&amp;quot; class=&amp;quot;myWidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
var myWidget = $id(&amp;quot;myWidget&amp;quot;);
//创建随机内容
var content = '';
for(i = 0; i &amp;lt; 30; i++) {
	if(!(Math.random()*3 &amp;gt;&amp;gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox bigBox&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&amp;quot; class=&amp;quot;innerBox&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}else{
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}
};
myWidget.innerHTML = content;
window.onload = function(){
	box.setIfr(myWidget);
	box.init(myWidget);
};
window.onresize = function(){
	box.init(myWidget);
};
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_HQmfys');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;现在这种布局已经不能叫瀑布流了，我们称之为格子块，格子块通过算法智能堆砌。&lt;/p&gt;
&lt;p&gt;到最后，说点下睛也好，说添下足也好，我们再加一个拖动交换格子的效果。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_TrZ1qw&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!doctype html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;宽高尺寸不同的格子堆砌(可拖动换位)&amp;lt;/title&amp;gt;
&amp;lt;style&amp;gt;
body{background:#F6F7F8;}
.myWidget{position:relative;overflow:hidden;zoom:1;margin:0 auto;}
.MBox{float:left;}
.widgetBox{position:relative;overflow:hidden;zoom:1;width:186px;height:166px;margin:6px;border:1px solid #E1E1E3;cursor:move;
	border-radius:10px;
	-moz-border-radius:10px;
	-webkit-border-radius:10px;
	box-shadow:2px 3px 5px #d3d3d3;
	-moz-box-shadow:2px 3px 5px #d3d3d3;
	-webkit-box-shadow:2px 3px 5px #d3d3d3;
	filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#fefefe, endColorstr=#e0e0e2);
	background: linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -moz-linear-gradient(top, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
	background: -webkit-gradient(linear, 0 0, 0 100% , from(#fefefe),to(#e0e0e2));
	background: -webkit-linear-gradient(0 0, #fefefe, #f6f6f6 ,#f3f3f3,#f2f2f2,#e0e0e2);
}
&amp;lt;/style&amp;gt;
&amp;lt;script&amp;gt;
var $id = function(o){ return document.getElementById(o) || o ;};
var getElementsByClassName = function(className,parent,tag) {
	parent = parent || document;
    if(parent.getElementsByClassName){
        return  parent.getElementsByClassName(className)
    }else{
        tag = tag || '*';
        var returnElements = []
        var els =  parent.getElementsByTagName(tag);
        className = className.replace(/\-/g, &amp;quot;\\-&amp;quot;);
        var pattern = new RegExp(&amp;quot;(^|\\s)&amp;quot;+className+&amp;quot;(\\s|$)&amp;quot;);
		var i = 0;
        while(i &amp;lt; els.length){
            if (pattern.test(els[i].className) ) {
                returnElements.push(els[i]);
            }
			i++;
        }
        return returnElements;
    }
};
var Util = new Object();
Util.getOffset = function (el, isLeft) {
    var retValue = 0;
   // while (el != null) {
        retValue += el[&amp;quot;offset&amp;quot; + (isLeft ? &amp;quot;Left&amp;quot; : &amp;quot;Top&amp;quot;)];
     //   el = el.offsetParent;
    //}
    return retValue;
};
Util.bindFunction = function (el, fucName) {
    return function () {
        return el[fucName].apply(el, arguments);
    };
};
Util.re_calcOff = function (el) {
    for (var i = 0; i &amp;lt; Util.dragArray.length; i++) {
        var ele = Util.dragArray[i];
        ele.elm.pagePosLeft = Util.getOffset(ele.elm, true);
        ele.elm.pagePosTop = Util.getOffset(ele.elm, false);
    }
    var nextSib = el.elm.nextSibling;
    while (nextSib) {
        nextSib.pagePosTop -= el.elm.offsetHeight;
        nextSib = nextSib.nextSibling;
    }
};
Util.hide = function () {
    Util.rootElement.style.display = &amp;quot;none&amp;quot;;
};
Util.show = function () {
    Util.rootElement.style.display = &amp;quot;&amp;quot;;
};
ghostElement = null;
found = null;
getGhostElement = function () {
    if (!ghostElement) {
        ghostElement = document.createElement(&amp;quot;DIV&amp;quot;);
        ghostElement.className = &amp;quot;MBox ghostBox&amp;quot;;
    }
    return ghostElement;
};
function draggable(el) {
    this._dragStart = start_Drag;
    this._drag = when_Drag;
    this._dragEnd = end_Drag;
    this._afterDrag = after_Drag;
    this.isDragging = false;
    this.elm = el;
	this.hasIFrame = this.elm.getElementsByTagName(&amp;quot;IFRAME&amp;quot;).length &amp;gt; 0;
        Drag.init(el, this.elm);
        this.elm.onDragStart = Util.bindFunction(this, &amp;quot;_dragStart&amp;quot;);
        this.elm.onDrag = Util.bindFunction(this, &amp;quot;_drag&amp;quot;);
        this.elm.onDragEnd = Util.bindFunction(this, &amp;quot;_dragEnd&amp;quot;);
};
function start_Drag() {
	Util.re_calcOff(this);
    this.origNextSibling = this.elm.nextSibling;
    var _ghostElement = getGhostElement();
    var offH = this.elm.offsetHeight;
    var offW = this.elm.offsetWidth;
    var offLeft = Util.getOffset(this.elm, true);
    var offTop = Util.getOffset(this.elm, false);
   // Util.hide();
   //this.elm.parentNode.getElementsByTagName('iframe')[0].style.visibility = 'hidden';
    this.elm.style.width = offW + &amp;quot;px&amp;quot;;
    _ghostElement.style.height = offH + &amp;quot;px&amp;quot;;
    _ghostElement.style.width = offW + &amp;quot;px&amp;quot;;
    this.elm.parentNode.insertBefore(_ghostElement, this.elm.nextSibling);
    this.elm.style.position = &amp;quot;absolute&amp;quot;;
    this.elm.style.zIndex = 100;
    this.elm.style.left = offLeft + &amp;quot;px&amp;quot;;
    this.elm.style.top = offTop + &amp;quot;px&amp;quot;;
    //Util.show();
    this.isDragging = false;
    return false;
};
function when_Drag(clientX, clientY) {
	    if (!this.isDragging) {
        this.elm.style.filter = &amp;quot;alpha(opacity=70)&amp;quot;;
        this.elm.style.opacity = 0.7;
        this.isDragging = true;
    }
    found = null;
    var max_distance = 100000000;
    for (var i = 0; i &amp;lt; Util.dragArray.length; i++) {
        var ele = Util.dragArray[i];
        var distance = Math.sqrt(Math.pow(clientX - ele.elm.pagePosLeft, 2) + Math.pow(clientY -  ele.elm.offsetTop, 2));
        if (ele == this) {
            continue;
        }
        if (isNaN(distance)) {
            continue;
        }
        if (distance &amp;lt; max_distance) {
            max_distance = distance;
           	 found = ele;
        }
    };
    var _ghostElement = getGhostElement();
    if (found != null) {
    	if(this.elm.pagePosLeft &amp;lt; clientX){
    		found.elm.parentNode.insertBefore(_ghostElement, found.elm.nextSibling);
    	}else{
    		found.elm.parentNode.insertBefore(_ghostElement, found.elm);
    	}
    };
};
function end_Drag() {
	//this.elm.parentNode.getElementsByTagName('iframe')[0].style.visibility = 'visible';
	if (this._afterDrag()) {
	}
	return true;
};
function after_Drag() {
    var returnValue = false;
   // Util.hide();
    this.elm.style.position = &amp;quot;&amp;quot;;
    this.elm.style.width = &amp;quot;&amp;quot;;
    this.elm.style.zIndex = &amp;quot;&amp;quot;;
    this.elm.style.filter = &amp;quot;&amp;quot;;
    this.elm.style.opacity = &amp;quot;&amp;quot;;
    var ele = getGhostElement();
    if (ele.nextSibling != this.origNextSibling) {
    	ele.parentNode.insertBefore(found.elm, this.elm);
    	ele.parentNode.insertBefore(this.elm, ele.nextSibling);
        returnValue = true;
    }
    ele.parentNode.removeChild(ele);
    //Util.show();
   box.init(Util.rootElement);
   return returnValue;
};
var Drag = {
		obj:null,
		init:function (elementHeader, element) {
		    	elementHeader.onmousedown = Drag.start;
    		    elementHeader.obj = element;
		    if (isNaN(parseInt(element.style.left))) {
				element.style.left = &amp;quot;0px&amp;quot;;
			}
			if (isNaN(parseInt(element.style.top))) {
				element.style.top = &amp;quot;0px&amp;quot;;
			}
			element.onDragStart = new Function();
			element.onDragEnd = new Function();
			element.onDrag = new Function();
		},
		start:function (event) {
	    var element = Drag.obj = this.obj;
		    event = Drag.fixE(event);
		    if (event.which != 1) {
	    		return true;
    		}
    		element.onDragStart();
		    element.lastMouseX = event.clientX;
			element.lastMouseY = event.clientY;
		    document.onmouseup = Drag.end;
			document.onmousemove = Drag.drag;
			return false;
		},
		drag:function (event) {
			event = Drag.fixE(event);
		    if (event.which == 0) {
	    		return Drag.end();
    		}
    		var element = Drag.obj;
		    var _clientX = event.clientY;
			var _clientY = event.clientX;
		    if (element.lastMouseX == _clientY &amp;amp;&amp;amp; element.lastMouseY == _clientX) {
				return false;
			};
			if(_clientX + document.documentElement.scrollTop + document.body.scrollTop &amp;lt; 0 ||  _clientX &amp;gt; document.documentElement.offsetHeight){
				return false;
			};
			var sTo=0;
			if( _clientX &amp;lt; 0 ){
				sTo=_clientX;
			};
			if((_clientX - document.documentElement.clientHeight) &amp;gt; 0){
		    	sTo=_clientX - document.documentElement.clientHeight;
			};
			window.scrollBy(0,sTo);
		    var _lastX = parseInt(element.style.top);
			var _lastY = parseInt(element.style.left);
		    var newX, newY;
		    newX = _lastY + _clientY - element.lastMouseX;
			newY = _lastX + _clientX - element.lastMouseY;
		    element.style.left = newX  + &amp;quot;px&amp;quot;;
			element.style.top = newY + sTo + &amp;quot;px&amp;quot;;
		    element.lastMouseX = _clientY;
			element.lastMouseY = _clientX;
		    element.onDrag(newX, newY);
			return false;
		},
		end:function (event) {
			event = Drag.fixE(event);
		    document.onmousemove = null;
			document.onmouseup = null;
		    var _onDragEndFuc = Drag.obj.onDragEnd();
		    Drag.obj = null;
	    return _onDragEndFuc;
		},
		fixE:function (ig_) {
	    if (typeof ig_ == &amp;quot;undefined&amp;quot;) {
	        ig_ = window.event;
	    }
	    if (typeof ig_.layerX == &amp;quot;undefined&amp;quot;) {
	        ig_.layerX = ig_.offsetX;
	    }
	    if (typeof ig_.layerY == &amp;quot;undefined&amp;quot;) {
	        ig_.layerY = ig_.offsetY;
	    }
	    if (typeof ig_.which == &amp;quot;undefined&amp;quot;) {
	        ig_.which = ig_.button;
	    }
    	return ig_;
	}
};
var initDrag = function (el) {
	Util.rootElement = el;
    Util.elem = Util.rootElement.children;
    Util.dragArray = new Array();
    var counter = 0;
    for (var i = 0; i &amp;lt; Util.elem.length; i++) {
    	var elem = Util.elem[i];
		Util.dragArray[counter] = new draggable(elem);
		counter++;
    };
	box.setIfr(Util.rootElement);
	box.init(Util.rootElement);
};
/* 格子排序 */
var box={};
box.gen={w:200,h:180};
box.init=function(el){
	box.size=[]; //格子,[1,2]表示1X2的大格子
	box.obj={};
	box.oArray=[];
	box.maxY=-1;
	box.mbox = getElementsByClassName(&amp;quot;MBox&amp;quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &amp;gt;&amp;gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &amp;quot;px&amp;quot;;
	var i = 0 , nx, ny;
	while( i &amp;lt; this.mbox.length){
		if( getElementsByClassName(&amp;quot;bigBox&amp;quot;,this.mbox[i],'div').length &amp;gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &amp;gt; this.row) ? this.row : nx; //大小超出限制
			ny=Math.ceil(this.mbox[i].offsetHeight / this.gen.h);
			this.size.push([nx,ny]);
		}else{
			this.size.push(1);
		}
		i++;
	}
	box.sort(el);
};
box.setIfr=function(el){  //大格子初始化
 	var ifr = getElementsByClassName(&amp;quot;bigBox&amp;quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &amp;lt; ifr.length){
		theifr =  getElementsByClassName(&amp;quot;innerBox&amp;quot;,ifr[i],'div');
		nx=Math.ceil(theifr[0].offsetWidth / this.gen.w); //bigBox横向占的块数
		ny=Math.ceil(theifr[0].offsetHeight / this.gen.h);
		ifr[i].style.width = nx*this.gen.w-14 + 'px' ;
		ifr[i].style.height = ny*this.gen.h-14 + 'px' ;
		i++;
	}
};
box.sort=function(el){
	var y=0, x=0, temp={x:Infinity, y:Infinity}, flag=Infinity, name;
	for(var n=0; n &amp;lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x &amp;gt; box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&amp;lt;Infinity) flag=flag+1;
			continue;
		}
		if(!this.size[n].length){  //普通格子
			this.obj[name]=[x,y];  //（反映坐标值）
			x++;
		}
		else{  //大格子
			if(this.over(x,y,n)) {
				if(temp.y &amp;gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &amp;lt; Infinity){
					flag=1;
				}
				n--;
				x++;
				continue;
			}
			this.obj[name]=[x,y];
			this.apply(x,y,n);
			x+=this.size[n][0];
		}
		if(flag==-1) {
			flag = 	Infinity;
			temp.y = Infinity;
			temp.x = Infinity;
		}
		var h=this.size[n][1]-1 || 0;
		box.maxY=(box.maxY &amp;gt; y+h)? box.maxY : y+h;
	}
	for(var i in this.obj){
		if(this.obj[i]===0 || !this.obj.hasOwnProperty(i)) continue;
		this.oArray.push(this.obj[i]);
	}
	box.put(el);
};
box.hasN=function(n){
	return n in this.obj;
};
box.over=function(x,y,n){  //判断是否会重叠
	var name;
	if(x+this.size[n][0] &amp;gt; this.row) return true; //超出显示范围
	for(var k=1; k&amp;lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&amp;lt;this.size[n][0];k++){
		name=(x-0+k)+'_'+y;
		if(this.hasN(name)) {return true;}  //上侧一行有无重叠
	}
	return false;
};
box.apply=function(x,y,n){  //大格子中多占的位置
	var posX=x, //大格子左上角位置
		posY=y;
	for(var t=0; t&amp;lt;this.size[n][0]; t++) {
		for(var k=0; k&amp;lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;amp;&amp;amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&amp;lt; this.oArray.length; i++){
		x=box.gen.w*this.oArray[i][0];
		y=box.gen.h*this.oArray[i][1];
		box.mbox[i].style.cssText = &amp;quot;position:absolute;left:&amp;quot;+ x +&amp;quot;px;top:&amp;quot; + y + &amp;quot;px;&amp;quot;;
	};
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;myWidget&amp;quot; class=&amp;quot;myWidget&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;script&amp;gt;
var myWidget = $id(&amp;quot;myWidget&amp;quot;);
//创建随机内容
var content = '';
for(i = 0; i &amp;lt; 20; i++) {
	if(!(Math.random()*5 &amp;gt;&amp;gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox bigBox&amp;quot;&amp;gt;&amp;lt;div style=&amp;quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&amp;quot; class=&amp;quot;innerBox&amp;quot;&amp;gt;'+ i +'&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}else{
		content += '&amp;lt;div class=&amp;quot;MBox&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;widgetBox&amp;quot;&amp;gt;'+ i +'&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;';
	}
};
myWidget.innerHTML = content;
//绑定拖动元素
initDrag(myWidget);
window.onresize = function(){box.init(myWidget)};
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_TrZ1qw');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Related posts:&lt;ol&gt;&lt;li&gt;&lt;a href='http://www.cssass.com/blog/index.php/2008/31.html' rel='bookmark' title='Permanent Link: 二列左列宽度固定，右列宽度自适应布局的四种方法'&gt;二列左列宽度固定，右列宽度自适应布局的四种方法&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/608897181/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897181/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">Javascript</category><category domain="http://www.cssass.com/blog">交换</category><category domain="http://www.cssass.com/blog">布局</category><category domain="http://www.cssass.com/blog">拖动</category><category domain="http://www.cssass.com/blog">瀑布流</category><pubDate>Sun, 18 Dec 2011 20:49:18 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1095</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2011/1095.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897181/5460608</fs:itemid></item><item><title>烟花易冷，青春难留</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897183/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1074</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2011/1074.html">&lt;blockquote&gt;&lt;p&gt;繁华声，遁入空门，折煞了世人&lt;br /&gt;
梦偏冷，辗转一生，情债又几本&lt;br /&gt;
如你默认，生死枯等&lt;br /&gt;
枯等一圈，又一圈的年轮&lt;br /&gt;
浮屠塔，断了几层，断了谁的魂&lt;br /&gt;
痛直奔，一盏残灯，倾塌的山门&lt;br /&gt;
容我再等，历史转身&lt;br /&gt;
等酒香醇，等你弹一曲古筝&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用周杰伦的一首《烟花易冷》，纪念我即刻逝去的青春。&lt;br /&gt;
&lt;embed src=&quot;http://js.tudouui.com/bin/player2/opn_7.swf?iid=88838450&amp;#038;autostart=true&amp;#038;snap_pic=http%3A%2F%2Fi1.tdimg.com%2F088%2F838%2F450%2Fw.jpg&amp;#038;autoPlay=false&amp;#038;rurl=&amp;#038;code=9Ky_R-d1Bpk&amp;#038;nHeight=-1&amp;#038;hdType=0&amp;#038;title=%E7%83%9F%E8%8A%B1%E6%98%93%E5%86%B7&amp;#038;isOriginal=0&amp;#038;nWidth=-1&amp;#038;nBps=-1&amp;#038;channelId=99&amp;#038;tag=%E7%83%9F%E8%8A%B1%E6%98%93%E5%86%B7&amp;#038;hasPassword=&amp;#038;mediaType=vi&amp;#038;totalTime=263330&amp;#038;rpid=22636797&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;opaque&quot; width=&quot;460&quot; height=&quot;520&quot;&gt;&lt;/embed&gt;&lt;/p&gt;


&lt;p&gt;No related posts. From:&lt;a href=\</content><thr:total>3</thr:total><description>繁华声，遁入空门，折煞了世人
梦偏冷，辗转一生，情债又几本
如你默认，生死枯等
枯等一圈，又一圈的年轮
浮屠塔，断了几层，断了谁的魂
痛直奔，一盏残灯，倾塌的山门
容我再等，历史转身
等酒香醇，等你弹一曲古筝
用周杰伦的一首《烟花易冷》，纪念我即刻逝去的青春。



No related posts. From:


No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897183/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897183/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;blockquote&gt;&lt;p&gt;繁华声，遁入空门，折煞了世人&lt;br /&gt;
梦偏冷，辗转一生，情债又几本&lt;br /&gt;
如你默认，生死枯等&lt;br /&gt;
枯等一圈，又一圈的年轮&lt;br /&gt;
浮屠塔，断了几层，断了谁的魂&lt;br /&gt;
痛直奔，一盏残灯，倾塌的山门&lt;br /&gt;
容我再等，历史转身&lt;br /&gt;
等酒香醇，等你弹一曲古筝&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;用周杰伦的一首《烟花易冷》，纪念我即刻逝去的青春。&lt;br /&gt;
&lt;embed src=&quot;http://js.tudouui.com/bin/player2/opn_7.swf?iid=88838450&amp;#038;autostart=true&amp;#038;snap_pic=http%3A%2F%2Fi1.tdimg.com%2F088%2F838%2F450%2Fw.jpg&amp;#038;autoPlay=false&amp;#038;rurl=&amp;#038;code=9Ky_R-d1Bpk&amp;#038;nHeight=-1&amp;#038;hdType=0&amp;#038;title=%E7%83%9F%E8%8A%B1%E6%98%93%E5%86%B7&amp;#038;isOriginal=0&amp;#038;nWidth=-1&amp;#038;nBps=-1&amp;#038;channelId=99&amp;#038;tag=%E7%83%9F%E8%8A%B1%E6%98%93%E5%86%B7&amp;#038;hasPassword=&amp;#038;mediaType=vi&amp;#038;totalTime=263330&amp;#038;rpid=22636797&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;opaque&quot; width=&quot;460&quot; height=&quot;520&quot;&gt;&lt;/embed&gt;&lt;/p&gt;


&lt;p&gt;No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897183/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897183/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><category domain="http://www.cssass.com/blog">My life</category><category domain="http://www.cssass.com/blog">Avatar</category><category domain="http://www.cssass.com/blog">烟花易冷</category><pubDate>Tue, 30 Aug 2011 10:19:16 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1074</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2011/1074.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897183/5460608</fs:itemid></item><item><title>Typing&amp;#8230;</title><link atom:type="text/html">http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897182/5460608/1/item.html</link><author xmlns="http://www.w3.org/2005/Atom"><name>ONEBOYS</name><uri>http://www.cssass.com</uri></author><id xmlns="http://www.w3.org/2005/Atom">http://www.cssass.com/blog/?p=1086</id><content xmlns="http://www.w3.org/2005/Atom" type="html" xml:base="http://www.cssass.com/blog/index.php/2011/1086.html">&lt;p&gt;最近一个多月都比较忙，没什么时间精力更新blog，现在终于闲下来了。&lt;br /&gt;
之前有个朋友发给我一个打字机的效果，蛮有感觉的，不过那是用VBscript写的&amp;#8230;&lt;br /&gt;
而下面的这个demo里除了打字的效果，还结合了以前这个：&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/903.html&quot;&gt;我是谁&lt;/a&gt;里的效果。&lt;br /&gt;
至于里面的心形图案，是我一个一个取出坐标得到的，如果你对心形图案还有兴趣，还可以看看这篇文章&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/808.html&quot;&gt;笛卡尔情书的秘密&lt;/a&gt;。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_JIuC76&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;Typing...&amp;lt;/title&amp;gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
*{padding:0;margin:0;}
body
{font-family:'MS Gothic';line-height: 1.8;font-size: 15px;color: #444;padding:10px;}
#avatar{position:relative;width:800px;word-wrap:break-word;margin:0 auto;}
b{font-weight:normal;display:none;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;avatar&amp;quot;&amp;gt;
&amp;lt;p&amp;gt;我们都一样&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;推开窗看见星星,依然守在夜空中。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;心中不免多了些,暖暖的感动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;一闪一闪的光,努力把黑夜点亮，气氛如此安详。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你在我的生命中,是那最闪亮的星。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;一直在无声夜空,守护着我们的梦。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;这世界那么大,我的爱只想要你懂。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;陪伴我孤寂旅程。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我的梦,你知道我的痛。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我们感受都相同。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;就算有再大的风,也挡不住勇敢的冲动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;努力的往前飞,再累也无所谓。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;黑夜过后的光芒有多美。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;分享你我的力量,就能把对方的路照亮。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;我想我们都一样,渴望梦想的光芒。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;这一路喜悦彷徨,不要轻易说失望。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;回到最初时光,当时的你多么坚强。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;那鼓励让我难忘。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我的梦,你知道我的痛。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我们感受都相同。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;就算有再大的风,也挡不住勇敢的冲动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;努力的往前飞,再累也无所谓。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;黑夜过后的光芒有多美。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;分享你我的力量,就能把对方的路照亮。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;span id=&amp;quot;cursor&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;
&amp;lt;embed name=&amp;quot;我们都一样&amp;quot; pluginspage=&amp;quot;http://www.microsoft.com/Windows/MediaPlayer&amp;quot; src=&amp;quot;http://www.cssass.com/blog/resource/bgsound/bgsound.mp3&amp;quot;
width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; type=&amp;quot;application/x-mplayer2&amp;quot; autostart=&amp;quot;1&amp;quot;  loop=&amp;quot;1&amp;quot; volume=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o};
var g=$id('avatar');
var cursor=$id(&amp;quot;cursor&amp;quot;);
var init=function ()
{
	var n=0, l=g.innerHTML, s='';
	while (n&amp;lt;l.length)
	{
		var r=l.charAt(n);
		if (r==' ') { s+=r; n++}
		if (r=='&amp;lt;') while (l.charAt(n-1)!='&amp;gt;') s+=l.charAt(n++);
		s+='&amp;lt;b&amp;gt;'+l.charAt(n++)+'&amp;lt;/b&amp;gt;';
	}
	g.innerHTML=s;
};
var Wt={};
Wt.n = 0,
Wt.i = 0;
Wt.p = g.getElementsByTagName(&amp;quot;p&amp;quot;);
Wt.loop=function(){
	if( Wt.n &amp;gt;= Wt.p.length ) {
		window.scrollTo(0,0);
		pos();
		anim();
		cursor.innerHTML='';
		g.onclick=anim;
		return false;
	};
	Wt.p[Wt.n].appendChild(cursor);
	var _loop=function(){
		var m = Wt.p[Wt.n].getElementsByTagName(&amp;quot;b&amp;quot;);
		if(Wt.i &amp;lt; m.length ){
			setTimeout(function(){
				m[Wt.i].style.display='inline';
				Wt.i++;
				_loop();
			},300);
		}
		else{
			setTimeout(function(){
				Wt.i=0;
				Wt.n++;
				Wt.loop();
			},300);
		}
	};
	_loop();
};
var glint=setInterval(function(){
	cursor.style.display = (cursor.style.display==&amp;quot;none&amp;quot;) ? &amp;quot;inline&amp;quot; : &amp;quot;none&amp;quot;;
},500);
var xo=[], yo=[], xd=[], yd=[], e=[], an=-1, dir=-1 , t=0;
var d='6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF6H86248D+8-G6H/8G-7-889C8677&amp;lt;&amp;gt;8748E?8D79C1;0C86+:6&amp;amp;;/0;&amp;gt;$=)?&amp;lt;#$=*#&amp;lt;H%=*;=!(=*G:5(=++=!?=+7&amp;lt;&amp;lt;HA9;&amp;lt;HD?3*=GDAF3&amp;gt;C5A9#&amp;gt;E$A9/A03A:!B!@A:8@1?B+AA/1BE&amp;amp;B-)BO2A/OA83A/GA8BE&amp;gt;/E0DB.FF.#CE%F-3E&amp;gt;8F,OE&amp;gt;EF,CF#&amp;lt;F,7E?)F-?E?3F,+F0AHB-H*(F+GE@6J:GG.&amp;gt;J;-I65J&amp;lt;!J2#J&amp;lt;-J2%J01J2/J&amp;lt;9J=GJ=*J39J;@J2GJ;4J2;I65O.&amp;lt;K0@LCBL9$O.BL.!O/;M,/NJ7N@@O#4NA#O0+NA/P,HO&amp;amp;HO07O&amp;amp;&amp;lt;P!ANA&amp;gt;Q,$Q.=S&amp;gt;)RC=S=ES4,S&amp;gt;6RDCS&amp;gt;ARD)S?%S(HT!OT22S?1U/&amp;amp;T=1V!*X%#T@&amp;amp;X%/V!*X%;X5(X%HWCCX&amp;amp;+WC8X&amp;amp;7X(JX30WC,ZE4W8,ZE@WE$ZF$ZH%[P1[R0[P=[R&amp;lt;[]3[RJ[]@[S/]%.[S:_,8[SF_ED]@4_,OaBD_-3^27_::a6&amp;lt;`7@`9/a*?c$(`:#`6D`FFcH;`!&amp;gt;c&amp;lt;3e,Bc&amp;lt;JdH:e7@e-:fB.e!4h$$fC(h1(i/)h1%i#!h/Hh2-h/&amp;gt;h2;i:,mJ9jDCm%0kB$l@Ol39l(2n-@p*7o+Ar%#p)7r%,q3!u63s!&amp;gt;t85z6)v@*sGCr$;pO0n.Ak62h=GdGGd:Oc$4a);_.1]@)[,!Z.AW6&amp;amp;W)DT$&amp;lt;RO3P.BO&amp;gt;#MB8L8AK!HHO)H5JF;3E=:CC&amp;amp;C)D@$F?@&amp;amp;&amp;lt;GG;J)9C#9)A6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF';
function pos(){
	e=g.getElementsByTagName('b');
	for (n=0; n&amp;lt;e.length; n++)
	{
		xo[n]=e[n].offsetLeft;
		yo[n]=e[n].offsetTop;
		var p=d.charCodeAt(n*3)*1600+d.charCodeAt(n*3+1)*40+d.charCodeAt(n*3+2)-78768;
		yd[n]=p%500;
		xd[n]=(p-yd[n])/500;
	}
	for (n=0; n&amp;lt;e.length; n++)
	{
		e[n].style.position='absolute';
		e[n].style.left=xo[n]+'px';
		e[n].style.top=yo[n]+'px';
	}
};
function ani()
{	t=e.length;
	for (var n=0; n&amp;lt;t; n++)
	{
		if ((an-n&amp;lt;=30)&amp;amp;&amp;amp;(an-n&amp;gt;=0))
		{
			var b=(Math.cos((((an-n)*Math.PI)/30))+1)/2;
			var a=1-b;
			e[n].style.left=((yd[n]+111)*a+xo[n]*b)+'px';
			e[n].style.top=((xd[n]+74)*a+yo[n]*b)+'px';
		}
	}
	an+=dir;
	if ((an-t&amp;lt;=30)&amp;amp;&amp;amp;(an&amp;gt;=0))
	{
		window.setTimeout(&amp;quot;ani()&amp;quot;, 20);
	}
};
function anim()
{
	dir*=-1;
	if ((an&amp;lt;0)||(an-t&amp;gt;30)) ani();
};
init();
Wt.loop();
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_JIuC76');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;No related posts. From:&lt;a href=\</content><thr:total>5</thr:total><description>最近一个多月都比较忙，没什么时间精力更新blog，现在终于闲下来了。
之前有个朋友发给我一个打字机的效果，蛮有感觉的，不过那是用VBscript写的&amp;#8230;
而下面的这个demo里除了打字的效果，还结合了以前这个：我是谁里的效果。
至于里面的心形图案，是我一个一个取出坐标得到的，如果你对心形图案还有兴趣，还可以看看这篇文章笛卡尔情书的秘密。


&amp;#60;!DOCTYPE html&amp;#62;
&amp;#60;html&amp;#62;
&amp;#60;head&amp;#62;
&amp;#60;meta charset=&amp;#34;UTF-8&amp;#34; /&amp;#62;
&amp;#60;title&amp;#62;Typing...&amp;#60;/title&amp;#62;
&amp;#60;style type=&amp;#34;text/css&amp;#34;&amp;#62;
*{padding:0;margin:0;}
body
{font-family:'MS Gothic';line-height: 1.8;font-size: 15px;color: #444;padding:10px;}
#avatar{position:relative;width:800px;word-wrap:break-word;margin:0 auto;}
b{font-weight:normal;display:none;}
&amp;#60;/style&amp;#62;
&amp;#60;/head&amp;#62;
&amp;#60;body&amp;#62;
&amp;#60;div id=&amp;#34;avatar&amp;#34;&amp;#62;
&amp;#60;p&amp;#62;我们都一样&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;推开窗看见星星,依然守在夜空中。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;心中不免多了些,暖暖的感动。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;一闪一闪的光,努力把黑夜点亮，气氛如此安详。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;你在我的生命中,是那最闪亮的星。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;一直在无声夜空,守护着我们的梦。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;这世界那么大,我的爱只想要你懂。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;陪伴我孤寂旅程。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;你知道我的梦,你知道我的痛。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;你知道我们感受都相同。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;就算有再大的风,也挡不住勇敢的冲动。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;努力的往前飞,再累也无所谓。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;黑夜过后的光芒有多美。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;分享你我的力量,就能把对方的路照亮。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;我想我们都一样,渴望梦想的光芒。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;这一路喜悦彷徨,不要轻易说失望。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;回到最初时光,当时的你多么坚强。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;那鼓励让我难忘。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;你知道我的梦,你知道我的痛。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;你知道我们感受都相同。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;就算有再大的风,也挡不住勇敢的冲动。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;努力的往前飞,再累也无所谓。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;黑夜过后的光芒有多美。&amp;#60;/p&amp;#62;
&amp;#60;p&amp;#62;分享你我的力量,就能把对方的路照亮。&amp;#60;/p&amp;#62;
&amp;#60;/div&amp;#62;
&amp;#60;span id=&amp;#34;cursor&amp;#34;&amp;#62;&amp;#124;&amp;#60;/span&amp;#62;
&amp;#60;embed name=&amp;#34;我们都一样&amp;#34; pluginspage=&amp;#34;http://www.microsoft.com/Windows/MediaPlayer&amp;#34; src=&amp;#34;http://www.cssass.com/blog/resource/bgsound/bgsound.mp3&amp;#34;
width=&amp;#34;1&amp;#34; height=&amp;#34;1&amp;#34; type=&amp;#34;application/x-mplayer2&amp;#34; autostart=&amp;#34;1&amp;#34;  loop=&amp;#34;1&amp;#34; volume=&amp;#34;50&amp;#34;&amp;#62;&amp;#60;/embed&amp;#62;
&amp;#60;script&amp;#62;
var $id=function(o){return document.getElementById(o) &amp;#124;&amp;#124; o};
var g=$id('avatar');
var cursor=$id(&amp;#34;cursor&amp;#34;);
var init=function ()
{
	var n=0, l=g.innerHTML, s='';
	while (n&amp;#60;l.length)
	{
		var r=l.charAt(n);
		if (r==' ') { s+=r; n++}
		if (r=='&amp;#60;') while (l.charAt(n-1)!='&amp;#62;') s+=l.charAt(n++);
		s+='&amp;#60;b&amp;#62;'+l.charAt(n++)+'&amp;#60;/b&amp;#62;';
	}
	g.innerHTML=s;
};
var Wt={};
Wt.n = 0,
Wt.i = 0;
Wt.p = g.getElementsByTagName(&amp;#34;p&amp;#34;);
Wt.loop=function(){
	if( Wt.n &amp;#62;= Wt.p.length ) {
		window.scrollTo(0,0);
		pos();
		anim();
		cursor.innerHTML='';
		g.onclick=anim;
		return [...]


No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897182/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897182/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><content:encoded>&lt;p&gt;最近一个多月都比较忙，没什么时间精力更新blog，现在终于闲下来了。&lt;br /&gt;
之前有个朋友发给我一个打字机的效果，蛮有感觉的，不过那是用VBscript写的&amp;#8230;&lt;br /&gt;
而下面的这个demo里除了打字的效果，还结合了以前这个：&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/903.html&quot;&gt;我是谁&lt;/a&gt;里的效果。&lt;br /&gt;
至于里面的心形图案，是我一个一个取出坐标得到的，如果你对心形图案还有兴趣，还可以看看这篇文章&lt;a href=&quot;http://www.cssass.com/blog/index.php/2010/808.html&quot;&gt;笛卡尔情书的秘密&lt;/a&gt;。&lt;/p&gt;
&lt;div class=&quot;runcode&quot;&gt;
&lt;div&gt;&lt;span class='areaBox' onmousedown=&quot;runcode.resize(this,event);&quot;&gt;&lt;textarea name=&quot;runcode&quot; class=&quot;runcode_text&quot; id=&quot;runcode_JIuC76&quot; onmousedown=&quot;(document.all)?(event.cancelBubble = true) : (event.stopPropagation())&quot;&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta charset=&amp;quot;UTF-8&amp;quot; /&amp;gt;
&amp;lt;title&amp;gt;Typing...&amp;lt;/title&amp;gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
*{padding:0;margin:0;}
body
{font-family:'MS Gothic';line-height: 1.8;font-size: 15px;color: #444;padding:10px;}
#avatar{position:relative;width:800px;word-wrap:break-word;margin:0 auto;}
b{font-weight:normal;display:none;}
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;div id=&amp;quot;avatar&amp;quot;&amp;gt;
&amp;lt;p&amp;gt;我们都一样&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;推开窗看见星星,依然守在夜空中。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;心中不免多了些,暖暖的感动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;一闪一闪的光,努力把黑夜点亮，气氛如此安详。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你在我的生命中,是那最闪亮的星。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;一直在无声夜空,守护着我们的梦。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;这世界那么大,我的爱只想要你懂。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;陪伴我孤寂旅程。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我的梦,你知道我的痛。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我们感受都相同。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;就算有再大的风,也挡不住勇敢的冲动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;努力的往前飞,再累也无所谓。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;黑夜过后的光芒有多美。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;分享你我的力量,就能把对方的路照亮。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;我想我们都一样,渴望梦想的光芒。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;这一路喜悦彷徨,不要轻易说失望。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;回到最初时光,当时的你多么坚强。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;那鼓励让我难忘。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我的梦,你知道我的痛。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;你知道我们感受都相同。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;就算有再大的风,也挡不住勇敢的冲动。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;努力的往前飞,再累也无所谓。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;黑夜过后的光芒有多美。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;分享你我的力量,就能把对方的路照亮。&amp;lt;/p&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;span id=&amp;quot;cursor&amp;quot;&amp;gt;|&amp;lt;/span&amp;gt;
&amp;lt;embed name=&amp;quot;我们都一样&amp;quot; pluginspage=&amp;quot;http://www.microsoft.com/Windows/MediaPlayer&amp;quot; src=&amp;quot;http://www.cssass.com/blog/resource/bgsound/bgsound.mp3&amp;quot;
width=&amp;quot;1&amp;quot; height=&amp;quot;1&amp;quot; type=&amp;quot;application/x-mplayer2&amp;quot; autostart=&amp;quot;1&amp;quot;  loop=&amp;quot;1&amp;quot; volume=&amp;quot;50&amp;quot;&amp;gt;&amp;lt;/embed&amp;gt;
&amp;lt;script&amp;gt;
var $id=function(o){return document.getElementById(o) || o};
var g=$id('avatar');
var cursor=$id(&amp;quot;cursor&amp;quot;);
var init=function ()
{
	var n=0, l=g.innerHTML, s='';
	while (n&amp;lt;l.length)
	{
		var r=l.charAt(n);
		if (r==' ') { s+=r; n++}
		if (r=='&amp;lt;') while (l.charAt(n-1)!='&amp;gt;') s+=l.charAt(n++);
		s+='&amp;lt;b&amp;gt;'+l.charAt(n++)+'&amp;lt;/b&amp;gt;';
	}
	g.innerHTML=s;
};
var Wt={};
Wt.n = 0,
Wt.i = 0;
Wt.p = g.getElementsByTagName(&amp;quot;p&amp;quot;);
Wt.loop=function(){
	if( Wt.n &amp;gt;= Wt.p.length ) {
		window.scrollTo(0,0);
		pos();
		anim();
		cursor.innerHTML='';
		g.onclick=anim;
		return false;
	};
	Wt.p[Wt.n].appendChild(cursor);
	var _loop=function(){
		var m = Wt.p[Wt.n].getElementsByTagName(&amp;quot;b&amp;quot;);
		if(Wt.i &amp;lt; m.length ){
			setTimeout(function(){
				m[Wt.i].style.display='inline';
				Wt.i++;
				_loop();
			},300);
		}
		else{
			setTimeout(function(){
				Wt.i=0;
				Wt.n++;
				Wt.loop();
			},300);
		}
	};
	_loop();
};
var glint=setInterval(function(){
	cursor.style.display = (cursor.style.display==&amp;quot;none&amp;quot;) ? &amp;quot;inline&amp;quot; : &amp;quot;none&amp;quot;;
},500);
var xo=[], yo=[], xd=[], yd=[], e=[], an=-1, dir=-1 , t=0;
var d='6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF6H86248D+8-G6H/8G-7-889C8677&amp;lt;&amp;gt;8748E?8D79C1;0C86+:6&amp;amp;;/0;&amp;gt;$=)?&amp;lt;#$=*#&amp;lt;H%=*;=!(=*G:5(=++=!?=+7&amp;lt;&amp;lt;HA9;&amp;lt;HD?3*=GDAF3&amp;gt;C5A9#&amp;gt;E$A9/A03A:!B!@A:8@1?B+AA/1BE&amp;amp;B-)BO2A/OA83A/GA8BE&amp;gt;/E0DB.FF.#CE%F-3E&amp;gt;8F,OE&amp;gt;EF,CF#&amp;lt;F,7E?)F-?E?3F,+F0AHB-H*(F+GE@6J:GG.&amp;gt;J;-I65J&amp;lt;!J2#J&amp;lt;-J2%J01J2/J&amp;lt;9J=GJ=*J39J;@J2GJ;4J2;I65O.&amp;lt;K0@LCBL9$O.BL.!O/;M,/NJ7N@@O#4NA#O0+NA/P,HO&amp;amp;HO07O&amp;amp;&amp;lt;P!ANA&amp;gt;Q,$Q.=S&amp;gt;)RC=S=ES4,S&amp;gt;6RDCS&amp;gt;ARD)S?%S(HT!OT22S?1U/&amp;amp;T=1V!*X%#T@&amp;amp;X%/V!*X%;X5(X%HWCCX&amp;amp;+WC8X&amp;amp;7X(JX30WC,ZE4W8,ZE@WE$ZF$ZH%[P1[R0[P=[R&amp;lt;[]3[RJ[]@[S/]%.[S:_,8[SF_ED]@4_,OaBD_-3^27_::a6&amp;lt;`7@`9/a*?c$(`:#`6D`FFcH;`!&amp;gt;c&amp;lt;3e,Bc&amp;lt;JdH:e7@e-:fB.e!4h$$fC(h1(i/)h1%i#!h/Hh2-h/&amp;gt;h2;i:,mJ9jDCm%0kB$l@Ol39l(2n-@p*7o+Ar%#p)7r%,q3!u63s!&amp;gt;t85z6)v@*sGCr$;pO0n.Ak62h=GdGGd:Oc$4a);_.1]@)[,!Z.AW6&amp;amp;W)DT$&amp;lt;RO3P.BO&amp;gt;#MB8L8AK!HHO)H5JF;3E=:CC&amp;amp;C)D@$F?@&amp;amp;&amp;lt;GG;J)9C#9)A6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF6=.6&amp;gt;&amp;amp;5&amp;amp;84OF4(@4*?3*J3-53*&amp;gt;3-B3*13G%44&amp;amp;5),6.D6377E%8.B;.0;3J?$+&amp;gt;E&amp;lt;B))B;@EG*F%-I0&amp;gt;I6AM&amp;amp;&amp;gt;M,=Q),PJ;T:DT@5X1$X60[NO[T,_8B_=8b16b)3eC)e!?i,Gh3!l&amp;gt;&amp;lt;kD,o*Go!!r0)r%&amp;gt;u54t92w=+v@=y+HxGF';
function pos(){
	e=g.getElementsByTagName('b');
	for (n=0; n&amp;lt;e.length; n++)
	{
		xo[n]=e[n].offsetLeft;
		yo[n]=e[n].offsetTop;
		var p=d.charCodeAt(n*3)*1600+d.charCodeAt(n*3+1)*40+d.charCodeAt(n*3+2)-78768;
		yd[n]=p%500;
		xd[n]=(p-yd[n])/500;
	}
	for (n=0; n&amp;lt;e.length; n++)
	{
		e[n].style.position='absolute';
		e[n].style.left=xo[n]+'px';
		e[n].style.top=yo[n]+'px';
	}
};
function ani()
{	t=e.length;
	for (var n=0; n&amp;lt;t; n++)
	{
		if ((an-n&amp;lt;=30)&amp;amp;&amp;amp;(an-n&amp;gt;=0))
		{
			var b=(Math.cos((((an-n)*Math.PI)/30))+1)/2;
			var a=1-b;
			e[n].style.left=((yd[n]+111)*a+xo[n]*b)+'px';
			e[n].style.top=((xd[n]+74)*a+yo[n]*b)+'px';
		}
	}
	an+=dir;
	if ((an-t&amp;lt;=30)&amp;amp;&amp;amp;(an&amp;gt;=0))
	{
		window.setTimeout(&amp;quot;ani()&amp;quot;, 20);
	}
};
function anim()
{
	dir*=-1;
	if ((an&amp;lt;0)||(an-t&amp;gt;30)) ani();
};
init();
Wt.loop();
&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/textarea&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;input type=&quot;button&quot; value=&quot;Run&quot; class=&quot;runcode_button&quot; onclick=&quot;runcode.open_new('runcode_JIuC76');&quot;/&gt; &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;No related posts. From:&lt;a href=\&lt;img src=&quot;http://www1.feedsky.com/t1/608897182/CSSASS/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/CSSASS/~7351173/608897182/5460608/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><enclosure url="http://www.cssass.com/blog/resource/bgsound/bgsound.mp3" length="4850976" type="audio/mpeg"></enclosure><category domain="http://www.cssass.com/blog">Javascript</category><category domain="http://www.cssass.com/blog">心形</category><category domain="http://www.cssass.com/blog">打字效果</category><pubDate>Mon, 01 Aug 2011 11:19:01 +0800</pubDate><guid isPermaLink="false">http://www.cssass.com/blog/?p=1086</guid><dc:creator>ONEBOYS</dc:creator><fs:srclink>http://www.cssass.com/blog/index.php/2011/1086.html</fs:srclink><fs:srcfeed>http://www.cssass.com/blog/index.php/feed/atom</fs:srcfeed><fs:itemid>feedsky/CSSASS/~7351173/608897182/5460608</fs:itemid></item></channel></rss>
