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

<channel>
	<title>CSSASS &#187; Javascript</title>
	<atom:link href="http://www.cssass.com/blog/index.php/category/javascript/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cssass.com/blog</link>
	<description>三人行必有我师焉，择其善者而从之，其不善者而改之</description>
	<lastBuildDate>Wed, 01 Feb 2012 03:48:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>获取元素尺寸和位置的两个冷门方法</title>
		<link>http://www.cssass.com/blog/index.php/2012/1136.html</link>
		<comments>http://www.cssass.com/blog/index.php/2012/1136.html#comments</comments>
		<pubDate>Wed, 04 Jan 2012 08:38:44 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[getBoundingClientRect]]></category>
		<category><![CDATA[offsetHeight]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=1136</guid>
		<description><![CDATA[获取元素的尺寸，似乎offsetWidth/Height就可以了，还需要什么方法吗？
的确，一般情况下，获取元素尺寸，用offsetWidth/Height就搞定了，但如果这个元素是display:none的呢？
试验一下就知道，none元素的尺寸是0。
所以需要我们下面的这个方法来获取。


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


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2011/1048.html' rel='bookmark' title='Permanent Link: 如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸'>如何获取窗口高度、页面高度——解读各浏览器盒模型下的窗口、页面文档尺寸</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2012/1136.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mouseenter/mouseleave事件和delegate方法的实现</title>
		<link>http://www.cssass.com/blog/index.php/2011/1127.html</link>
		<comments>http://www.cssass.com/blog/index.php/2011/1127.html#comments</comments>
		<pubDate>Sun, 18 Dec 2011 03:57:35 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[mouseenter]]></category>
		<category><![CDATA[mouseleave]]></category>

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


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


<p>No related posts. From:<a href=\]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2011/1127.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>瀑布流布局及扩展——格子块的智能堆砌</title>
		<link>http://www.cssass.com/blog/index.php/2011/1095.html</link>
		<comments>http://www.cssass.com/blog/index.php/2011/1095.html#comments</comments>
		<pubDate>Wed, 12 Oct 2011 14:32:45 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[交换]]></category>
		<category><![CDATA[布局]]></category>
		<category><![CDATA[拖动]]></category>
		<category><![CDATA[瀑布流]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=1095</guid>
		<description><![CDATA[图片分享网站Pinterest（beta），在不久前获得了2700$的投资，估值已超2亿元（据说现该公司团队有8人）。该网站的一大特色就是每一张分享的图片被拟作“Pin”被钉在页面上面，每一Pin依尺寸智能排列，同时滚动页面时异步加载新Pin，极具效果。这种创新模式被在国内也被广泛copy，其中最有前途的当属Mark之，以&#8221;Mark&#8221;代&#8221;Pin&#8221;,也算有些想法。
以下是利用豆瓣API数据做的效果：完整效果
部分代码：


&#60;!doctype html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;meta charset=&#34;UTF-8&#34; /&#62;
&#60;title&#62;等宽格子堆砌&#60;/title&#62;
&#60;style&#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:<ol><li><a href='http://www.cssass.com/blog/index.php/2008/31.html' rel='bookmark' title='Permanent Link: 二列左列宽度固定，右列宽度自适应布局的四种方法'>二列左列宽度固定，右列宽度自适应布局的四种方法</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>图片分享网站<a href="http://pinterest.com/">Pinterest</a>（beta），在不久前获得了2700$的投资，估值已超2亿元（据说现该公司团队有8人）。该网站的一大特色就是每一张分享的图片被拟作“Pin”被钉在页面上面，每一Pin依尺寸智能排列，同时滚动页面时异步加载新Pin，极具效果。这种创新模式被在国内也被广泛copy，其中最有前途的当属<a href="http://www.markzhi.com" target="_blank">Mark之</a>，以&#8221;Mark&#8221;代&#8221;Pin&#8221;,也算有些想法。</p>
<p>以下是利用豆瓣API数据做的效果：<a href="http://www.cssass.com/blog/index.php/douban" target="_blank">完整效果</a><br />
部分代码：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_yeb4R2" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot; /&gt;
&lt;title&gt;等宽格子堆砌&lt;/title&gt;
&lt;style&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);
}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;ul id=&quot;wrap&quot;&gt;&lt;/ul&gt;
&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var $id = function(o){ return document.getElementById(o) || o};
function sort(el){
	var h = [];
	var box = el.getElementsByTagName(&quot;li&quot;);
	var minH = box[0].offsetHeight,
		boxW = box[0].offsetWidth,
		boxH,
		n = document.documentElement.offsetWidth / boxW | 0;  //计算页面能排下多少Pin
	el.style.width = n * boxW + &quot;px&quot;;
	for(var i = 0; i &lt; box.length; i++) {
		boxh = box[i].offsetHeight; //获取每个Pin的高度
		if(i &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 &lt; 30; i++) {
	height = Math.floor(Math.random()*200 + 200);
	pin += '&lt;li&gt;&lt;div class=&quot;boxCont&quot; style=&quot;height:' + height + 'px;&quot;&gt;&lt;/div&gt;&lt;/li&gt;';
};
$id(&quot;wrap&quot;).innerHTML = pin;
window.onload = window.onresize = function() {
	sort($id(&quot;wrap&quot;));
};
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_yeb4R2');"/> </div>
</div>
<p>这种布局中虽然每个Pin的高度不尽相同，但是他们的宽度都是一样的。<br />
那么假如，很邪恶的提出一个要求，宽度也不尽相同，只是说宽高都按比例成倍增加，那还怎么排列呢？<br />
呵呵，如下：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_lWVeD_" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot; /&gt;
&lt;title&gt;宽高尺寸不同的格子堆砌&lt;/title&gt;
&lt;style&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);
}
&lt;/style&gt;
&lt;script&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, &quot;\\-&quot;);
        var pattern = new RegExp(&quot;(^|\\s)&quot;+className+&quot;(\\s|$)&quot;);
		var i = 0;
        while(i &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(&quot;MBox&quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &gt;&gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &quot;px&quot;;
	var i = 0 , nx, ny;
	while( i &lt; this.mbox.length){
		if( getElementsByClassName(&quot;bigBox&quot;,this.mbox[i],'div').length &gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &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(&quot;bigBox&quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &lt; ifr.length){
		theifr =  getElementsByClassName(&quot;innerBox&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 &lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x&gt;box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&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 &gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &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 &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] &gt; this.row) return true; //超出显示范围
	for(var k=1; k&lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&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&lt;this.size[n][0]; t++) {
		for(var k=0; k&lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;&amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&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 = &quot;position:absolute;left:&quot;+ x +&quot;px;top:&quot; + y + &quot;px;&quot;;
	}
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;myWidget&quot; class=&quot;myWidget&quot;&gt;&lt;/div&gt;
&lt;script&gt;
var myWidget = $id(&quot;myWidget&quot;);
//创建随机内容
var content = '';
for(i = 0; i &lt; 30; i++) {
	if(!(Math.random()*3 &gt;&gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&lt;div class=&quot;MBox&quot;&gt;&lt;div class=&quot;widgetBox bigBox&quot;&gt;&lt;div style=&quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&quot; class=&quot;innerBox&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
	}else{
		content += '&lt;div class=&quot;MBox&quot;&gt;&lt;div class=&quot;widgetBox&quot;&gt;&lt;/div&gt;&lt;/div&gt;';
	}
};
myWidget.innerHTML = content;
window.onload = function(){
	box.setIfr(myWidget);
	box.init(myWidget);
};
window.onresize = function(){
	box.init(myWidget);
};
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_lWVeD_');"/> </div>
</div>
<p>现在这种布局已经不能叫瀑布流了，我们称之为格子块，格子块通过算法智能堆砌。</p>
<p>到最后，说点下睛也好，说添下足也好，我们再加一个拖动交换格子的效果。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_kEBuK0" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot; /&gt;
&lt;title&gt;宽高尺寸不同的格子堆砌(可拖动换位)&lt;/title&gt;
&lt;style&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);
}
&lt;/style&gt;
&lt;script&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, &quot;\\-&quot;);
        var pattern = new RegExp(&quot;(^|\\s)&quot;+className+&quot;(\\s|$)&quot;);
		var i = 0;
        while(i &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[&quot;offset&quot; + (isLeft ? &quot;Left&quot; : &quot;Top&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 &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 = &quot;none&quot;;
};
Util.show = function () {
    Util.rootElement.style.display = &quot;&quot;;
};
ghostElement = null;
found = null;
getGhostElement = function () {
    if (!ghostElement) {
        ghostElement = document.createElement(&quot;DIV&quot;);
        ghostElement.className = &quot;MBox ghostBox&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(&quot;IFRAME&quot;).length &gt; 0;
        Drag.init(el, this.elm);
        this.elm.onDragStart = Util.bindFunction(this, &quot;_dragStart&quot;);
        this.elm.onDrag = Util.bindFunction(this, &quot;_drag&quot;);
        this.elm.onDragEnd = Util.bindFunction(this, &quot;_dragEnd&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 + &quot;px&quot;;
    _ghostElement.style.height = offH + &quot;px&quot;;
    _ghostElement.style.width = offW + &quot;px&quot;;
    this.elm.parentNode.insertBefore(_ghostElement, this.elm.nextSibling);
    this.elm.style.position = &quot;absolute&quot;;
    this.elm.style.zIndex = 100;
    this.elm.style.left = offLeft + &quot;px&quot;;
    this.elm.style.top = offTop + &quot;px&quot;;
    //Util.show();
    this.isDragging = false;
    return false;
};
function when_Drag(clientX, clientY) {
	    if (!this.isDragging) {
        this.elm.style.filter = &quot;alpha(opacity=70)&quot;;
        this.elm.style.opacity = 0.7;
        this.isDragging = true;
    }
    found = null;
    var max_distance = 100000000;
    for (var i = 0; i &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 &lt; max_distance) {
            max_distance = distance;
           	 found = ele;
        }
    };
    var _ghostElement = getGhostElement();
    if (found != null) {
    	if(this.elm.pagePosLeft &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 = &quot;&quot;;
    this.elm.style.width = &quot;&quot;;
    this.elm.style.zIndex = &quot;&quot;;
    this.elm.style.filter = &quot;&quot;;
    this.elm.style.opacity = &quot;&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 = &quot;0px&quot;;
			}
			if (isNaN(parseInt(element.style.top))) {
				element.style.top = &quot;0px&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; element.lastMouseY == _clientX) {
				return false;
			};
			if(_clientX + document.documentElement.scrollTop + document.body.scrollTop &lt; 0 ||  _clientX &gt; document.documentElement.offsetHeight){
				return false;
			};
			var sTo=0;
			if( _clientX &lt; 0 ){
				sTo=_clientX;
			};
			if((_clientX - document.documentElement.clientHeight) &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  + &quot;px&quot;;
			element.style.top = newY + sTo + &quot;px&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_ == &quot;undefined&quot;) {
	        ig_ = window.event;
	    }
	    if (typeof ig_.layerX == &quot;undefined&quot;) {
	        ig_.layerX = ig_.offsetX;
	    }
	    if (typeof ig_.layerY == &quot;undefined&quot;) {
	        ig_.layerY = ig_.offsetY;
	    }
	    if (typeof ig_.which == &quot;undefined&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 &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(&quot;MBox&quot;,el,'div');
	box.row = document.documentElement.offsetWidth / box.gen.w &gt;&gt; 0;  //每行标准格数
	el.style.width = box.row * box.gen.w + &quot;px&quot;;
	var i = 0 , nx, ny;
	while( i &lt; this.mbox.length){
		if( getElementsByClassName(&quot;bigBox&quot;,this.mbox[i],'div').length &gt; 0 ){
			nx=Math.ceil(this.mbox[i].offsetWidth / this.gen.w);
			nx=(nx &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(&quot;bigBox&quot;,el,'div');;
   	if(ifr.length==0) return false;
	var i = 0, nx, ny, theifr;
	while(i &lt; ifr.length){
		theifr =  getElementsByClassName(&quot;innerBox&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 &lt; this.size.length ; n++){
		if(flag == 0){
			x=temp.x;
			y=temp.y;
		}
		flag=flag-1;
		if(x &gt; box.row-1){ //换行
			x=0;
			y++;
		}
		name=x+'_'+y;  //对象属性名（反映占领的格子）
		if(this.hasN(name)) {  //判断属性名是否存在
			n--;
			x++;
			if(flag&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 &gt; y){
					temp.y = y;
					temp.x = x;
				}
				if(temp.y &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 &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] &gt; this.row) return true; //超出显示范围
	for(var k=1; k&lt;this.size[n][1];k++){
		name=x+'_'+(y-0+k);
		if(this.hasN(name)) {return true;}  //左侧一列有无重叠
	}
	for(k=1; k&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&lt;this.size[n][0]; t++) {
		for(var k=0; k&lt;this.size[n][1]; k++){
			name=(posX+t)+'_'+(posY+k);
			if(t==0 &amp;&amp; k==0) { continue; }
			this.obj[name]=0;   //多占的格子无坐标值
		}
	}
};
box.put=function(el){
	var x,y;
	for(var i =0;i&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 = &quot;position:absolute;left:&quot;+ x +&quot;px;top:&quot; + y + &quot;px;&quot;;
	};
	el.style.height= box.gen.h*(box.maxY+1) +'px';
};
&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;myWidget&quot; class=&quot;myWidget&quot;&gt;&lt;/div&gt;
&lt;script&gt;
var myWidget = $id(&quot;myWidget&quot;);
//创建随机内容
var content = '';
for(i = 0; i &lt; 20; i++) {
	if(!(Math.random()*5 &gt;&gt; 0)){
		height = Math.floor(Math.random()*200 + 100);
		width = Math.floor(Math.random()*200 + 100);
		content += '&lt;div class=&quot;MBox&quot;&gt;&lt;div class=&quot;widgetBox bigBox&quot;&gt;&lt;div style=&quot;width:' + width +'px;height:' + height +'px;margin:0 auto;&quot; class=&quot;innerBox&quot;&gt;'+ i +'&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;';
	}else{
		content += '&lt;div class=&quot;MBox&quot;&gt;&lt;div class=&quot;widgetBox&quot;&gt;'+ i +'&lt;/div&gt;&lt;/div&gt;';
	}
};
myWidget.innerHTML = content;
//绑定拖动元素
initDrag(myWidget);
window.onresize = function(){box.init(myWidget)};
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_kEBuK0');"/> </div>
</div>


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2008/31.html' rel='bookmark' title='Permanent Link: 二列左列宽度固定，右列宽度自适应布局的四种方法'>二列左列宽度固定，右列宽度自适应布局的四种方法</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2011/1095.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Typing&#8230;</title>
		<link>http://www.cssass.com/blog/index.php/2011/1086.html</link>
		<comments>http://www.cssass.com/blog/index.php/2011/1086.html#comments</comments>
		<pubDate>Thu, 28 Jul 2011 13:21:38 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[心形]]></category>
		<category><![CDATA[打字效果]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=1086</guid>
		<description><![CDATA[最近一个多月都比较忙，没什么时间精力更新blog，现在终于闲下来了。
之前有个朋友发给我一个打字机的效果，蛮有感觉的，不过那是用VBscript写的&#8230;
而下面的这个demo里除了打字的效果，还结合了以前这个：我是谁里的效果。
至于里面的心形图案，是我一个一个取出坐标得到的，如果你对心形图案还有兴趣，还可以看看这篇文章笛卡尔情书的秘密。


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


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


<p>No related posts. From:<a href=\]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2011/1086.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
<enclosure url="http://www.cssass.com/blog/resource/bgsound/bgsound.mp3" length="4850976" type="audio/mpeg" />
		</item>
		<item>
		<title>Google电吉他扩展版——可智能识别曲谱</title>
		<link>http://www.cssass.com/blog/index.php/2011/1056.html</link>
		<comments>http://www.cssass.com/blog/index.php/2011/1056.html#comments</comments>
		<pubDate>Sun, 19 Jun 2011 03:48:52 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[doodle]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[guitar]]></category>
		<category><![CDATA[源代码]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=1056</guid>
		<description><![CDATA[姗姗来迟，还请见谅。
在6月9号Google 放出的纪念电吉他之父莱斯·保罗 96 周年诞辰的电吉他Doodle代码上，扩展了这个可播放曲谱的版本。
做这个扩展版的初衷是为了方便不是很熟悉键盘的童鞋。
童鞋们可以从网上复制曲谱进来自动播放（如果读者能自己谱曲，那真的就太棒了）。
曲谱中的空格及所有非法字符都表示停顿，间隔越大表示停顿越长，也可以调整曲子的整体节奏快慢。
同时可以开启自带的录音功能，录制之后会生产网址，可以拿来同朋友分享(由于国内网络环境的问题，网址生产可能会有限滞后)。
代码方面删除了不相干的部分，并做了格式整理，但由于原代码是经过压缩的，所以阅读起来还是会很费力的，很多地方处理的挺复杂，能力有限也不便做代码分析。
以下就是全部的代码（24k的code，1张图片，1个声音的flash文件）：


&#60;!doctype html&#62;
&#60;meta charset='utf-8' /&#62;
&#60;title&#62;google电吉他扩展版——可播放曲谱&#60;/title&#62;
&#60;style&#62;
#lga{width:500px;margin:0 auto;}
#hplogo:active,#hplogo:focus{outline:none}#hplogo-g{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat 0 0;height:175px;position:relative;width:474px}#hplogo-click{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;cursor:pointer;height:130px;left:0;position:absolute;top:0;width:474px}#hplogo-lcd{height:30px;left:70px;position:absolute;top:129px;width:200px}#hplogo-lcd-icon{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -580px -162px;cursor:pointer;height:0;position:absolute;width:0}#hplogo-lcd-text{background:transparent;border:0 none;color:#666;cursor:text;font-family:&#34;VT323&#34;,arial,sans-serif;font-size:14px;left:77px;position:absolute;top:134px;text-decoration:none;width:182px}#hplogo-lcd-screen{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:20px;left:52px;position:absolute;top:134px;width:214px}#hplogo-on{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:37px;left:272px;position:absolute;top:123px;width:62px}#hplogo-led{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:21px;left:292px;position:absolute;top:133px;width:21px}.hplogo-str{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -530px -60px;height:20px;position:absolute;width:255px}#hplogot{-webkit-box-shadow:5px 5px 10px #ddd;-moz-box-shadow:5px 5px 10px #ddd;box-shadow:5px 5px 10px #ddd;-webkit-transition:opacity 0.5s ease-out;-moz-transition:opacity 0.5s ease-out;-o-transition:opacity 0.5s ease-out;transition:opacity 0.5s ease-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#ffffca;border:1px solid #b5b5b5;cursor:pointer;display:none;font:normal 9pt arial,sans-serif;left:128px;opacity:0;padding:2px 3px;position:absolute;top:16px;white-space:nowrap}
.opern{width:480px;height:40px;}
&#60;/style&#62;
&#60;body onload=&#34;document.f.q.focus();&#34; &#62;
&#60;div id=xjsc&#62;&#60;/div&#62;
&#60;div [...]


Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2010/744.html' rel='bookmark' title='Permanent Link: 模拟引力环境下的运动轨迹'>模拟引力环境下的运动轨迹</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>姗姗来迟，还请见谅。<br />
在6月9号Google 放出的纪念电吉他之父莱斯·保罗 96 周年诞辰的<a href='http://www.google.com/logos/2011/lespaul.html' target='_blank'>电吉他Doodle</a>代码上，扩展了这个可播放曲谱的版本。<br />
做这个扩展版的初衷是为了方便不是很熟悉键盘的童鞋。<br />
童鞋们可以从网上复制曲谱进来自动播放（如果读者能自己谱曲，那真的就太棒了）。<br />
曲谱中的空格及所有非法字符都表示停顿，间隔越大表示停顿越长，也可以调整曲子的整体节奏快慢。<br />
同时可以开启自带的录音功能，录制之后会生产网址，可以拿来同朋友分享(由于国内网络环境的问题，网址生产可能会有限滞后)。<br />
代码方面删除了不相干的部分，并做了格式整理，但由于原代码是经过压缩的，所以阅读起来还是会很费力的，很多地方处理的挺复杂，能力有限也不便做代码分析。<br />
以下就是全部的代码（24k的code，1张图片，1个声音的flash文件）：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_3RFcVp" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;meta charset='utf-8' /&gt;
&lt;title&gt;google电吉他扩展版——可播放曲谱&lt;/title&gt;
&lt;style&gt;
#lga{width:500px;margin:0 auto;}
#hplogo:active,#hplogo:focus{outline:none}#hplogo-g{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat 0 0;height:175px;position:relative;width:474px}#hplogo-click{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;cursor:pointer;height:130px;left:0;position:absolute;top:0;width:474px}#hplogo-lcd{height:30px;left:70px;position:absolute;top:129px;width:200px}#hplogo-lcd-icon{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -580px -162px;cursor:pointer;height:0;position:absolute;width:0}#hplogo-lcd-text{background:transparent;border:0 none;color:#666;cursor:text;font-family:&quot;VT323&quot;,arial,sans-serif;font-size:14px;left:77px;position:absolute;top:134px;text-decoration:none;width:182px}#hplogo-lcd-screen{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:20px;left:52px;position:absolute;top:134px;width:214px}#hplogo-on{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:37px;left:272px;position:absolute;top:123px;width:62px}#hplogo-led{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -2000px -2000px;height:21px;left:292px;position:absolute;top:133px;width:21px}.hplogo-str{background:url(http://cssass.com/blog/resource/guitar/guitar11-hp-sprite.png) no-repeat -530px -60px;height:20px;position:absolute;width:255px}#hplogot{-webkit-box-shadow:5px 5px 10px #ddd;-moz-box-shadow:5px 5px 10px #ddd;box-shadow:5px 5px 10px #ddd;-webkit-transition:opacity 0.5s ease-out;-moz-transition:opacity 0.5s ease-out;-o-transition:opacity 0.5s ease-out;transition:opacity 0.5s ease-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;background-color:#ffffca;border:1px solid #b5b5b5;cursor:pointer;display:none;font:normal 9pt arial,sans-serif;left:128px;opacity:0;padding:2px 3px;position:absolute;top:16px;white-space:nowrap}
.opern{width:480px;height:40px;}
&lt;/style&gt;
&lt;body onload=&quot;document.f.q.focus();&quot; &gt;
&lt;div id=xjsc&gt;&lt;/div&gt;
&lt;div id=lga&gt;
&lt;div id=hplogo border=0&gt;
	&lt;div id=hplogo-g&gt;
		&lt;div id=hplogo-click &gt;&lt;/div&gt;
		&lt;div id=hplogo-lcd-screen&gt;&lt;/div&gt;
		&lt;div id=hplogo-lcd-icon&gt;&lt;/div&gt;
		&lt;input id=hplogo-lcd-text value=&quot;&quot; autocomplete=off onclick=&quot;this.focus();this.select()&quot; readonly=readonly&gt;
		&lt;div id=hplogo-on&gt;&lt;/div&gt;
		&lt;div id=hplogo-led&gt;&lt;/div&gt;
		&lt;div id=hplogot&gt;Les Paul&amp;#39;s 96th Birthday&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;form name=f&gt;&lt;textarea class='opern' name=q &gt;3688368 77653 2226235 37753 3688368 00989 00989987 53566&lt;/textarea&gt;&lt;/form&gt;
&lt;button id='play'&gt;Play&lt;/button&gt;
节奏：
&lt;select id='speed'&gt;
	&lt;option value='5'&gt;Fast&lt;/option&gt;
	&lt;option value='7' selected&gt;Medium&lt;/option&gt;
	&lt;option value='9'&gt;Slow&lt;/option&gt;
&lt;/select&gt;
&lt;script&gt;
(function(){
var g=null,h;
if(!window.google)window.google={};
if(!google.doodle)google.doodle={};
google.rt=7;
var j,m,o,p,r,s,aa,t,u,ba,v,ca,da,ea=navigator.userAgent.indexOf(&quot;MSIE&quot;)&gt;=0,fa=[[3,&quot;#776a62&quot;,&quot;#2063ff&quot;,2,[[28,23],[103,23]]],[5,&quot;#776a62&quot;,&quot;#f61b33&quot;,2,[[28,38],[103,38]]],[0,&quot;#776a62&quot;,&quot;#ffdd24&quot;,2,[[65,67],[318,67]]],[2,&quot;#776a62&quot;,&quot;#07d238&quot;,2,[[28,81],[281,81]]],[7,&quot;#776a62&quot;,&quot;#2063ff&quot;,1,[[28,96.5],[281,96.5]]],[9,&quot;#776a62&quot;,&quot;#f61b33&quot;,1,[[29,111.5],[104,111.5]]],[1,&quot;#776a62&quot;,&quot;#07d238&quot;,2,[[358,66],[433,66]]],[4,&quot;#776a62&quot;,&quot;#2063ff&quot;,2,[[358,81],[433,81]]],[6,&quot;#776a62&quot;,&quot;#f61b33&quot;,2,[[330,96],[405,96]]],[8,&quot;#776a62&quot;,&quot;#ffdd24&quot;,1,[[358,111.5],[434,111.5]]]],ga=0,ha=0,w=0,x=0,y=!0,z=[],A=g,B=g,
C=function(a){a&amp;&amp;a.parentNode&amp;&amp;a.parentNode.removeChild(a)},
D=function(a,b,c){if(a){if(!google.doodle.ka)google.doodle.ka=[];google.doodle.ka.push(arguments);
var d=a,e=b,f=c;
d.addEventListener?d.addEventListener(e,f,!1):d.attachEvent(&quot;on&quot;+e,f)}},
ia=function(a,b,c){a&amp;&amp;(a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent(&quot;on&quot;+b,c))},
ja=function(){if(google.doodle.ka)for(var a;a=google.doodle.ka.pop();)ia.apply(g,a)},
E=function(a){a?a.stopPropagation&amp;&amp;a.stopPropagation():window.event.cancelBubble=!0;return!1},
F=function(a){if(j!==a){var b=j;j=a;for(a=0;a&lt;z.length;++a)z[a](b)}},
G=0;z.push(function(){var a=document.getElementById(&quot;hplogo-on&quot;);if(a)j==1?(a.style.backgroundPosition=&quot;-476px -139px&quot;,G=0):j==2?G=1:(a.style.backgroundPosition=&quot;-2000px -2000px&quot;,G=0)});
var ka=function(a){j==0||j==5||j==4?F(1):F(4);return E(a)},
H=g,
ma=function(a){
	C(document.getElementById(&quot;goo-gl-script&quot;));
	H&amp;&amp;window.clearTimeout(H);
	var b=&quot;http://google-lespaul.appspot.com?callback=google.doodle.url&amp;url=&quot;+encodeURIComponent(a),c=document.createElement(&quot;script&quot;);
	c.src=b;
	c.id=&quot;goo-gl-script&quot;;
	H=window.setTimeout(function(){la(a)},2E3);
	(document.getElementById(&quot;xjsc&quot;)||document.body).appendChild(c)
},
na=function(a){a&amp;&amp;a.status==&quot;OK&quot;&amp;&amp;!a.error&amp;&amp;a.id&amp;&amp;la(a.id)},
la=function(a){
	if(j==0||j==4){window.clearTimeout(H);var b=document.getElementById(&quot;hplogo-lcd-text&quot;);if(b)b.value=a,b.select()}
},
I=[[0,0,0,0,0,0],[-540,-162,9,9,59,139],[-551,-162,9,6,62,139],[-559,-162,11,17,55,138]],
J=function(a){
	var b=document.getElementById(&quot;hplogo-lcd-screen&quot;);
	if(b)b.style.backgroundPosition=&quot;-678px -139px&quot;;
	if(b=document.getElementById(&quot;hplogo-lcd-icon&quot;))
	b.style.backgroundPosition=I[a][0]+&quot;px &quot;+I[a][1]+&quot;px&quot;,b.style.height=I[a][2]+&quot;px&quot;,b.style.width=I[a][3]+&quot;px&quot;,b.style.left=I[a][4]+&quot;px&quot;,b.style.top=I[a][5]+&quot;px&quot;
};
z.push(function(a){
	var b=document.getElementById(&quot;hplogo-lcd-text&quot;);
	if(j==5){if(J(1),b.value==&quot;&quot;)b.value=&quot;Playing...&quot;}
	else if(A&amp;&amp;(j==0||j==4)){if(J(2),K(),b.value==&quot;Playing...&quot;)b.value=&quot;&quot;}
	else if(j==1)J(3),b.value=&quot;Recording&quot;;
	if(j!=2&amp;&amp;(a==1||a==2)&amp;&amp;A)A.stop(),K(),J(A.u.length==0?0:2),b.value=&quot;&quot;,B=g,(a=A.eb())&amp;&amp;ma(a)
});
var oa=function(a){A&amp;&amp;(j==0||j==4)?(F(5),A.play()):j==5&amp;&amp;F(4);return E(a)};
z.push(function(){j==1&amp;&amp;(A=new L,B=A.ib())});
var pa=!1,qa={el:1,iw:1,ja:1,kk:1,ky:1,ko:1,lt:1,lv:1,mk:1,mr:1,ru:1,th:1,ur:1,&quot;zh-CN&quot;:1,&quot;zh-TW&quot;:1},
ra=function(){
//	if(!pa&amp;&amp;!qa[google.kHL]){
//		pa=!0;window.WebFontConfig={google:{families:[&quot;VT323&quot;]}};
//		var a=document.createElement(&quot;script&quot;);
//		a.src=(&quot;https:&quot;==document.location.protocol?&quot;https&quot;:&quot;http&quot;)+&quot;://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js&quot;;
//		a.type=&quot;text/javascript&quot;;a.async=&quot;true&quot;;(document.getElementById(&quot;xjsc&quot;)||document.body).appendChild(a)
//	}
},
sa=!1,N=g,
ua=function(){O();N=window.setTimeout(function(){ta(!0)},1E3)},
O=function(){N&amp;&amp;window.clearTimeout(N);N=g;ta(!1)},
ta=function(a){var b=document.getElementById(&quot;hplogot&quot;);if(b)sa?(b.style.display=&quot;block&quot;,b.style.opacity=a?1:0):b.style.display=a?&quot;block&quot;:&quot;none&quot;},
za=function(){
	D(document,&quot;keydown&quot;,va);
	D(document,&quot;mousemove&quot;,P);
	D(document,&quot;touchmove&quot;,P);
	D(document,&quot;touchstart&quot;,wa);
	D(window,&quot;resize&quot;,xa);
	D(document.getElementById(&quot;play&quot;),&quot;click&quot;,playA);
	var a=document.forms.f||document.forms.gs||document.forms.lb;
	a&amp;&amp;(D(a.q,&quot;blur&quot;,function(){m=!1}),D(a.q,&quot;focus&quot;,function(){m=!0;j!=5&amp;&amp;F(0)}));
	D(document.body,&quot;mouseout&quot;,ya);
	if(a=document.getElementById(&quot;hplogo-on&quot;))a.onclick=ka,a.style.cursor=&quot;pointer&quot;;
	if(a=document.getElementById(&quot;hplogo-led&quot;))a.onclick=ka,a.style.cursor=&quot;pointer&quot;;
	if(a=document.getElementById(&quot;hplogo-lcd-icon&quot;))a.onclick=oa;
	if((a=document.getElementById(&quot;hplogo-click&quot;))&amp;&amp;!ea)a.onmousemove=ua,a.onmouseout=O;
	if(a=document.getElementById(&quot;speed&quot;))a.onchange=function(){google.rt=this.value};
},
wa=function(a){var b=Aa(a);b[0]&gt;=w&amp;&amp;b[0]&lt;=w+474&amp;&amp;b[1]&gt;=x&amp;&amp;b[1]&lt;=x+175&amp;&amp;a.preventDefault()},
Aa=function(a){
	a=a||window.event;
	return[(a.clientX||a.targetTouches&amp;&amp;a.targetTouches[0].clientX||0)+(document.body.scrollLeft||document.documentElement.scrollLeft),
	(a.clientY||a.targetTouches&amp;&amp;a.targetTouches[0].clientY||0)+(document.body.scrollTop||document.documentElement.scrollTop)]
},
P=function(a){a=a||window.event;a=Aa(a);ga=a[0];ha=a[1]},
//Ba={49:2,50:6,51:3,52:0,53:7,54:1,55:8,56:4,57:9,48:5,81:2,87:6,69:3,82:0,84:7,89:1,85:8,73:4,79:9,80:5,65:2,83:6,68:3,70:0,71:7,72:1,74:8,75:4,76:9,186:5,90:2,88:6,67:3,86:0,66:7,78:1,77:8,188:4,190:9,191:5},
Ba={49:2,50:6,51:3,52:0,53:7,54:1,55:8,56:4,57:9,48:5,
	81:2,87:6,69:3,82:0,84:7,89:1,85:8,73:4,79:9,80:5,
	65:2,83:6,68:3,70:0,71:7,72:1,74:8,75:4,76:9,186:5,
	90:2,88:6,67:3,86:0,66:7,78:1,77:8,188:4,190:9,191:5,
	'1':2,'2':6,'3':3,'4':0,'5':7,'6':1,'7':8,'8':4,'9':9,'0':5,
	'q':2,'w':6,'e':3,'r':0,'t':7,'y':1,'u':8,'i':4,'o':9,'p':5,
	'a':2,'s':6,'d':3,'f':0,'g':7,'h':1,'j':8,'k':4,'l':9,';':5,
	'z':2,'x':6,'c':3,'v':0,'b':7,'n':1,'m':8,',':4,'.':9,'/':5,
	'#':'#'},
va=function(a){var b=a||window.event;return o&amp;&amp;!m&amp;&amp;!b.altKey&amp;&amp;!b.ctrlKey&amp;&amp;!b.metaKey&amp;&amp;(b=Ba[b.keyCode],typeof b==&quot;number&quot;)?(j==0&amp;&amp;F(4),o.V(b),E(a)):!0},
playA=function(){
	var b=document.f.q.value.toLowerCase();
	var c=b.replace(/[^0-9a-zA-Z,.;/]/g,'#');
	var d=new L;
	for(var i=0,c=c.split(&quot;&quot;); i&lt;c.length; i++){
		b=Ba[c[i]].toString();
		d.Za(new Y(b,google.rt));
	}
	d.stop();
	google.d=5,d.play();
},
xa=function(){
	y&amp;&amp;p!=g&amp;&amp;(y=!1,window.setTimeout(function(){y=!0;var a=p,b=0;do b+=a.offsetLeft;while(a=a.offsetParent);w=b;a=p;b=0;do b+=a.offsetTop;while(a=a.offsetParent);x=b},30))
},
ya=function(a){
	(a=a||window.event)&amp;&amp;!a.toElement&amp;&amp;P(a)
},
Ca=function(a,b){
	this.i=a;this.Y=b;this.width=474;this.height=175;this.J=[];this.Ja=this.U=!1;this.ha=0;this.ta=this.T();this.ua=this.ia();this.qa=new Q(0,0);this.ra=new Q(0,0);this.Ia=!0;this.La=(new Date).getTime();this.Xa();this.Ka()
};
h=Ca.prototype;
h.Xa=function(){for(var a=0,b;b=fa[a++];)this.J.push(new Da(b[4][0][0],b[4][0][1],b[4][1][0],b[4][1][1],b[3],b[1],b[2],a,b[0],this.i,this.Y,this))};
h.T=function(){return ga-w};
h.ia=function(){return ha-x};
h.Ha=function(a){return R(a,this.width)/this.width};
h.kb=function(){this.bb();this.Ja&amp;&amp;this.ab();this.U&amp;&amp;(this.i&amp;&amp;this.i.clearRect(0,0,this.width,this.height),this.Ka())};
h.Ka=function(){for(var a=0,b;b=this.J[a++];)b.hb(),b.gb()};
h.ya=function(){if(this.J)for(var a=0,b;b=this.J[a++];)b.ya()};
h.Va=function(){for(var a=0,b;b=this.J[a++];)if(b.L||b.O){this.U=!0;return}this.U=!1};
h.bb=function(){
	var a=(new Date).getTime(),b=(a-this.La)/1E3;
	this.La=a;
	var a=this.T(),c=this.ia();
	this.qa.x=this.ta;this.qa.y=this.ua;this.ra.x=a;this.ra.y=c;var d=a-this.ta,e=c-this.ua,d=Math.sqrt(d*d+e*e);this.Ja=d&gt;0;this.ha=(this.ha*4+R(((b&gt;0?d/b:0)-70)/1430,1))/5;this.ta=a;this.ua=c
};
h.ab=function(){
	if(this.Ia)this.Ia=!1;
	else for(var a=0,b;b=this.J[a++];)
	{
		var c;c=this.qa;
		var d=this.ra,e=b.Ra,f=b.Qa,i=d.y-c.y,n=f.y-e.y,k=c.x-d.x,l=e.x-f.x,q=d.x*c.y-c.x*d.y,M=f.x*e.y-e.x*f.y,X=i*l-n*k;
		X==0?c=g:(k=(k*M-l*q)/X,i=(n*q-i*M)/X,c=Math.pow(k-d.x,2)+Math.pow(i-d.y,2)&gt;Math.pow(c.x-d.x,2)+Math.pow(c.y-d.y,2)||Math.pow(k-c.x,2)+Math.pow(i-c.y,2)&gt;Math.pow(c.x-d.x,2)+Math.pow(c.y-d.y,2)||Math.pow(k-f.x,2)+Math.pow(i-f.y,2)&gt;Math.pow(e.x-f.x,2)+Math.pow(e.y-f.y,2)||Math.pow(k-e.x,2)+Math.pow(i-e.y,2)&gt;Math.pow(e.x-f.x,2)+Math.pow(e.y-f.y,2)?g:new Q(k,i));
		c&amp;&amp;!b.L&amp;&amp;(this.ha&lt;0.4?b.Ya(c.x,c.y):b.Ma(c.x,c.y,!1))
	}
};
h.V=function(a){a&gt;=0&amp;&amp;a&lt;12&amp;&amp;this.J[a].V()};
var R=function(a,b){return a&lt;0?0:a&gt;b?b:a},
Ea=function(a){for(var b=[],a=a.match(/[0-9a-f]{2}/gi),c=0,d;d=a[c++];)b.push(parseInt(d,16));return b},
Q=function(a,b){this.x=a;this.y=b},
Da=function(a,b,c,d,e,f,i,n,k,l,q,M){
	this.z=a;this.A=b;this.ea=c;this.fa=d;this.Ra=new Q(this.z,this.A);this.Qa=new Q(this.ea,this.fa);this.R=this.ea-this.z;this.S=this.fa-this.A;
	this.length=Math.sqrt(this.R*this.R+this.S*this.S);
	this.P=this.z+this.R*0.5;this.Q=this.A+this.S*0.5;this.W=this.P;this.X=this.Q;this.Aa=this.za=this.I=this.H=0;this.ga=k;this.Da=this.ga/11;this.Ca=this.M=this.F=this.la=0;this.ca=Math.atan2(this.S,this.R);this.ba=Math.sin(this.ca);this.ma=Math.cos(this.ca);a=Math.PI/2-this.ca;this.Pa=Math.sin(a);this.Oa=Math.cos(a);this.index=n;this.lineWidth=e;this.na=f;this.Ba=i;this.aa=this.na;this.color=this.w;this.w=Ea(this.na);this.da=Ea(this.Ba);this.B=this.k=0;this.Z=this.O=this.L=!1;this.oa=1;this.i=l;this.Y=q;this.v=M;this.o=(e=this.length&gt;100)?7.5:5;this.Sa=0.88+(0.85-0.88)*this.Da;this.Ta=1.4+1.5*this.Da;this.$=0;
	if(!this.i)this.G=document.createElement(&quot;div&quot;),this.G.className=&quot;hplogo-str&quot;,this.G.style.left=this.z+1+&quot;px&quot;,this.G.style.top=this.A-10+&quot;px&quot;,this.G.style.width=this.length,this.Ua=e?-475:-730,this.Y.appendChild(this.G)
};
h=Da.prototype;h.ya=function(){if(this.G)this.Y.removeChild(this.G),this.G=g};
h.gb=function(){
	var a,b;(this.L||this.Z)&amp;&amp;this.H&amp;&amp;this.I?(a=this.H,b=this.I):(a=this.W,b=this.X);
	var c=a-this.z,d=b-this.A,e=this.ea-a,f=this.fa-b;
	this.i?(this.i.beginPath(),this.i.lineCap=&quot;round&quot;,this.i.strokeStyle=this.aa,this.i.lineWidth=this.lineWidth,this.i.shadowOffsetX=2,this.i.shadowOffsetY=3,this.i.shadowBlur=2,this.i.shadowColor=&quot;rgba(0, 0, 0, 0.35)&quot;,c=Math.sqrt(c*c+d*d),f=Math.sqrt(e*e+f*f),e=0.45*c*this.ma,c=0.45*c*this.ba,d=0.45*f*this.ma,f=0.45*f*this.ba,this.i.moveTo(this.z,this.A),this.i.bezierCurveTo(a-e,b-c,a+d,b+f,this.ea,this.fa),this.i.stroke(),this.i.closePath()):this.G.style.backgroundPosition=this.Ua+&quot;px &quot;+-(3+Math.round(d/2))*20+&quot;px&quot;
};
h.hb=function(){this.L?this.Na():this.O&amp;&amp;this.db()};
h.db=function(){
	if(this.Z){
		this.aa=this.Ba;
		var a=this.za-this.H,b=this.Aa-this.I;
		this.H+=a*0.8;this.I+=b*0.8;
		if(Math.abs(a)&lt;2&amp;&amp;Math.abs(b)&lt;2)this.$=0,this.oa=1,this.Z=!1,(a&gt;=0?1:-1)!=(this.ba&gt;=0?1:-1)&amp;&amp;(this.oa*=-1)
	}else if(this.color=[this.w[0]+(this.da[0]-this.w[0])*(this.k&gt;this.o*0.25?1:this.k/(this.o*0.25)),this.w[1]+(this.da[1]-this.w[1])*(this.k&gt;this.o*0.25?1:this.k/(this.o*0.25)),this.w[2]+(this.da[2]-this.w[2])*(this.k&gt;this.o*0.25?1:this.k/(this.o*0.25)),this.w[3]+(this.da[3]-this.w[3])*(this.k&gt;this.o*0.25?1:this.k/(this.o*0.25))],this.aa=&quot;rgb(&quot;+Math.round(this.color[0])+&quot;,&quot;+Math.round(this.color[1])+&quot;,&quot;+Math.round(this.color[2])+&quot;)&quot;,this.$+=this.Ta*this.oa,a=Math.sin(this.$),this.k*=this.Sa,this.W=this.P+a*this.ba*this.k,this.X=this.Q-a*this.ma*this.k,this.k&lt;=0.15)
	this.k=0,this.O=!1,this.color=this.w,this.aa=this.na,this.v.Va()
};
h.Na=function(){
	var a=this.v.T(),b=this.v.ia(),c=a-this.z,d=b-this.A,e=this.ca-Math.atan2(d,c),c=Math.sqrt(c*c+d*d);
	this.F=c*Math.sin(e);this.Ea(R(c*Math.cos(e)/this.length,1));this.B=R(Math.abs(this.F)/this.o,1);Math.abs(this.F)&gt;this.la?this.Wa():(this.H=a,this.I=b)
};
h.Ea=function(a){this.M=a;this.Ca=this.M&lt;=0.5?this.M/0.5:1-(this.M-0.5)/0.5;this.la=this.o*this.Ca};
h.Ma=function(a,b,c){
	this.H=a;this.I=b;
	var b=this.v.T()-this.z,d=this.v.ia()-this.A;this.Ea(R(Math.sqrt(b*b+d*d)/this.length,1));
	this.F=(1-(c?1:this.v.ha))*this.la;this.B=c?1:R(Math.abs(this.F)/this.o,1);if(this.F&lt;3)this.F=3;
	this.H+=this.F*this.Oa;
	this.I+=this.F*this.Pa;
	this.W=this.P;this.X=this.Q;
	this.O?(this.B=R(this.B/2+this.k/this.o,1),this.k=this.B*this.o):(this.k=this.B*this.o,this.Ga());
	this.Fa(this.B,this.v.Ha(a))
};
h.V=function(){this.Ma(this.P,this.Q,!0)};
h.Ya=function(a,b){this.L=!0;this.v.U=!0;this.H=a;this.I=b;this.Na()};
h.Wa=function(){this.L=!1;this.W=this.P;this.X=this.Q;this.k=this.B*this.o;this.Fa(this.B,this.v.Ha(this.v.T()));this.Ga()};
h.Ga=function(){this.v.U=!0;this.za=this.z+this.M*this.R;this.Aa=this.A+this.M*this.S;this.$=0;this.Z=this.O=!0};
h.Fa=function(a,b){
	if(r)try{s.playTrack(&quot;guitar-&quot;+(this.ga&lt;10?&quot;0&quot;:&quot;&quot;)+this.ga,this.ga,0.4+(0.6-0.4)*a,-0.8+1.6*b)}catch(c){r=!1}B&amp;&amp;B([this.index-1])
};
var Fa=function(){if(r)for(var a=0;a&lt;12;a++)if(r)try{s.stopChannel(a)}catch(b){r=!1}},
Ha=function(){u&amp;&amp;(Ga(&quot;guitar11-sound-player&quot;)||Ga(&quot;guitar11-sound-player-2&quot;))},
Ga=function(a){return(a=u.getElementById(a))&amp;&amp;a.playTrack?(s=a,r=!0,Ia(),!0):!1},
S=function(a,b){if(a&lt;b)return-1;else if(a&gt;b)return 1;return 0},
T=function(a){a=a.match(/[\d]+/g);a.length=3;return a.join(&quot;.&quot;)},
Ja=function(){
	var a=!1,b=&quot;&quot;;
	if(navigator.plugins&amp;&amp;navigator.plugins.length){var c=navigator.plugins[&quot;Shockwave Flash&quot;];c&amp;&amp;(a=!0,c.description&amp;&amp;(b=T(c.description)));navigator.plugins[&quot;Shockwave Flash 2.0&quot;]&amp;&amp;(a=!0,b=&quot;2.0.0.11&quot;)} else if(navigator.mimeTypes&amp;&amp;navigator.mimeTypes.length)(a=(c=navigator.mimeTypes[&quot;application/x-shockwave-flash&quot;])&amp;&amp;c.enabledPlugin)&amp;&amp;(b=T(c.enabledPlugin.description));else try{c=new ActiveXObject(&quot;ShockwaveFlash.ShockwaveFlash.7&quot;),a=!0,b=T(c.GetVariable(&quot;$version&quot;))}catch(d){try{c=new ActiveXObject(&quot;ShockwaveFlash.ShockwaveFlash.6&quot;),a=!0,b=&quot;6.0.21&quot;}catch(e){try{c=new ActiveXObject(&quot;ShockwaveFlash.ShockwaveFlash&quot;),a=!0,b=T(c.GetVariable(&quot;$version&quot;))}catch(f){}}}aa=a;ba=b
},
Ka=function(){
	for(var a=0,b=String(ba).replace(/^[\s\xa0]+|[\s\xa0]+$/g,&quot;&quot;).split(&quot;.&quot;),c=String(&quot;9.0.0.0&quot;).replace(/^[\s\xa0]+|[\s\xa0]+$/g,&quot;&quot;).split(&quot;.&quot;),d=Math.max(b.length,c.length),e=0;a==0&amp;&amp;e&lt;d;e++)
	{
		var f=b[e]||&quot;&quot;,i=c[e]||&quot;&quot;,n=RegExp(&quot;(\\d*)(\\D*)&quot;,&quot;g&quot;),k=RegExp(&quot;(\\d*)(\\D*)&quot;,&quot;g&quot;);
		do{
			var l=n.exec(f)||[&quot;&quot;,&quot;&quot;,&quot;&quot;],q=k.exec(i)||[&quot;&quot;,&quot;&quot;,&quot;&quot;];
			if(l[0].length==0&amp;&amp;q[0].length==0)break;
			a=S(l[1].length==0?0:parseInt(l[1],10),q[1].length==0?0:parseInt(q[1],10))||S(l[2].length==0,q[2].length==0)||S(l[2],q[2])
		}
		while(a==0)}return a&gt;=0},
U,La={c:2,d:6,e:3,f:0,g:7,a:1,b:8,C:4,D:9,E:5,1:2,2:6,3:3,4:0,5:7,6:1,7:8,8:4,9:9,0:5},
Ma=function(a,b){
	if(!(typeof a!=&quot;number&quot;||typeof b!=&quot;string&quot;)){
		U!==void 0&amp;&amp;window.clearInterval(U);var c=Math.floor(6E4/a);if(!(c&lt;30)&amp;&amp;!(6E4*(b.replace(&quot;[&quot;,&quot;&quot;).replace(&quot;]&quot;,&quot;&quot;).length/a)&gt;28E3)){
			var d=0;F(5);
			U=window.setInterval(function(){d&gt;=b.length&amp;&amp;j==5&amp;&amp;F(4);if(j!=5)window.clearInterval(U);else{var a=b.charAt(d++);
			if(a!=&quot;-&quot;){
				var c=[];if(a==&quot;[&quot;){for(;d&lt;b.length&amp;&amp;b.charAt(d)!=&quot;]&quot;;)c.push(b.charAt(d++));d++}else c.push(a);for(var a=0,i;i=c[a++];)La.hasOwnProperty(i)&amp;&amp;o.V(La[i])}
			}},c)
		}
	}
},
V=g,W=g,
Na=function(){
	if(!V){V={};W={};
	for(var a=0;a&lt;65;a++)V[a]=&quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_*&quot;.charAt(a),W[V[a]]=a;}
},
Y=function(a,b){this.N=a;this.duration=Math.max(b,0);var c=0;c+=this.N.length==1?5:11;c+=this.duration&lt;Math.pow(2,5)?6:21;this.size=c};
//Y.prototype.play=function(){for(var a=0;a&lt;this.N.length;++a)o.V(this.N[a])};
Y.prototype.play=function(){o.V(this.N)};
var Z=function(a,b){for(var c=[],d=0;d&lt;b;++d)c.push(!!(a&amp;1)),a&gt;&gt;=1;return c},
Oa=function(a,b,c){if(b+c&gt;a.length)return-1;for(var d=0,e=0;e&lt;c;++e)d*=2,d|=a[b+c-e-1]?1:0;return d},
Pa=function(a){for(var b=[],c=0;c&lt;10;++c)b.push(!1);for(c=0;c&lt;a.length;++c)b[a[c]]=!0;return b};
Y.prototype.xa=function(){
	var a=[];
	this.N.length==1?(a.push(!1),a=a.concat(Z(this.N[0],4))):(a.push(!0),a=a.concat(Pa(this.N)));
	this.duration&lt;Math.pow(2,5)?(a.push(!1),a=a.concat(Z(this.duration,5))):(a.push(!0),a=a.concat(Z(this.duration,20)));
	return a
};
var Qa=function(a,b){
	var c,d,e=b;if(b&lt;0||b&gt;=a.length)return g;
	if(a[b]){c=b+1;if(c+10&gt;a.length)d=g;else{d=[];for(var f=0;f&lt;10;++f)a[c+f]&amp;&amp;d.push(f)}if(!d)return g;b+=11}
	else{c=Oa(a,b+1,4);if(c==-1)return g;d=[c];b+=5}
	if(b&gt;=a.length)return g;a[b]?(c=Oa(a,b+1,20),b+=21):(c=Oa(a,b+1,5),b+=6);
	return c&lt;0?g:{s:new Y(d,c),n:b-e}
},
L=function(a){this.u=a||[];this.va=g;for(var b=this.duration=a=0;b&lt;this.u.length;++b)a+=this.u[b].size,b!=0&amp;&amp;(this.duration+=this.u[b].duration*50);this.size=a};
L.prototype.Za=function(a){this.u.push(a);this.size+=a.size;this.u.size&gt;1&amp;&amp;(this.duration+=a.duration*50)};
L.prototype.$a=function(){return(this.size+4)*1.37/8};
var Ra=g,
Sa=function(){j==1&amp;&amp;F(2)},Ta=g,
Ua=function(){(j==1||j==2)&amp;&amp;F(4)};
L.prototype.ib=function(){this.wa=0;this.K=[];this.cb=!0;var a=this;this.va=window.setTimeout(function(){a.tick(!0)},50);return function(b){a.K.push(b)}};
L.prototype.tick=function(a){
	this.wa++;
	if(this.K&amp;&amp;this.K.length&gt;0){
		var b=this.wa;this.wa=0;var c;
		if(this.K.length==1)c=this.K[0];else{for(var d=[],e=0;c=this.K[e++];)
		for(var f=0;f&lt;c.length;++f)d[c[f]]=1;c=[];
		for(e=0;e&lt;d.length;++e)d[e]&amp;&amp;c.push(e)}this.K=[];
		this.Za(new Y(c,b));
		this.u.length==1&amp;&amp;(window.clearTimeout(Ta),Ta=window.setTimeout(Ua,28E3),window.clearTimeout(Ra),Ra=window.setTimeout(Sa,23E3));
		b=this.$a();
		if(b&gt;=1900||this.duration&gt;=28E3){F(4);return}else b&gt;=1800&amp;&amp;F(2)
	}
	if(a){var i=this;this.va=window.setTimeout(function(){i.tick(!0)},50)}
};
L.prototype.stop=function(){
	window.clearTimeout(this.va);this.tick(!1);
	if(this.u.length&gt;0)this.u[0].duration=0;this.cb=!1;
	clearTimeout(google.clearp);
};
L.prototype.play=function(a){
	if(google.d || j==5)if(this.duration&gt;28E3)j==5&amp;&amp;F(4);
	else{
		var b=a||0;b&gt;0&amp;&amp;this.u[b-1].play();
		if(b&gt;=this.u.length)j==5&amp;&amp;F(4);
		else{var c=this;google.clearp=window.setTimeout(function(){c.play(b+1)},this.u[b].duration*50)}
	}
};
eval(&quot;google.doodle.mod = (function(a,n){return a&quot;+&quot;%%&quot;.charAt(0)+&quot;n;})&quot;);
L.prototype.xa=function(){
	for(var a=[],b=0;b&lt;this.u.length;++b)a=a.concat(this.u[b].xa());
	for(window.bits=a;google.doodle.mod(a.length,8)!=0;)a.push(!1);
	return a
};
L.prototype.eb=function(){
	if(this.u.length==0)return g;
	var a=&quot;http://www.google.com/webhp?&quot;,b=Va(window.location.toString()).hl;b&amp;&amp;(a+=&quot;hl=&quot;+b+&quot;&amp;&quot;);
	a+=&quot;tune=&quot;;
	for(var c=this.xa(),b=[],d=0;d&lt;c.length;d+=8){
		for(var e=0,f=0;f&lt;8;++f)e*=2,e|=c[d+f]?1:0;b.push(e)
	}
	Na();c=V;d=[];
	for(e=0;e&lt;b.length;e+=3){
		var i=b[e],n=(f=e+1&lt;b.length)?b[e+1]:0,k=e+2&lt;b.length,l=k?b[e+2]:0,q=i&gt;&gt;2,i=(i&amp;3)*16|n&gt;&gt;4,n=(n&amp;15)*4|l&gt;&gt;6;l&amp;=63;k||(l=64,f||(n=64));d.push(c[q],c[i],c[n],c[l])
	}return a+d.join(&quot;&quot;)
};
var Va=function(a){
	if(!a)return{};
	for(var a=a.match(/\?[^#]*/),a=(a&amp;&amp;a.length&gt;0?a[0].substr(1):&quot;&quot;).split(&quot;&amp;&quot;),b={},c=0;c&lt;a.length;++c){var d=a[c];d&amp;&amp;(d=d.split(&quot;=&quot;),b[d[0]]=d[1]||&quot;&quot;)}
	return b
},
Ia=function(){
	var a=Va(window.location.href),b=parseInt(a.bpm,10),a=a.tune;b&amp;&amp;a&amp;&amp;Ma(b,unescape(a));
	if(a){
		Na();for(var c=W,b=[],d=0;d&lt;a.length;){var e=c[a.charAt(d++)],f=d&lt;a.length?c[a.charAt(d)]:0;++d;var i=d&lt;a.length?c[a.charAt(d)]:0;++d;var n=d&lt;a.length?c[a.charAt(d)]:0;++d;if(e==g||f==g||i==g||n==g)throw Error();b.push(e*4|f&gt;&gt;4);i!=64&amp;&amp;(b.push(f*16&amp;240|i&gt;&gt;2),n!=64&amp;&amp;b.push(i*64&amp;192|n))}a=[];
		for(c=0;c&lt;b.length;++c){d=b[c];for(e=0;e&lt;8;++e)a.push(!!(d&amp;128)),d*=2}
		if(a){var k;a:{b=[];c=0;try{for(;a.length-c&gt;=8;){var l=Qa(a,c);if(l)b.push(l.s),c+=l.n;else{k=g;break a}}}catch(q){k=g;break a}k=new L(b)}k&amp;&amp;(A=k,F(5),k.play())}
	}
},
Wa=!0,
Xa=function(){
	if(google.rein&amp;&amp;google.dstr&amp;&amp;!google.doodle.jb)google.doodle.jb=!0,google.rein.push(Xa),google.dstr.push($);
	if(document.getElementById(&quot;hplogo&quot;)){
		$();google.psy&amp;&amp;google.psy.q&amp;&amp;google.msg&amp;&amp;google.msg.listen(22,function(){$();return!0});google.doodle.url=na;p=document.getElementById(&quot;hplogo-g&quot;);
		v=document.createElement(&quot;canvas&quot;);
		v.getContext?(v.width=474,v.height=175,v.hideFocus=!0,ca=v.getContext(&quot;2d&quot;),p.appendChild(v)):v=g;xa();o=new Ca(ca,p);
		var a;r=!1;Ja();
		if(!aa||!Ka())a=!1;else{
			google.doodle.flashLoaded=Ha;t=document.createElement(&quot;iframe&quot;);t.name=&quot;doodle-sound&quot;;t.style.position=&quot;absolute&quot;;t.style.top=&quot;-150px&quot;;t.style.border=0;t.style.width=&quot;100px&quot;;t.style.height=&quot;100px&quot;;document.getElementById(&quot;hplogo&quot;).appendChild(t);u=t.contentDocument;if(u==void 0||u==g)u=t.contentWindow.document;u.open();u.write(&quot;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;object classid=\&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\&quot; codebase=\&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0\&quot; width=\&quot;0\&quot; height=\&quot;0\&quot; id=\&quot;guitar11-sound-player\&quot; type=\&quot;application/x-shockwave-flash\&quot;&gt;&lt;param name=\&quot;movie\&quot; value=\&quot;http://cssass.com/blog/resource/guitar/guitar11.swf\&quot;&gt;&lt;param name=\&quot;allowScriptAccess\&quot; value=\&quot;always\&quot;&gt;&lt;object id=\&quot;guitar11-sound-player-2\&quot; type=\&quot;application/x-shockwave-flash\&quot; data=\&quot;http://cssass.com/blog/resource/guitar/guitar11.swf\&quot; width=\&quot;0\&quot; height=\&quot;0\&quot;&gt;&lt;param name=\&quot;allowScriptAccess\&quot; value=\&quot;always\&quot;&gt;&lt;/object&gt;&lt;/object&gt;&lt;/body&gt;&lt;/html&gt;&quot;);u.close();a=!0
		}
		var b=document.getElementById(&quot;hplogot&quot;);
		b&amp;&amp;(sa=typeof b.style.opacity!=&quot;undefined&quot;);za();m=!0;Ya();!a&amp;&amp;Wa&amp;&amp;Ia();Wa=!1;ra();
		if(ea)try{document.execCommand(&quot;BackgroundImageCache&quot;,!1,!0)}catch(c){}
	}},
Ya=function(){
	o&amp;&amp;(o.kb(),da=window.setTimeout(Ya,30));
	var a=document.getElementById(&quot;hplogo-led&quot;);
	if(a&amp;&amp;G)a.style.backgroundPosition=-540-23*Math.abs(Math.round(5*Math.sin(G*Math.PI/12)))+&quot;px -139px&quot;,G++
},
K=function(){
	var a=document.getElementById(&quot;hplogo-led&quot;);if(a)a.style.backgroundPosition=&quot;1000px 1000px&quot;},
$=function(){
	try{window.clearTimeout(da);O();Fa();ja();o&amp;&amp;(o.ya(),o=g);t&amp;&amp;(C(t),t=g,r=!1);v&amp;&amp;(C(v),v=g);A&amp;&amp;A.stop();B=A=g;F(0);var a=document.getElementById(&quot;hplogo-lcd-text&quot;);if(a)a.value=&quot;&quot;;var b=document.getElementById(&quot;hplogo-lcd-screen&quot;);if(b)b.style.backgroundPosition=&quot;1000px 1000px&quot;;K();google.msg&amp;&amp;window.setTimeout(function(){google.msg.unlisten(22,$)},0)}catch(c){}
};
Xa()
})();
&lt;/script&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_3RFcVp');"/> </div>
</div>
<p>可以运行以上代码，也可以访问这个链接：<a href='http://cssass.com/blog/resource/guitar/'>http://cssass.com/blog/resource/guitar/</a></p>
<p>最后罗列一些网上流传的曲谱：<br />
欢乐颂：</p>
<blockquote><p>uuiooiuyttyuuyy uuiooiuyttyuytt yyutyuiutyuiuytyw uuiooiuyttyuytt</p></blockquote>
<p>爱情买卖：</p>
<blockquote><p>3688368 77653 2226235 37753 3688368 00989 00989987 53566</p></blockquote>
<p>茉莉花：</p>
<blockquote><p>eetyiiyttyt eetyiiyttyt tttetyyt ewetewqqwq ewqwetyit ewetewqqwq</p></blockquote>
<p>义勇军进行曲：</p>
<blockquote><p>qr rrrqwer r yrtyi i yyryiytt o i t y iy iytyr y qwrryyiittw t qr ry yi rtiio i yriiiy r q r yriiiy r q r q r q r r</p></blockquote>
<p>沧海一声笑: </p>
<blockquote><p>pouyt uytew wewetyuopppou</p></blockquote>
<p>童年：</p>
<blockquote><p>35553 6676 66588886865 355536676 66658888668 9~</p></blockquote>
<p>上海滩：</p>
<blockquote><p>356666，352222，356865132</p></blockquote>
<p>一闪一闪亮晶晶 </p>
<blockquote><p>1155665 4433221 5544332 5544332 1155665 4433221；</p></blockquote>
<p>天空之城</p>
<blockquote><p>6787807 365685 254573 874477 6787807 365685 34878908 876756 1232352<br />
5878007 678789855 43213 376321 21253 376321 21276</p></blockquote>
<p>春江花月夜</p>
<blockquote><p>H-HHK-LHG～G-G-H-KLD～D-SDG-DGH～KL-;-K-L;LKH-G～</p></blockquote>
<p>隐形的翅膀</p>
<blockquote><p>358787 6568321 11186532122 358787 6568321 1118653211</p></blockquote>
<p>可以复制曲谱到文本框中直接播放。欢迎读者提供更精彩的乐谱。</p>


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2010/744.html' rel='bookmark' title='Permanent Link: 模拟引力环境下的运动轨迹'>模拟引力环境下的运动轨迹</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2011/1056.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>offsetLeft/Top Bug in Firefox</title>
		<link>http://www.cssass.com/blog/index.php/2011/917.html</link>
		<comments>http://www.cssass.com/blog/index.php/2011/917.html#comments</comments>
		<pubDate>Mon, 17 Jan 2011 03:06:56 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[浏览器与兼容]]></category>
		<category><![CDATA[FireFox]]></category>
		<category><![CDATA[offsetLeft]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=917</guid>
		<description><![CDATA[之前在这篇文章offsetX/Y for Firefox中有顺带提到ie6,ie7对于offsetLeft的不标准行为。


&#60;!doctype html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;style&#62;
*{padding:0;margin:0;}
body{padding:50px;}
#a{width:500px;height:500px;background:#ccc;padding:50px;}
#b{width:400px;height:400px;background:#ddd;padding:50px;}
#c{width:300px;height:300px;background:#eee;padding:50px;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;div id='a' style='position:relative;'&#62;
	a
	&#60;div id='b'&#62;
	b
		&#60;div id='c'&#62;&#60;/div&#62;
	&#60;/div&#62;
&#60;/div&#62;
&#60;/body&#62;
&#60;script&#62;
	$id=function(o){return document.getElementById(o) &#124;&#124; o }
	$id('c').innerHTML='c的offsetLeft=' + $id('c').offsetLeft
&#60;/script&#62;
&#60;/html&#62;

 

obj.offsetLeft是相对与“offsetParent”的距离，按标准应该是距其上级中定位元素的距离(如果不存在这个元素，则相对于整个页面文档)。
而对于ie6,ie7，obj.offsetLeft是相对其直接父级的距离——显然他们没有遵循标准。
而今天提到的兼容问题则要归咎于firefox的不合群。


&#60;!DOCTYPE HTML&#62;
&#60;html&#62;
&#60;head&#62;
&#60;meta charset=&#34;utf-8&#34;&#62;
&#60;title&#62;offsetLeft in Firefox&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;style type=&#34;text/css&#34;&#62;
*{padding:0;margin:0;}
#wrap{position:relative; width:500px; height:100px; overflow:hidden; border:10px solid #999;}
#scrolllist{position:absolute; top:0px; left:0px; width:50px;height:100px;background:#ccc;}
&#60;/style&#62;
&#60;div id=&#34;wrap&#34;&#62;
  &#60;ul id=&#34;scrolllist&#34;&#62;
  &#60;/ul&#62;
&#60;/div&#62;
&#60;script&#62;
function $(id){return document.getElementById(id);}
$('scrolllist').innerHTML=$('scrolllist').offsetLeft;
&#60;/script&#62;
&#60;/body&#62;
&#60;/html&#62;

 

当子级相对于父级绝对定位，而父级又有这两个属性：overflow:hidden; border:10px solid #999;时，
在firefox看来，子级的offsetLeft就需要再减去border值。很怪异的解释。


Related posts:offsetX/Y for Firefox关注标准CSS之外的世界


Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2010/670.html' rel='bookmark' title='Permanent Link: offsetX/Y for Firefox'>offsetX/Y for Firefox</a></li><li><a href='http://www.cssass.com/blog/index.php/2009/471.html' rel='bookmark' title='Permanent Link: 关注标准CSS之外的世界'>关注标准CSS之外的世界</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>之前在这篇文章<a href='http://www.cssass.com/blog/index.php/2010/670.html' target='_blank'>offsetX/Y for Firefox</a>中有顺带提到ie6,ie7对于offsetLeft的不标准行为。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_2F6BYo" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
*{padding:0;margin:0;}
body{padding:50px;}
#a{width:500px;height:500px;background:#ccc;padding:50px;}
#b{width:400px;height:400px;background:#ddd;padding:50px;}
#c{width:300px;height:300px;background:#eee;padding:50px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id='a' style='position:relative;'&gt;
	a
	&lt;div id='b'&gt;
	b
		&lt;div id='c'&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;script&gt;
	$id=function(o){return document.getElementById(o) || o }
	$id('c').innerHTML='c的offsetLeft=' + $id('c').offsetLeft
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_2F6BYo');"/> </div>
</div>
<p>obj.offsetLeft是相对与“offsetParent”的距离，按标准应该是距其上级中<strong>定位元素</strong>的距离(如果不存在这个元素，则相对于整个页面文档)。<br />
而对于ie6,ie7，obj.offsetLeft是相对其<strong>直接父级</strong>的距离——显然他们没有遵循标准。</p>
<p>而今天提到的兼容问题则要归咎于firefox的不合群。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_UDYp0G" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!DOCTYPE HTML&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;utf-8&quot;&gt;
&lt;title&gt;offsetLeft in Firefox&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;style type=&quot;text/css&quot;&gt;
*{padding:0;margin:0;}
#wrap{position:relative; width:500px; height:100px; overflow:hidden; border:10px solid #999;}
#scrolllist{position:absolute; top:0px; left:0px; width:50px;height:100px;background:#ccc;}
&lt;/style&gt;
&lt;div id=&quot;wrap&quot;&gt;
  &lt;ul id=&quot;scrolllist&quot;&gt;
  &lt;/ul&gt;
&lt;/div&gt;
&lt;script&gt;
function $(id){return document.getElementById(id);}
$('scrolllist').innerHTML=$('scrolllist').offsetLeft;
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_UDYp0G');"/> </div>
</div>
<p>当子级相对于父级绝对定位，而父级又有这两个属性：overflow:hidden; border:10px solid #999;时，<br />
在firefox看来，子级的offsetLeft就需要再减去border值。很怪异的解释。</p>


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2010/670.html' rel='bookmark' title='Permanent Link: offsetX/Y for Firefox'>offsetX/Y for Firefox</a></li><li><a href='http://www.cssass.com/blog/index.php/2009/471.html' rel='bookmark' title='Permanent Link: 关注标准CSS之外的世界'>关注标准CSS之外的世界</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2011/917.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我是谁</title>
		<link>http://www.cssass.com/blog/index.php/2010/903.html</link>
		<comments>http://www.cssass.com/blog/index.php/2010/903.html#comments</comments>
		<pubDate>Fri, 31 Dec 2010 10:14:41 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=903</guid>
		<description><![CDATA[下面的代码里隐藏着一个秘密。
这个秘密将会告诉你我是谁!


&#60;!DOCTYPE html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;meta charset=&#34;UTF-8&#34; /&#62;
&#60;title&#62;Who am I&#60;/title&#62;
&#60;style type=&#34;text/css&#34;&#62;
body
{
font-family: '微软雅黑';
line-height: 2;
font-size: 18px;
color: #444;
}
b{font-weight:normal;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;div id=&#34;avata&#34; style=&#34;width:50%;word-wrap:break-word;cursor:pointer;&#34; onclick=&#34;anim()&#34;&#62;王某人，自号【步舞之鹤】，洋诨【ONEBOYS】，八六年生人，籍贯义乌，师出浙林，寄居杭州。混迹互联网、IT界二年余，以捣鼓前端为业。英俊潇洒不足，博学多才欠精。为人善良，外冷内热。性格优柔寡断，善思不善断，善听不善言，十足的低调焖烧型青年。喜体验互联网新事物，好学习崇拜达人牛爷。业余网球爱好者，浙大紫荆港网球场每周六午后，逢无事必到。个人blog：cssass.com。僻野茅庐，若劳大驾，不胜惶恐。&#60;/div&#62;
&#60;script type=&#34;text/javascript&#34;&#62;/*&#60;![CDATA[*/
var d='43#43643F44)44745!45345G:%6?&#62;6E/6JH6P,JU96X1JF8(F89F9#F90F9HF:1F:AX01X0?X0OX18X23X2DX3/X3@1%E6%@:45?@C?A+;&#38;2&#62;CODA0I@JO%6M71LFAW*1V9BU0+55D56.56=56O578;@&#62;AJ&#62;H9*N**SO&#62;Y&#38;BXO,XO?Y()Y(;1B46)43$F3%03%B3&#38;,3&#38;=3&#38;O1E86E9=J#=J5=JE=&#62;C=?-=??=@(=@:82#C;7H;,JB@JC,JC=JCOJD:JE#JE4DF&#60;O7&#60;U(&#60;ZA&#60;U&#38;BTO,TO&#62;U((U(OU):U*$43#43643F44)44745!45345G:%6?&#62;6E/6JH6P,JU96X1JF8(F89F9#F90F9HF:1F:AX01X0?X0OX18X23X2DX3/X3@1%E6%@:45?@C?A+;&#38;2&#62;CODA0I@JO%6M71LFAW*1V9BU0+55D56.56=56O578;@&#62;AJ&#62;H9*N**SO&#62;Y&#38;BXO,XO?Y()Y(;1B46)43$F3%03%B3&#38;,3&#38;=3&#38;O1E86E9=J#=J5=JE=&#62;C=?-=??=@(=@:82#C;7H;,JB@JC,JC=JCOJD:JE#JE4DF&#60;O7&#60;U(&#60;ZA&#60;U&#38;BTO,TO&#62;U((U(OU):U*$43#43643FU(OU):U*$';
var xo=[], yo=[], xd=[], yd=[], e=[], an=-1, dir=-1 , t=0;
var e;
function i()
{
	var n=0, g=document.getElementById('avata'), l=g.innerHTML, s='';
	while (n&#60;l.length)
	{
		var r=l.charAt(n);
		if (r==' ') {s+=r; n++}
		if (r=='&#60;') while (l.charAt(n-1)!='&#62;') s+=l.charAt(n++);
		s+='&#60;b&#62;'+l.charAt(n++)+'&#60;/b&#62;';
	}
	g.innerHTML=s;
	e=document.getElementById('avata').getElementsByTagName('b');
	for (n=0; n&#60;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&#60;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=parseInt(e.length/4)+2;
	for (var n=0; n&#60;t; n++)
	{
		m=e.length-1-n;
		if ((an-n&#60;=30)&#38;&#38;(an-n&#62;=0))
		{
			var b=(Math.cos((((an-n)*Math.PI)/30))+1)/2;
			var [...]


No related posts. From:<a href=\]]></description>
			<content:encoded><![CDATA[<p>下面的代码里隐藏着一个秘密。<br />
这个秘密将会告诉你<strong>我是谁</strong>!</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_Hf77L0" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot; /&gt;
&lt;title&gt;Who am I&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
body
{
font-family: '微软雅黑';
line-height: 2;
font-size: 18px;
color: #444;
}
b{font-weight:normal;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;avata&quot; style=&quot;width:50%;word-wrap:break-word;cursor:pointer;&quot; onclick=&quot;anim()&quot;&gt;王某人，自号【步舞之鹤】，洋诨【ONEBOYS】，八六年生人，籍贯义乌，师出浙林，寄居杭州。混迹互联网、IT界二年余，以捣鼓前端为业。英俊潇洒不足，博学多才欠精。为人善良，外冷内热。性格优柔寡断，善思不善断，善听不善言，十足的低调焖烧型青年。喜体验互联网新事物，好学习崇拜达人牛爷。业余网球爱好者，浙大紫荆港网球场每周六午后，逢无事必到。个人blog：cssass.com。僻野茅庐，若劳大驾，不胜惶恐。&lt;/div&gt;
&lt;script type=&quot;text/javascript&quot;&gt;/*&lt;![CDATA[*/
var d='43#43643F44)44745!45345G:%6?&gt;6E/6JH6P,JU96X1JF8(F89F9#F90F9HF:1F:AX01X0?X0OX18X23X2DX3/X3@1%E6%@:45?@C?A+;&amp;2&gt;CODA0I@JO%6M71LFAW*1V9BU0+55D56.56=56O578;@&gt;AJ&gt;H9*N**SO&gt;Y&amp;BXO,XO?Y()Y(;1B46)43$F3%03%B3&amp;,3&amp;=3&amp;O1E86E9=J#=J5=JE=&gt;C=?-=??=@(=@:82#C;7H;,JB@JC,JC=JCOJD:JE#JE4DF&lt;O7&lt;U(&lt;ZA&lt;U&amp;BTO,TO&gt;U((U(OU):U*$43#43643F44)44745!45345G:%6?&gt;6E/6JH6P,JU96X1JF8(F89F9#F90F9HF:1F:AX01X0?X0OX18X23X2DX3/X3@1%E6%@:45?@C?A+;&amp;2&gt;CODA0I@JO%6M71LFAW*1V9BU0+55D56.56=56O578;@&gt;AJ&gt;H9*N**SO&gt;Y&amp;BXO,XO?Y()Y(;1B46)43$F3%03%B3&amp;,3&amp;=3&amp;O1E86E9=J#=J5=JE=&gt;C=?-=??=@(=@:82#C;7H;,JB@JC,JC=JCOJD:JE#JE4DF&lt;O7&lt;U(&lt;ZA&lt;U&amp;BTO,TO&gt;U((U(OU):U*$43#43643FU(OU):U*$';
var xo=[], yo=[], xd=[], yd=[], e=[], an=-1, dir=-1 , t=0;
var e;
function i()
{
	var n=0, g=document.getElementById('avata'), l=g.innerHTML, s='';
	while (n&lt;l.length)
	{
		var r=l.charAt(n);
		if (r==' ') {s+=r; n++}
		if (r=='&lt;') while (l.charAt(n-1)!='&gt;') s+=l.charAt(n++);
		s+='&lt;b&gt;'+l.charAt(n++)+'&lt;/b&gt;';
	}
	g.innerHTML=s;
	e=document.getElementById('avata').getElementsByTagName('b');
	for (n=0; n&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&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=parseInt(e.length/4)+2;
	for (var n=0; n&lt;t; n++)
	{
		m=e.length-1-n;
		if ((an-n&lt;=30)&amp;&amp;(an-n&gt;=0))
		{
			var b=(Math.cos((((an-n)*Math.PI)/30))+1)/2;
			var a=1-b;
			for (i=0; i&lt;=t; i+=t)
			{
				e[n+i].style.left=((yd[n+i]+111)*a+xo[n+i]*b)+'px';
				e[n+i].style.top=((xd[n+i]+74)*a+yo[n+i]*b)+'px';
				e[m-i].style.left=((yd[m-i]+111)*a+xo[m-i]*b)+'px';
				e[m-i].style.top=((xd[m-i]+74)*a+yo[m-i]*b)+'px';
			}
		}
	}
	an+=dir;
	if ((an-t&lt;=30)&amp;&amp;(an&gt;=0))
	{
		window.setTimeout(&quot;ani()&quot;, 30);
	}
}
function anim()
{
	dir*=-1;
	if ((an&lt;0)||(an-t&gt;30)) ani();
}
i();
/*]]&gt;*/
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_Hf77L0');"/> </div>
</div>
<p>其实，以上DEMO，代码基本上都来自<a href='http://www.romancortes.com' target='_blank'> Román Cortés</a>,就是那个只用了1K字符写出3D圣诞树的家伙。</p>
<p>附：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_asqxfo" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8' /&gt;
&lt;style&gt;
textarea{width:600px;height:60px;font-size:12px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;源坐标：&lt;textarea id='e'&gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;p&gt;存坐标：&lt;textarea id='s'&gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;p&gt;解坐标：&lt;textarea id='e2'&gt;&lt;/textarea&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
//最大存储坐标[499,254]
var e=[
[7,13],
[26,13],
[499,254]
];
var s='';
var e2=[];
//用字符串存储坐标
function untie(e){
	var i,p,a,b,c;
	var find=function(p){
		for(c=33;c&lt;=126;c++){
			if (c==34 || c==39 || c==92) continue;  //排出' &quot; \三个符号
			for(b=33;b&lt;=126;b++){
				if (b==34 || b==39 || b==92) continue;
				for(a=33;a&lt;=126;a++){
					if (a==34 || a==39 || a==92) continue;
					if(p==a*1600 + b*40 + c-78768)
					{return (String.fromCharCode(a)+String.fromCharCode(b)+String.fromCharCode(c));}
				}
			}
		}
	}
	for(i=0;i&lt;e.length;i++){
		p=e[i][1]*500+e[i][0];
		s+=find(p);
	}
	document.getElementById('s').value=s;
}
//将存储的字符串转回坐标
function tie(s){
	var p,n;
	for(var i=0; i&lt;s.length/3 ; i++){
		n=[];
		p=s.charCodeAt(i*3)*1600+s.charCodeAt(i*3+1)*40+s.charCodeAt(i*3+2)-78768;
		n[0]=p%500;
		n[1]=(p-n[0])/500;
		e2.push(n);
	}
	document.getElementById('e2').value=e2;
}
document.getElementById('e').value=e;
untie(e);
tie(s);
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_asqxfo');"/> </div>
</div>
<p>新年来临，这篇博文也就是我2010年的关门之作。<br />
祝大家新的一年里新年新气象。</p>


<p>No related posts. From:<a href=\]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2010/903.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>模拟引力环境下的运动轨迹</title>
		<link>http://www.cssass.com/blog/index.php/2010/744.html</link>
		<comments>http://www.cssass.com/blog/index.php/2010/744.html#comments</comments>
		<pubDate>Sat, 28 Aug 2010 03:13:26 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[doodle]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[抛物线]]></category>
		<category><![CDATA[摩擦运动]]></category>
		<category><![CDATA[碰撞运动]]></category>
		<category><![CDATA[自由落体]]></category>
		<category><![CDATA[运动模拟]]></category>
		<category><![CDATA[运动轨迹]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=744</guid>
		<description><![CDATA[话说这篇文章的起源还得从1643年1月4日谈起。这一天，一位引领人类认知世界的巨人诞生了，他就是艾萨克·牛顿（Isaac Newton）。
扯远了，就近一点：2010年1月4日，为了纪念牛顿，google设计了一个Google Doodles
看这里：今日google纪念logo,典型的物理运动实现
进口审核剪切版：


&#60;input type=&#34;button&#34; value=&#34;demo&#34; onclick=&#34;demo()&#34; /&#62;
&#60;img id=&#34;fall&#34; src=&#34;http://www.google.com/logos/newton09-apple.png&#34; style=&#34;position:absolute;left:200px;top:46px&#34;/&#62;
&#60;script type=&#34;text/javascript&#34;&#62;
function demo(){
	var h=1,k=-0.5,f=document.getElementById('fall'),
		i=setInterval(function(){
			if(f){
				var y=parseInt(f.style.top) + h;
				if(y&#60;210) {h+=2}
				else{
					h*=(h&#62;1)?k:0
				}
				f.style.top=y+'px';
			}
			if(h==0){clearInterval(i);h=1;}
		},25);
}
&#60;/script&#62;

 

随后，我便模拟了一个重力环境下的抛物线运动：


  &#60;!doctype html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;meta charset=&#34;utf-8&#34; /&#62;
&#60;title&#62;模拟重力环境下的抛物运动（假使1px==1mm）&#60;/title&#62;
&#60;style type=&#34;text/css&#34;&#62;
	*{padding:0;margin:0;}
	html,body{height:100%;overflow:hidden;}
	p{margin:2px;font-size:12px;}
	label{display:inline-block;width:80px;text-align:right;}
	input{width:80px;}
	.wrap{position:relative;width:800px;height:500px;margin:5px;border:1px solid #ccc;}
	#fall{width:20px;font-size:0;height:20px;background:orange;position:absolute;top:0;left:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;p&#62;&#60;label&#62;横向初速度：&#60;/label&#62;&#60;input id=&#34;Vx&#34; type=&#34;text&#34; value=&#34;3&#34; /&#62;px/ms&#60;/p&#62;
&#60;p&#62;&#60;label&#62;纵向初速度：&#60;/label&#62;&#60;input id=&#34;Vy&#34; type=&#34;text&#34; value=&#34;0&#34; /&#62;px/ms&#60;/p&#62;
&#60;p&#62;&#60;label&#62;重力加速度：&#60;/label&#62;&#60;input id=&#34;a&#34; type=&#34;text&#34; value=&#34;0.0098&#34; /&#62;px/平方ms&#60;/p&#62;
&#60;p&#62;（如果这个加速度是一个随时间变化的值，就能达到其他非匀加速运动的效果了。）&#60;/p&#62;
&#60;p&#62;&#60;label&#62;单位时间：&#60;/label&#62;&#60;input id=&#34;t&#34; type=&#34;text&#34; value=&#34;10&#34; /&#62;（记录运动的时间间隔）
&#60;p&#62;&#60;button type=&#34;button&#34;  onclick=&#34;demo()&#34;&#62;演示&#60;/button&#62;&#60;/p&#62;
&#60;div class=&#34;wrap&#34;&#62;
&#60;div id=&#34;fall&#34;&#62;o&#60;/div&#62;
&#60;/div&#62;
&#60;/body&#62;
&#60;script type=&#34;text/javascript&#34;&#62;
var $id=function(o) {
	return document.getElementById(o) &#124;&#124; o;
}
var demo=function() {
	var [...]


Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2011/1056.html' rel='bookmark' title='Permanent Link: Google电吉他扩展版——可智能识别曲谱'>Google电吉他扩展版——可智能识别曲谱</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>话说这篇文章的起源还得从1643年1月4日谈起。这一天，一位引领人类认知世界的巨人诞生了，他就是艾萨克·牛顿（Isaac Newton）。<br />
扯远了，就近一点：2010年1月4日，为了纪念牛顿，google设计了一个Google Doodles<br />
看这里：<a href='http://bbs.blueidea.com/viewthread.php?tid=2964870' target='_blank'>今日google纪念logo,典型的物理运动实现</a><br />
进口审核剪切版：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_upklp_" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;input type=&quot;button&quot; value=&quot;demo&quot; onclick=&quot;demo()&quot; /&gt;
&lt;img id=&quot;fall&quot; src=&quot;http://www.google.com/logos/newton09-apple.png&quot; style=&quot;position:absolute;left:200px;top:46px&quot;/&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function demo(){
	var h=1,k=-0.5,f=document.getElementById('fall'),
		i=setInterval(function(){
			if(f){
				var y=parseInt(f.style.top) + h;
				if(y&lt;210) {h+=2}
				else{
					h*=(h&gt;1)?k:0
				}
				f.style.top=y+'px';
			}
			if(h==0){clearInterval(i);h=1;}
		},25);
}
&lt;/script&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_upklp_');"/> </div>
</div>
<p>随后，我便模拟了一个重力环境下的抛物线运动：</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_lwtNOk" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
  &lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;utf-8&quot; /&gt;
&lt;title&gt;模拟重力环境下的抛物运动（假使1px==1mm）&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
	*{padding:0;margin:0;}
	html,body{height:100%;overflow:hidden;}
	p{margin:2px;font-size:12px;}
	label{display:inline-block;width:80px;text-align:right;}
	input{width:80px;}
	.wrap{position:relative;width:800px;height:500px;margin:5px;border:1px solid #ccc;}
	#fall{width:20px;font-size:0;height:20px;background:orange;position:absolute;top:0;left:0;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;&lt;label&gt;横向初速度：&lt;/label&gt;&lt;input id=&quot;Vx&quot; type=&quot;text&quot; value=&quot;3&quot; /&gt;px/ms&lt;/p&gt;
&lt;p&gt;&lt;label&gt;纵向初速度：&lt;/label&gt;&lt;input id=&quot;Vy&quot; type=&quot;text&quot; value=&quot;0&quot; /&gt;px/ms&lt;/p&gt;
&lt;p&gt;&lt;label&gt;重力加速度：&lt;/label&gt;&lt;input id=&quot;a&quot; type=&quot;text&quot; value=&quot;0.0098&quot; /&gt;px/平方ms&lt;/p&gt;
&lt;p&gt;（如果这个加速度是一个随时间变化的值，就能达到其他非匀加速运动的效果了。）&lt;/p&gt;
&lt;p&gt;&lt;label&gt;单位时间：&lt;/label&gt;&lt;input id=&quot;t&quot; type=&quot;text&quot; value=&quot;10&quot; /&gt;（记录运动的时间间隔）
&lt;p&gt;&lt;button type=&quot;button&quot;  onclick=&quot;demo()&quot;&gt;演示&lt;/button&gt;&lt;/p&gt;
&lt;div class=&quot;wrap&quot;&gt;
&lt;div id=&quot;fall&quot;&gt;o&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var $id=function(o) {
	return document.getElementById(o) || o;
}
var demo=function() {
	var x=$id('Vx').value,
		y=$id('Vy').value,
		a=$id('a').value,
		t=$id('t').value;
		shoot(x,y,a,t);
}
var shoot=function(x,y,a,t) {
	var f=document.getElementById('fall');
	var Vx=parseInt(x),
		Vy=parseInt(y),
		g=a,
		t=parseInt(t),
		h=0,l=0,Sx=0,Sy=0;
	var i=setInterval(function(){
		if(f){
			Sx+=Vx*t;
			l=Sx;
			Vy+=g*t;
			h+=Vy*t;
			if(h&gt;480) {
				h=480;
				clearInterval(i);
			}
			if(l&gt;780) {
				l=780;
				clearInterval(i);
			}
			f.style.left=l+'px';
			f.style.top=h+'px';
		}
	},t);
}
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_lwtNOk');"/> </div>
</div>
<p>模拟采用的公式</p>
<div class="hl-surround"><ol class="hl-main ln-show" <li class="hl-firstline">Function: 对于运动瞬间</li>
<li>V=V0+aT;</li>
<li>S=S0+VT;</li>
<li>T：运动的时间间隔，是固定值。</li></ol></div>
<p>这个公式有别于那种运动模拟中常用的补间动画公式（tween算法）。<br />
补间动画是需要事先确定总路程，和总时间的，<br />
而我们模拟的运动轨迹没有事先计算，因为我们运动中间或许还有一些变数，比如撞击，主动改变方向（键盘控制）等等，所以我觉得这个物理公式更能模拟出真实的各种运动。</p>
<p>直至本月前两天，某同事向我展示了这个：<br />
<a href='http://mrdoob.com/projects/chromeexperiments/google_gravity/' target='_blank'>重力版google(浏览首选chrome,safari,次选opera,firefox,若是ie9以下请无视)</a><br />
膜拜啊。js且不论，css3已经大量使用了。我还只局限用用阴影，圆角呢。</p>
<p>不才，也做一个关于落体，撞击，摩擦的简单模拟。以表膜拜。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_o7ENPQ" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
 &lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset=&quot;utf-8&quot; /&gt;
&lt;title&gt;模拟引力环境下的撞击、摩擦、落体运动&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
	*{padding:0;margin:0;}
	html,body{height:100%;overflow:hidden;}
	p{margin:2px;font-size:12px;}
	label{display:inline-block;width:80px;text-align:right;}
	input{width:80px;}
	#fall{width:20px;font-size:0;height:20px;background:orange;position:absolute;top:50px;left:400px;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;&lt;label&gt;横向初速度：&lt;/label&gt;&lt;input id=&quot;Vx&quot; type=&quot;text&quot; value=&quot;3&quot; /&gt;px/ms&lt;/p&gt;
&lt;p&gt;&lt;label&gt;纵向初速度：&lt;/label&gt;&lt;input id=&quot;Vy&quot; type=&quot;text&quot; value=&quot;0&quot; /&gt;px/ms&lt;/p&gt;
&lt;p&gt;&lt;label&gt;重力加速度：&lt;/label&gt;&lt;input id=&quot;a&quot; type=&quot;text&quot; value=&quot;0.01&quot; /&gt;px/平方ms&lt;/p&gt;
&lt;p&gt;&lt;label&gt;单位时间：&lt;/label&gt;&lt;input id=&quot;t&quot; type=&quot;text&quot; value=&quot;10&quot; /&gt;（记录运动的时间间隔）
&lt;p&gt;(摩擦，碰撞的消耗并没有按公式进行计算，纯属于杜撰，是不符合规律的，仅仅是模拟。)&lt;/p&gt;
&lt;p&gt;&lt;button type=&quot;button&quot;  onclick=&quot;demo()&quot;&gt;演示&lt;/button&gt; &lt;button type=&quot;button&quot;  onclick=&quot;document.location.reload()&quot;&gt;重置(可拖动放置)&lt;/button&gt;&lt;/p&gt;
&lt;div id=&quot;fall&quot; onmousedown='drag(this,event)'&gt;o&lt;/div&gt;
&lt;/body&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
var $id=function(o) {
	return document.getElementById(o) || o;
}
var demo=function() {
	var x=$id('Vx').value,
		y=$id('Vy').value,
		a=$id('a').value,
		t=$id('t').value;
		shoot(x,y,a,t);
}
var shoot=function(x,y,a,t) {
	if(i) {alert(1);clearInterval(i)};
	var f=document.getElementById('fall');
	var Vx=parseFloat(x),
		Vy=parseFloat(y),
		g=parseFloat(a),
		h=f.offsetTop,
		Sx=f.offsetLeft,
		l=0,
		t=parseInt(t);
	var i=setInterval(function(){
		if(f){
			Sx+=Vx*t;
			l=Sx;
			Vy+=g*t;
			h+=Vy*t;
			if(h&gt;=document.documentElement.offsetHeight-f.offsetHeight) {  //底部
				h=document.documentElement.offsetHeight-f.offsetHeight;
				Vx=(Math.abs(Vx)-0.1 &lt; 0) ? 0 : Vx/Math.abs(Vx) * (Math.abs(Vx)-0.1)   //摩擦消耗x速度
				Vy=(Math.abs(Vy)-0.8 &lt; 0) ? 0 : -(Math.abs(Vy)-0.8);                   //撞击消耗y速度
				if(Math.abs(Vy)==0 &amp;&amp; Math.abs(Vx)==0 ) {clearInterval(i);}            //x,y速度为0时，clear
			}
			if(l&lt;0 || l&gt;document.documentElement.offsetWidth-f.offsetWidth) {  //左右两侧
				Sx=(l&lt;0) ? 0 : document.documentElement.offsetWidth-f.offsetWidth;
				Vx=(Math.abs(Vx)-0.2 &lt; 0) ? 0 : -Vx/Math.abs(Vx) * (Math.abs(Vx)-0.2)  //撞击消耗x速度
			}
			f.style.left=l+'px';
			f.style.top=h+'px';
		}
	},t);
};
var drag=function(o,e){ //拖曳位置，与运动模拟无关
	var e = e ? e : window.event;
	if(!window.event) {e.preventDefault();}
	var tX=o.offsetLeft,
		tY=o.offsetTop,
		dx=e.clientX,
		dy=e.clientY;
	document.onmousemove=function(e){
		var e = e ? e : window.event;
		o.style.left=tX+e.clientX-dx+&quot;px&quot;;
		o.style.top=tY+e.clientY-dy+&quot;px&quot;;
	}
	document.onmouseup=function(){
		document.onmousemove=null;
		document.onmouseup=null;
	}
}
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_o7ENPQ');"/> </div>
</div>
<p>对于这个运动的模拟，我觉得以后倒是可以扩展出一些挺有趣的交互游戏的模拟。比如，射击啊，驾驶啊等等，当然纯属娱乐啦。</p>


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2011/1056.html' rel='bookmark' title='Permanent Link: Google电吉他扩展版——可智能识别曲谱'>Google电吉他扩展版——可智能识别曲谱</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2010/744.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>google suggestion效果的键盘鼠标事件</title>
		<link>http://www.cssass.com/blog/index.php/2010/734.html</link>
		<comments>http://www.cssass.com/blog/index.php/2010/734.html#comments</comments>
		<pubDate>Mon, 23 Aug 2010 07:49:30 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[suggestion]]></category>
		<category><![CDATA[键盘事件]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=734</guid>
		<description><![CDATA[google的suggestion功能是一个非常棒的用户体验创新，相信你之前也已经使用过了。不过由于某些原因，国内现在却不能使用这个功能了。
不过,你还可以在baidu上使用相同的功能。对于好点子好创意，模仿学习并不是件坏事。
以下demo，我抛弃suggestion的核心ajax，只是做一下鼠标键盘事件的演示。


&#60;!doctype html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;meta charset='UTF-8' /&#62;
&#60;style type='text/css'&#62;
.sugg{position:relative;font-size:12px;}
.sugg a{text-decoration:none;}
.sugg .text{width:210px;height:18px;padding:3px;color:#474747;border:1px solid #ADCAD8;}
#suggestion{display:none;position:absolute;top:26px;left:0;width:216px;border:1px solid #3890d0;border-top:0;background:#fff;}
#suggestion a{display:block;height:25px;line-height:25px;padding:0 5px;color:#000;}
#suggestion a img{vertical-align:middle;}
#suggestion #hover{background:#378ece;color:#fff;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;div class='sugg'&#62;
	&#60;form id='suggF' action=&#34;http://www.baidu.com/baidu&#34; onsubmit=&#34;document.charset='GBK';sug.hide()&#34; accept-charset='GBK' target=&#34;_blank&#34;&#62;
		&#60;input class='text' type=text name=wd autocomplete=&#34;off&#34; onkeydown=&#34;pressKey(this,event)&#34; /&#62;
		&#60;input id='sub' type=&#34;submit&#34; value=&#34;搜索&#34; /&#62;
	&#60;/form&#62;
	&#60;div id='suggestion'&#62;
		&#60;a href='javascript:;' onmouseover=&#34;sug.hover(this);&#34; onclick=&#34;sug.select();&#34;&#62;思思&#60;/a&#62;
		&#60;a href='javascript:;' onmouseover=&#34;sug.hover(this);&#34; onclick=&#34;sug.select();&#34;&#62;芊芊&#60;/a&#62;
		&#60;a href='javascript:;' onmouseover=&#34;sug.hover(this);&#34; onclick=&#34;sug.select();&#34;&#62;cssass&#60;/a&#62;
		&#60;a href='javascript:;' onmouseover=&#34;sug.hover(this);&#34; onclick=&#34;sug.select();&#34;&#62;敏敏&#60;/a&#62;
		&#60;a href='javascript:;' onmouseover=&#34;sug.hover(this);&#34; onclick=&#34;sug.select();&#34;&#62;黎黎&#60;/a&#62;
	&#60;/div&#62;
&#60;/div&#62;
suggestion显示之后，使用方向键或鼠标进行选择。
&#60;/body&#62;
&#60;script type='text/javascript'&#62;
var $id=function(o){
	return document.getElementById(o) &#124;&#124; o;
}
var pressKey=function(o,e){
	var e [...]


No related posts. From:<a href=\]]></description>
			<content:encoded><![CDATA[<p>google的suggestion功能是一个非常棒的用户体验创新，相信你之前也已经使用过了。不过由于某些原因，国内现在却不能使用这个功能了。<br />
不过,你还可以在baidu上使用相同的功能。对于好点子好创意，模仿学习并不是件坏事。</p>
<p>以下demo，我抛弃suggestion的核心ajax，只是做一下鼠标键盘事件的演示。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_LEISv8" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta charset='UTF-8' /&gt;
&lt;style type='text/css'&gt;
.sugg{position:relative;font-size:12px;}
.sugg a{text-decoration:none;}
.sugg .text{width:210px;height:18px;padding:3px;color:#474747;border:1px solid #ADCAD8;}
#suggestion{display:none;position:absolute;top:26px;left:0;width:216px;border:1px solid #3890d0;border-top:0;background:#fff;}
#suggestion a{display:block;height:25px;line-height:25px;padding:0 5px;color:#000;}
#suggestion a img{vertical-align:middle;}
#suggestion #hover{background:#378ece;color:#fff;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class='sugg'&gt;
	&lt;form id='suggF' action=&quot;http://www.baidu.com/baidu&quot; onsubmit=&quot;document.charset='GBK';sug.hide()&quot; accept-charset='GBK' target=&quot;_blank&quot;&gt;
		&lt;input class='text' type=text name=wd autocomplete=&quot;off&quot; onkeydown=&quot;pressKey(this,event)&quot; /&gt;
		&lt;input id='sub' type=&quot;submit&quot; value=&quot;搜索&quot; /&gt;
	&lt;/form&gt;
	&lt;div id='suggestion'&gt;
		&lt;a href='javascript:;' onmouseover=&quot;sug.hover(this);&quot; onclick=&quot;sug.select();&quot;&gt;思思&lt;/a&gt;
		&lt;a href='javascript:;' onmouseover=&quot;sug.hover(this);&quot; onclick=&quot;sug.select();&quot;&gt;芊芊&lt;/a&gt;
		&lt;a href='javascript:;' onmouseover=&quot;sug.hover(this);&quot; onclick=&quot;sug.select();&quot;&gt;cssass&lt;/a&gt;
		&lt;a href='javascript:;' onmouseover=&quot;sug.hover(this);&quot; onclick=&quot;sug.select();&quot;&gt;敏敏&lt;/a&gt;
		&lt;a href='javascript:;' onmouseover=&quot;sug.hover(this);&quot; onclick=&quot;sug.select();&quot;&gt;黎黎&lt;/a&gt;
	&lt;/div&gt;
&lt;/div&gt;
suggestion显示之后，使用方向键或鼠标进行选择。
&lt;/body&gt;
&lt;script type='text/javascript'&gt;
var $id=function(o){
	return document.getElementById(o) || o;
}
var pressKey=function(o,e){
	var e = e ? e : window.event;
	var k = e.keyCode;
	switch(k){
		case 9 :  //tab键
		case 13 : return false; //回车键
		default : sug.show(o,k); break;
	}
}
var sug={
	show:function(o,k){
		/* 此时动态读取suggestion数据（略）*/
		document.getElementById('suggestion').style.display='block';
		document.onclick=function(){sug.hide()};
		if (k != 38 &amp;&amp; k != 40 &amp;&amp; k != 39 &amp;&amp; k != 37) { //非方向键
			 sug.i = -1;
		}
		sug.i = sug.i || 0;
		var list = $id('suggestion').getElementsByTagName(&quot;a&quot;);
		var prev = '';
		switch(k){
			case 38:
				sug.clear();
				if (sug.i &lt; 1) {
					sug.i = list.length
				}
				sug.i--;
				list[sug.i].id = &quot;hover&quot;;
				o.value = list[sug.i].innerHTML;
				return false;
			case 40:
				sug.clear();
				if (sug.i == list.length - 1) {
					sug.i = -1
				}
				sug.i++;
				list[sug.i].id = &quot;hover&quot;;
				o.value = list[sug.i].innerHTML;
				return false;
			default : break;
		}
		sug.hover=function(othis){ //鼠标划过
			sug.clear();
			for(i=0;i&lt;list.length;i++){
				if(othis==list[i]){
					sug.i=i;
					list[sug.i].id=&quot;hover&quot;;
					o.value = othis.innerHTML;
					return ;
				}
			}
		}
		sug.clear=function(){
			prev = $id('hover');
			if (prev) prev.id = '';
		}
		sug.select=function(){ //鼠标选中
			document.charset='GBK';
			$id('suggF').submit();
		}
	},
	hide:function(){
		$id('suggestion').style.display='none';
	}
};
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_LEISv8');"/> </div>
</div>


<p>No related posts. From:<a href=\]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2010/734.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>offsetX/Y for Firefox</title>
		<link>http://www.cssass.com/blog/index.php/2010/670.html</link>
		<comments>http://www.cssass.com/blog/index.php/2010/670.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 08:18:08 +0000</pubDate>
		<dc:creator>ONEBOYS</dc:creator>
				<category><![CDATA[DOM]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[浏览器与兼容]]></category>
		<category><![CDATA[offsetLeft]]></category>
		<category><![CDATA[offsetX]]></category>
		<category><![CDATA[兼容firefox]]></category>

		<guid isPermaLink="false">http://www.cssass.com/blog/?p=670</guid>
		<description><![CDATA[现在的相册大多有这个功能，鼠标点在照片的左边，可以跳到上一张，点到右边则跳到下一张。
这就需要一个坐标点的计算：(鼠标相对图片的位置) vs (图片的尺寸/2)。
后一个(图片的尺寸/2)简单，使用obj.offsetWidth/2。
前一个(鼠标相对图片的位置)好像也简单，有个事件属性叫 event.offsetX。
但是很悲剧，firefox并不支持offsetX！
我们要做的就是将offset计算出来，它的值应该等于【鼠标相对窗口左边境的位置(即event.clientX)】减去【图片到窗口左边境的距离】。
莫非后一项（图片到窗口左边境的距离）就是obj.offsetLeft吗？ 
但是又悲剧，obj.offsetLeft并没有这么简单，他是相对于“offsetParent”的距离，即应该是距其上级中定位元素的距离(如果不存在这个元素，则相对于整个页面文档)。
更糟的是：对于ie6,ie7，obj.offsetLeft是相对其直接父级的距离——显然他们没有遵循标准。


&#60;!doctype html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;style&#62;
*{padding:0;margin:0;}
body{padding:50px;}
#a{width:500px;height:500px;background:#ccc;padding:50px;}
#b{width:400px;height:400px;background:#ddd;padding:50px;}
#c{width:300px;height:300px;background:#eee;padding:50px;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;div id='a' style='position:relative;'&#62;
	a
	&#60;div id='b'&#62;
	b
		&#60;div id='c'&#62;&#60;/div&#62;
	&#60;/div&#62;
&#60;/div&#62;
&#60;/body&#62;
&#60;script&#62;
	$id=function(o){return document.getElementById(o) &#124;&#124; o }
	$id('c').innerHTML='c的offsetLeft=' + $id('c').offsetLeft
&#60;/script&#62;
&#60;/html&#62;

 

经过以上分析，我们可以使用以下这个麻烦的办法：从触发元素开始到root节点为止，把各级offsetParent元素的offsetLeft加起来得到【图片到窗口的距离】。
对，排除投机的办法，唯有这样了。参见：Differences in the event object properties/methods(请搜索pageX)（这里你可以注意一下：当元素是定位元素时候，即relative/absolute元素。那私有属性layerX就等于非firefox浏览器下的offsetX——这便是投机的方法，但不失为一个简单的好方法。）
demo:


&#60;!DOCTYPE html&#62;
&#60;html&#62;
&#60;head&#62;
&#60;title&#62;兼容firefox的offsetX&#60;/title&#62;
&#60;style type=&#34;text/css&#34;&#62;
.box{width:300px;height:150px;border:1px solid #ccc;margin:50px;padding:50px;border:3px solid #ccc;font-size:12px;}
.ruler{position:relative;}
&#60;/style&#62;
&#60;/head&#62;
&#60;body&#62;
&#60;div class='box'&#62;
	&#60;img class='ruler' src='http://www.ibm.com/developerworks/cn/linux/l-pixelruler/ruler10.gif' onmousemove='sizer(event)' /&#62;
	&#60;div id='ct'&#62;&#60;/div&#62;
&#60;/div&#62;
&#60;script type='text/javascript'&#62;
var $id=function(id){
	return document.getElementById(id) &#124;&#124; id;
}
function sizer(e){
	var e=window.event &#124;&#124; e,
		posX=(e.offsetX==undefined) ? getOffset(e).offsetX : e.offsetX ;
		$id('ct').innerHTML='offsetX:'+posX + ' &#60;i&#62;(FF不支持，但通过其他方法获取)&#60;/i&#62;'
+'&#60;br /&#62;clientX:' +e.clientX
+'&#60;br /&#62;layerX:' +e.layerX [...]


Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2011/917.html' rel='bookmark' title='Permanent Link: offsetLeft/Top Bug in Firefox'>offsetLeft/Top Bug in Firefox</a></li></ol>]]></description>
			<content:encoded><![CDATA[<p>现在的相册大多有这个功能，鼠标点在照片的左边，可以跳到上一张，点到右边则跳到下一张。<br />
这就需要一个坐标点的计算：(鼠标相对图片的位置) vs (图片的尺寸/2)。<br />
后一个(图片的尺寸/2)简单，使用obj.offsetWidth/2。<br />
前一个(鼠标相对图片的位置)好像也简单，有个事件属性叫 event.offsetX。<br />
但是很悲剧，firefox并不支持offsetX！</p>
<p>我们要做的就是将offset计算出来，它的值应该等于【鼠标相对窗口左边境的位置(即event.clientX)】减去【图片到窗口左边境的距离】。<br />
莫非后一项（图片到窗口左边境的距离）就是obj.offsetLeft吗？ </p>
<p>但是又悲剧，obj.offsetLeft并没有这么简单，他是相对于“offsetParent”的距离，即应该是距其上级中<strong>定位元素</strong>的距离(如果不存在这个元素，则相对于整个页面文档)。<br />
更糟的是：对于ie6,ie7，obj.offsetLeft是相对其<strong>直接父级</strong>的距离——显然他们没有遵循标准。</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_iawSU0" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!doctype html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;style&gt;
*{padding:0;margin:0;}
body{padding:50px;}
#a{width:500px;height:500px;background:#ccc;padding:50px;}
#b{width:400px;height:400px;background:#ddd;padding:50px;}
#c{width:300px;height:300px;background:#eee;padding:50px;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id='a' style='position:relative;'&gt;
	a
	&lt;div id='b'&gt;
	b
		&lt;div id='c'&gt;&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;script&gt;
	$id=function(o){return document.getElementById(o) || o }
	$id('c').innerHTML='c的offsetLeft=' + $id('c').offsetLeft
&lt;/script&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_iawSU0');"/> </div>
</div>
<p>经过以上分析，我们可以使用以下这个麻烦的办法：从触发元素开始到root节点为止，把各级offsetParent元素的offsetLeft加起来得到【图片到窗口的距离】。<br />
对，排除投机的办法，唯有这样了。参见：<a href='http://www.reloco.com.ar/mozilla/compat.html#attachEvent' target='_blank'>Differences in the event object properties/methods(请搜索pageX)</a>（这里你可以注意一下：当元素是定位元素时候，即<strong>relative/absolute元素</strong>。那私有属性<strong>layerX就等于非firefox浏览器下的offsetX</strong>——这便是投机的方法，但不失为一个简单的好方法。）</p>
<p>demo:</p>
<div class="runcode">
<div><span class='areaBox' onmousedown="runcode.resize(this,event);"><textarea name="runcode" class="runcode_text" id="runcode_T5t9zk" onmousedown="(document.all)?(event.cancelBubble = true) : (event.stopPropagation())">
&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;兼容firefox的offsetX&lt;/title&gt;
&lt;style type=&quot;text/css&quot;&gt;
.box{width:300px;height:150px;border:1px solid #ccc;margin:50px;padding:50px;border:3px solid #ccc;font-size:12px;}
.ruler{position:relative;}
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div class='box'&gt;
	&lt;img class='ruler' src='http://www.ibm.com/developerworks/cn/linux/l-pixelruler/ruler10.gif' onmousemove='sizer(event)' /&gt;
	&lt;div id='ct'&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;script type='text/javascript'&gt;
var $id=function(id){
	return document.getElementById(id) || id;
}
function sizer(e){
	var e=window.event || e,
		posX=(e.offsetX==undefined) ? getOffset(e).offsetX : e.offsetX ;
		$id('ct').innerHTML='offsetX:'+posX + ' &lt;i&gt;(FF不支持，但通过其他方法获取)&lt;/i&gt;'
+'&lt;br /&gt;clientX:' +e.clientX
+'&lt;br /&gt;layerX:' +e.layerX + ' &lt;i&gt;(ie,opera不支持)&lt;/i&gt;'
+'&lt;br /&gt;pageX:'+ e.pageX + ' &lt;i&gt;(ie不支持)&lt;/i&gt;'
;
}
function getOffset(e)
{
  var target = e.target;
  if (target.offsetLeft == undefined)
  {
    target = target.parentNode;
  }
  var pageCoord = getPageCoord(target);
  var eventCoord =
  {     //计算鼠标位置（触发元素与窗口的距离）
    x: window.pageXOffset + e.clientX,
    y: window.pageYOffset + e.clientY
  };
  var offset =
  {
    offsetX: eventCoord.x - pageCoord.x,
    offsetY: eventCoord.y - pageCoord.y
  };
  return offset;
}
function getPageCoord(element)    //计算从触发到root间所有元素的offsetLeft值之和。
{
  var coord = {x: 0, y: 0};
  while (element)
  {
    coord.x += element.offsetLeft;
    coord.y += element.offsetTop;
    element = element.offsetParent;
  }
  return coord;
}
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;
</textarea></span></div>
<div><input type="button" value="Run" class="runcode_button" onclick="runcode.open_new('runcode_T5t9zk');"/> </div>
</div>


<p>Related posts:<ol><li><a href='http://www.cssass.com/blog/index.php/2011/917.html' rel='bookmark' title='Permanent Link: offsetLeft/Top Bug in Firefox'>offsetLeft/Top Bug in Firefox</a></li></ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.cssass.com/blog/index.php/2010/670.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

