<?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>西红柿爱番茄 &#187; code</title>
	<atom:link href="http://www.ilovejs.net/archives/tag/code/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ilovejs.net</link>
	<description>到了创造为主的阶段，不忘继续学习</description>
	<lastBuildDate>Thu, 15 Dec 2011 06:18:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>javascript代码性能优化</title>
		<link>http://www.ilovejs.net/archives/878</link>
		<comments>http://www.ilovejs.net/archives/878#comments</comments>
		<pubDate>Fri, 11 Jun 2010 19:35:59 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[性能]]></category>
		<category><![CDATA[闭包]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=878</guid>
		<description><![CDATA[在这篇文章叙述的关于Javascript代码优化，其实并没有什么新意，关于这方面的优化，一直都是Nicholas C. Zakas的专利。我在这里将要说的是对当前众多关于Javascript代码优化的方式一个小总结，并尝试去归类各种不同的优化方式，方便于记忆众说纷纭的优化技巧。本人归类的结果如下图所示： Javascript代码优化无非主要围绕：DOM操作、循环、闭包、对象重复出现、对象的声明方式、作用域链、字符串操作、类的声明方式等等。循环、闭包、对象重复出现是从作用域链的角度去优化的；DOM操作主要围绕HTMLCollection、NodeList等来优化；对象的声明方式主要是对象（Object）、数组（Array）、字符串（String）、函数（Function）、正则（RegExp）等内置的对象使用字面量的方式来声明，这个比使用new来实例化相应的对象在性能上要强很多；字符串操作的优化方式主要是通过数组的push和join方法；类的声明方式优化方式主要是分清属性和方法的声明的方式，方法使用prototype的方式来声明；Javascript语言本身的流程操作语句的优化（if、switch、with、eval等等）。 因此，我将Javascript代码优化主要分为六类：DOM“真空”空间、缩短作用域链、字面量声明方式、字符串操作、类声明方式、流程操作语句。下面将逐个叙述： DOM“真空”空间 DOM“真空”空间这个词或许有些迷惑，举个例子就明白了：当使用removeChild将一个DOM元素从DOM树中删除之后，这个DOM元素并没有彻底消失，它就存在于DOM“真空”空间中，可以通过引用重新调用这个元素，并且对它的操作不会影响DOM文档树。 所以很多对DOM的HTMLCollection、NodeList操作的优化，都是利用了这个“真空”空间，先将元素从DOM树中剥离开来，再对这个元素进行一系列的操作之后，最后再通过appendChild或者insertBefore插入原来位置的DOM树中。这样就使得页面的reflow的次数最小化。比如下面优化的例子： [javascript] /** * Remove an element and provide a function that inserts &#8230; <a href="http://www.ilovejs.net/archives/878" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
在这篇文章叙述的关于Javascript代码优化，其实并没有什么新意，关于这方面的优化，一直都是<a  href="http://www.nczonline.net/">Nicholas C. Zakas</a>的专利。我在这里将要说的是对当前众多关于Javascript代码优化的方式一个小总结，并尝试去归类各种不同的优化方式，方便于记忆众说纷纭的优化技巧。本人归类的结果如下图所示：
</p>
<p>
<img src="http://www.ilovejs.net/wp-content/uploads/2010/06/performance.png" title="performance catagroy" width="652" height="162" />
</p>
<p>
Javascript代码优化无非主要围绕：DOM操作、循环、闭包、对象重复出现、对象的声明方式、作用域链、字符串操作、类的声明方式等等。循环、闭包、对象重复出现是从作用域链的角度去优化的；DOM操作主要围绕HTMLCollection、NodeList等来优化；对象的声明方式主要是对象（Object）、数组（Array）、字符串（String）、函数（Function）、正则（RegExp）等内置的对象使用字面量的方式来声明，这个比使用new来实例化相应的对象在性能上要强很多；字符串操作的优化方式主要是通过数组的push和join方法；类的声明方式优化方式主要是分清属性和方法的声明的方式，方法使用prototype的方式来声明；Javascript语言本身的流程操作语句的优化（if、switch、with、eval等等）。
</p>
<p>
因此，我将Javascript代码优化主要分为六类：<em>DOM“真空”空间</em>、<em>缩短作用域链</em>、<em>字面量声明方式</em>、<em>字符串操作</em>、<em>类声明方式</em>、<em>流程操作语句</em>。下面将逐个叙述：
</p>
<p><span id="more-878"></span></p>
<p><strong>DOM“真空”空间</strong><br />
DOM“真空”空间这个词或许有些迷惑，举个例子就明白了：当使用removeChild将一个DOM元素从DOM树中删除之后，这个DOM元素并没有彻底消失，它就存在于DOM“真空”空间中，可以通过引用重新调用这个元素，并且对它的操作不会影响DOM文档树。
</p>
<p>
所以很多对DOM的HTMLCollection、NodeList操作的优化，都是利用了这个“真空”空间，先将元素从DOM树中剥离开来，再对这个元素进行一系列的操作之后，最后再通过appendChild或者insertBefore插入原来位置的DOM树中。这样就使得页面的reflow的次数最小化。比如下面优化的例子：
</p>
<p>[javascript]<br />
/**<br />
 * Remove an element and provide a function that inserts it into its original position<br />
 * @param element {Element} The element to be temporarily removed<br />
 * @return {Function} A function that inserts the element into its original position<br />
 **/<br />
//removeToInsertLater函数的作用是将element从DOM树中删除，保存于DOM“真空”空间里，同时返回一个闭包函数，用于在对element操作之后将其插回原来的位置。<br />
function removeToInsertLater(element) {<br />
  var parentNode = element.parentNode;<br />
  var nextSibling = element.nextSibling;<br />
  parentNode.removeChild(element);<br />
  return function() {<br />
    if (nextSibling) {<br />
      parentNode.insertBefore(element, nextSibling);<br />
    } else {<br />
      parentNode.appendChild(element);<br />
    }<br />
    nextSibling=null; //因为处于闭包中，需要设置为null，断开作用域链，下同。<br />
    parentNode=null;<br />
  };<br />
}<br />
//接下来我们就可以对element进行一系列的操作，最后插回去<br />
function updateAllAnchors(element, anchorClass) {<br />
  var insertFunction = removeToInsertLater(element);<br />
  var anchors = element.getElementsByTagName(&#8216;a&#8217;);<br />
  for (var i = 0, length = anchors.length; i &lt; length; i ++) {<br />
    anchors[i].className = anchorClass;<br />
  }<br />
  insertFunction();<br />
}<br />
[/javascript]</p>
<p>
如果所示，将需要操作的DOM元素先从DOM树中剥离开来，对其进行操作，再安插回去，减少了页面reflow的次数，还有一种方式是将HTMLCollection、NodeList对象转换成数组的形式来进行操作，这都是不错的优化方式，可以应用在很多类似的优化案例中。当然了，对DOM的操作，DOM本身提供的API方法也都存在性能问题，使用nextSibling比childNodes快多了、使用item比使用普通的索引慢多了、不同的循环的方式对操作HTMLCollection、NodeList也都存在不同的性能：《<a  href="http://www.ilovejs.net/archives/248">雷人的优化HTMLCollection对象的循环操作技巧</a>》，这个将会在下面的循环里叙述。
</p>
<p><strong>缩短作用域链</strong><br />
缩短作用域链，说简单点就是尽量使用局部变量来储存外部的对象。对于在循环中重复出现的对象，这个尤其具有优化效果；对于在闭包函数外的对象，当需要在闭包内使用的时候，可以在闭包内声明一个局部变量来储存该对象；还有对DOM元素的length属性、或者在DOM操作的循环中单个DOM元素使用局部变量来储存，也十分具有优化效果。目的就是使得在数据存取的过程中从作用域链中能最快的取出来，而最快的取出来的前提就是需要对象或者变量在作用域链的顶部。经过测试表明：局部变量的存取速度是最快的。所以将作用域外的对象局部引用化，也是不错的优化方式。循环也算是缩短作用域链的一个方面，但是某些方面也不全是，这个跟循环内部的比较和判断有关，具体请浏览《<a  href="http://www.ilovejs.net/archives/180">对循环操作的几种优化</a>》。下面举几个例子：
</p>
<p>[javascript]<br />
//例子一：将NodeList的length属性缓存起来，这样就可以避免每次重新计算length属性，重新查询一遍DOM树。<br />
var d = document.getElementsByTagName(&quot;div&quot;);<br />
for(var i=0, l = d.length; i&lt;l; i++){<br />
   //code here&#8230;<br />
}<br />
//=====================================<br />
//例子二：将每一个DOM元素局部化，因为对每一个DOM元素的操作，都需要在NodeList中去查询这个DOM元素。<br />
var d = document.getElementsByTagName(&quot;div&quot;);<br />
for(var i=0, l = d.length; i&lt;l; i++){<br />
   var item = d[i];<br />
   item.className=&quot;active&quot;;<br />
   item.title = &quot;active item&quot;;<br />
   //&#8230;&#8230;<br />
}<br />
//=====================================<br />
//例子三：储存重复出现的对象或者方法，特别是在循环中。将document.body缓存起来，这样在循环里读取的速度就非常快了。<br />
var b = document.body;<br />
for(var i=0;i&lt;10;i++){<br />
  b.appendChild(document.createTextNode(&quot;some text&quot;));<br />
}<br />
//=====================================<br />
//例子四：对闭包外的对象或者变量在闭包内局部化。<br />
//msg在setTimeout闭包参数的作用域外<br />
function setupAlertTimeout() {<br />
  var msg = &#8216;Message to alert&#8217;;<br />
  window.setTimeout(function() { alert(msg); }, 100);<br />
}<br />
//下面这个更快，将变量声明放到闭包内，使得读取速度更快。<br />
function setupAlertTimeout() {<br />
  window.setTimeout(function() {<br />
    var msg = &#8216;Message to alert&#8217;;<br />
    alert(msg);<br />
  }, 100);<br />
}<br />
//再来个更快的，这下避免使用闭包来作为setTimeout的参数，使得程序运行更快。<br />
function alertMsg() {<br />
  var msg = &#8216;Message to alert&#8217;;<br />
  alert(msg);<br />
}<br />
function setupAlertTimeout() {<br />
  window.setTimeout(alertMsg, 100);<br />
}<br />
[/javascript]</p>
<p>
对于上面例子四中关于闭包的使用，在这里解释一下：闭包非常强大而且使用，但是它也有很多缺陷，比如：是造成很多内存泄漏的罪魁祸首；声明一个闭包比声明一个不是闭包的内部函数更慢，比声明一个静态函数就更慢了。因此得出了上面的结论。
</p>
<p>
还有，对于缩短作用域链的一个更直白的解释例子如下：
</p>
<p>[javascript]<br />
var a = &#8216;a&#8217;;<br />
function createFunctionWithClosure() {<br />
  var b = &#8216;b&#8217;;<br />
  return function () {<br />
    var c = &#8216;c&#8217;;<br />
    a;<br />
    b;<br />
    c;<br />
  };<br />
}<br />
var f = createFunctionWithClosure();<br />
f();<br />
[/javascript]</p>
<p>
如上所示：当函数f调用的时候，读取a比读取b慢，比读取c又更慢。这就是作用域链的存取速度导致的性能问题，在HTMLCollection、NodeList中更甚。
</p>
<p><strong>字面量声明方式</strong><br />
这个字面量的声明方式的优化方式比较简单易懂，就是使用Javascript这门语言所独有的可以使用字面量的形式来声明对象的特点，这些比使用new来实例化响应的内置的对象将消耗更多的性能和时间，而且也不够灵活。比如下面的声明方式：
</p>
<p>[javascript]<br />
var obj = {};<br />
var obj2 = {<br />
        &quot;name&quot;:&quot;supersha&quot;<br />
}<br />
var arr = [];<br />
var arr2 = [1,2];<br />
var reg = /abc/gi;<br />
var fn = function(){<br />
  alert(&quot;传说中的Hello world&quot;);<br />
}<br />
[/javascript]</p>
<p><strong>字符串操作</strong><br />
字符串中的优化已经算是不值得多说了，主要使用数组的push、join方法来时优化。现在来说说使用传统的“+”或者“+=”运算符为啥低效：当使用“+”或者“+=”运算符的时候，内存中先会创建一个变量副本来储存这个连接的结果，之后把结果赋值给“=”号左边的变量或者对象属性，最后销毁这个变量副本，当在循环中通过“+”或者“+=”来连接字符串的时候，就不得不忍受副本变量的创建、赋值、销毁这一连串的操作，如果需要连接的两个字符串比较大的时候，就更难以忍受了。所以，对它的优化，就被无可奈何的提出来了。举个例子：
</p>
<p>[javascript]<br />
//例子一：<br />
var veryLongMessage = [<br />
'This is a long string that due to our strict line length limit of',<br />
' characters per line must be wrapped. ',<br />
'% of engineers dislike this rule. The line length limit is for ',<br />
' style purposes, but we do not want it to have a performance impact.',<br />
' So the question is how should we do the wrapping?'<br />
].join();<br />
//=====================================<br />
//例子二：<br />
var strBuilder = ['First 20 fibonacci numbers:'];<br />
for (var i = 0; i &lt; 20; i++) {<br />
  strBuilder.push(i, &#8216; = &#8216;, fibonacci(i));<br />
}<br />
var fibonacciStr = strBuilder.join(”);<br />
[/javascript]</p>
<p><strong>类声明方式</strong><br />
类声明方式的优化，主要是利用了prototype原型链的优点，使得类在实例化的时候不需要给每一个实例都声明相同名称的方法或者属性，而是通过prototype原型链来声明方法或者属性，使得每一个类的实例都从原型链共享这个方法或者属性（有些不知道怎么表达，暂且这样吧）。比如下面的例子：
</p>
<p>[javascript]<br />
//下面声明类的方式比较糟糕<br />
var Car = function(color,model,owner){<br />
  this.color=color;<br />
  this.model=model;<br />
  this.owner=owner;<br />
  this.setColor=function(c){<br />
    this.color=c;<br />
  }<br />
  //&#8230;.<br />
}<br />
//改进一下下，好多了……<br />
var Car = function(color,model,owner){<br />
  this.color=color;<br />
  this.model=model;<br />
  this.owner=owner;<br />
}<br />
Car.prototype.setColor=function(c){<br />
  this.color=c;<br />
}<br />
[/javascript]</p>
<p>
<strong>流程操作语句</strong><br />
这里所说的流程操作语句主要是if、switch、do while、while、for、try catch，也有with、eval等等。if语句和switch语句之间的衡量是经常会碰到的优化问题：《<a  href="http://www.ilovejs.net/archives/577">对Duff策略优化数组操作的疑虑</a>》；循环的优化在上面已经叙述过了；我相信很多叙述有关Javascript性能的文章都建议避免使用with、eval，甚至是try catch语句，因为catch语句会增加作用域链的深度，造成数据读取速度下降的性能问题，更多的细节可以阅读《<a  href="http://www.ilovejs.net/archives/509">高性能网站建设进阶指南</a>》和<a  href="http://www.nczonline.net/">Nicholas C.Zakas</a>著的《<a  href="http://www.amazon.com/Performance-JavaScript-Faster-Application-Interfaces/dp/059680279X">High Performance JavaScript</a>》中更详细的叙述。
</p>
<p>
<strong>总结：</strong>上面例举了Javascript代码优化的五个基本类别的方式。当然了，Javascript代码优化还远不止上面例子中出现的情况，大到设计模式、Ajax应用，小到还有对if、switch、with、eval等等的优化等等，无处不存在着代码性能优化这些细节问题，但是细化下来，也基本在上面五个类别里了。案例是丰富多彩的，但是本质不变。目的只有一个：<strong>让你的代码跑的更快</strong>。
</p>
<p>
延伸阅读：《<a  href="http://blogs.msdn.com/b/ie/archive/2006/08/28/728654.aspx">IE + JavaScript Performance Recommendations &#8211; Part 1</a>》，《<a  href="http://blogs.msdn.com/b/ie/archive/2006/11/16/ie-javascript-performance-recommendations-part-2-javascript-code-inefficiencies.aspx">IE+JavaScript Performance Recommendations Part 2: JavaScript Code Inefficiencies</a>》，《<a  href="http://blogs.msdn.com/b/ie/archive/2007/01/04/ie-jscript-performance-recommendations-part-3-javascript-code-inefficiencies.aspx">IE+JScript Performance Recommendations Part 3: JavaScript Code Inefficiencies</a>》，《<a  href="http://code.google.com/speed/articles/optimizing-javascript.html">Optimizing JavaScript code</a>》，《<a  href="http://code.google.com/speed/articles/javascript-dom.html">Speeding up JavaScript: Working with the DOM</a>》</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/878/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>javascript精巧编写方式</title>
		<link>http://www.ilovejs.net/archives/334</link>
		<comments>http://www.ilovejs.net/archives/334#comments</comments>
		<pubDate>Fri, 19 Mar 2010 15:14:55 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[code]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=334</guid>
		<description><![CDATA[//////////////// 2010-05-25 updates ////////////// [javascript] var getPointerPosition=function(evt){ evt = evt &#124;&#124; window.event; return { x:evt.pageX &#124;&#124; evt.clientX+(document.documentElement.scrollLeft &#124;&#124; document.body.scrollLeft), y:evt.pageY &#8230; <a href="http://www.ilovejs.net/archives/334" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
//////////////// 2010-05-25 updates //////////////
</p>
<p>[javascript]<br />
var getPointerPosition=function(evt){<br />
  evt = evt || window.event;<br />
  return {<br />
    x:evt.pageX || evt.clientX+(document.documentElement.scrollLeft || document.body.scrollLeft),<br />
	y:evt.pageY || evt.clientY+(document.documentElement.scrollTop || document.body.scrollTop)<br />
  }<br />
}</p>
<p>var getKeyPressed=function(evt){<br />
  evt = evt || window.event;<br />
  return {<br />
    &quot;code&quot;:evt.keyCode,<br />
	&quot;value&quot;:String.fromCharCode(evt.keyCode)<br />
  }<br />
}</p>
<p>var getTarget=function(evt){<br />
  evt = evt || window.event;<br />
  var target=evt.target || evt.srcElement;<br />
  return target.nodeType===3 ? target.parentNode : target;<br />
}<br />
[/javascript]</p>
<p>
//////////////// 2010-05-08 updates //////////////
</p>
<p>下面的一个addListener函数通过使用三元运算符和<a  href="http://www.ilovejs.net/archives/126">Lazy Defined Pattern</a>的方式来编写，感觉有些意思，避免了每次调用该函数都需要浏览器嗅探的判断：<br />
[javascript]<br />
   var addListener=function(elem,type,handle){<br />
     addListener= elem.addEventListener ? function(elem,type,handle){<br />
	    elem.addEventListener(type,handle,false);<br />
	 } : (elem.attachEvent ? function(elem,type,handle){<br />
	    elem.attachEvent(&quot;on&quot;+type,handle);<br />
	 } : function(elem,type,handle){<br />
	    elem[&quot;on&quot;+type]=handle;<br />
     });<br />
	 addListener(elem,type,handle);<br />
   }<br />
[/javascript]<br />
//////////////// 2010-03-25 updates //////////////<br />
[javascript]<br />
//摘自Mootools release-1.1.1 版本库<br />
function $merge(){<br />
        var mix = {};<br />
        for (var i = 0; i &lt; arguments.length; i++){<br />
                for (var property in arguments[i]){<br />
                        var ap = arguments[i][property];<br />
                        var mp = mix[property];<br />
                        if (mp &amp;&amp; $type(ap) == &#8216;object&#8217; &amp;&amp; $type(mp) == &#8216;object&#8217;) mix[property] = $merge(mp, ap); //递归<br />
                        else mix[property] = ap;<br />
                }<br />
        }<br />
        return mix;<br />
};<br />
//Usage:var mergedObj = $merge(obj1, obj2, obj3);<br />
///////</p>
<p>//不错的自执行函数编写方式<br />
(function(calc) {<br />
	if (ie) {<br />
		core.pageX = function(event) {<br />
			return event.clientX + calc(&#8216;Left&#8217;);<br />
		};<br />
		core.pageY = function(event) {<br />
			return event.clientY + calc(&#8216;Top&#8217;);<br />
		};<br />
	}<br />
	else {<br />
		core.pageX = function(event) {<br />
			return event.pageX;<br />
		};<br />
		core.pageY = function(event) {<br />
			return event.pageY;<br />
		};<br />
	}<br />
})(function (side) {<br />
	return (element['scroll' + side] || 0) &#8211; (element['client' + side] || 0);<br />
});<br />
[/javascript]<br />
//////////////// 2010-03-24 updates //////////////<br />
[javascript]<br />
//Javascript中labeled语句的实例，有助于归类代码，划分代码类型。<br />
//Source：http://james.padolsey.com/javascript/labelled-blocks-useful/<br />
var getJSONP = function(url, success){<br />
   declareVars: {<br />
      var ud = &quot;_&quot; + new Date(),<br />
	      script = document.createElement(&quot;script&quot;),<br />
		  head = document.head || document.getElementsByTagName(&quot;head&quot;)[0] || document.documentElement;</p>
<p>   }<br />
   defineCallback: {<br />
      window[ud] = function(data){<br />
         head.removeChild(script);<br />
         delete window[ud];<br />
         success &amp;&amp; success(data);<br />
      }<br />
   }<br />
   addScriptToDocument: {<br />
      script.src = url.replace(/callback=.*/, &#8216;callback=&#8217; + ud);<br />
      head.appendChild(script);<br />
   }<br />
}<br />
//Usage：<br />
getJSONP(&quot;http://www.ilovejs.net/lab/measure/measure-person-v2.js?callback=&quot;, function(d){<br />
   alert(&quot;success&quot;);<br />
});<br />
[/javascript]<br />
//////////////// 2010-03-22 updates //////////////<br />
[javascript]<br />
优化循环：<br />
function getElementsByClassName(className,node,tag){<br />
  var results=node.getElementsByTagName(tag);<br />
  var elements=[],length=results.length,classElements=[];<br />
  //将NodeList里的DOM元素保存到数组里<br />
  while(length&#8211;) elements[length]=results[length];<br />
  var pattern = new RegExp(&quot;(^|\\s)&quot; + className + &quot;(\\s|$)&quot;);<br />
  for(var i=0,l=elements.length;i&lt;l;i++){<br />
     if(pattern.test(elements[i].className)){<br />
        classElements.push(elements[i]);<br />
     }<br />
  }<br />
  return classElements;<br />
} </p>
<p>优化遍历childNodes：nextSibling() better that childNodes[].<br />
function loopChildren(elem){<br />
   var node = elem.firstChild;<br />
   while(node != null){<br />
      node=node.nextSibling;<br />
   }<br />
}<br />
/////worse:not recommended.<br />
function loopChildren(elem){<br />
   var nodes=elem.childNodes();<br />
   var length=nodes.length;<br />
   for(var i=0;i&lt;length;i++){<br />
      var node=nodes[i]; // bad<br />
      &#8230;<br />
   }<br />
}<br />
[/javascript]<br />
俺非常喜欢Javascript一些另类的编写方式，也喜欢捣鼓捣鼓，在看一些js库源码的时候，当看到一些出乎意料的编写方式的时候，亦都兴奋不已，不得不佩服：他妈太有才了！！重在思维！！！下面是俺收集和原创的一些捣鼓代码，会陆续更新：<br />
[javascript]<br />
document.getElementsByTagName(&#8216;body&#8217;)[0].appendChild((function(){<br />
   var s = document.createElement(&#8216;script&#8217;);<br />
   s.type = &#8216;text/javascript&#8217;;<br />
   s.src = API + encodeURIComponent(tinypath) + &#8216;&amp;callback=FireworkDisplay.updateTinyUrl&#8217;;<br />
   return s;<br />
})());</p>
<p>///////////////////////////////////////////////////</p>
<p>var typeOf = (function(){<br />
    var toString = Object.prototype.toString;<br />
    return function(a,b) {<br />
         return toString.call(a).match(/\s(.+)\]/)[1].toLowerCase() === b;<br />
    };<br />
})();</p>
<p>///////////////////////////////////////////////////</p>
<p>var setHTML=function(id,html){<br />
    (function(i){<br />
         return typeof i === &quot;string&quot; ? document.getElementById(i) : i;<br />
    )(id).innerHTML=html;<br />
    return arguments.callee;<br />
}<br />
//setHTML(&quot;div&quot;,&quot;a&quot;)(&quot;div&quot;,&quot;aa&quot;)(&quot;div&quot;,&quot;aaa&quot;);</p>
<p>///////////////////////////////////////////////////</p>
<p>//同一个函数三种写法：<br />
function a(){<br />
   (arguments[0] || function() { console.log(&quot;it is funny&quot;);})();<br />
}</p>
<p>(function(){<br />
   (arguments[0] || function() { console.log(&quot;it is funny&quot;);})();<br />
}(function(){ console.log(&quot;it is funny&quot;);});</p>
<p>new function(){  //相当于自执行函数<br />
  (arguments[0] || function() { console.log(&quot;it is funny&quot;);})();<br />
}</p>
<p>///////////////////////////////////////////////////</p>
<p>Function.prototype.partial = function(){<br />
    var fn = this, args = Array.prototype.slice.call(arguments);<br />
    return function(){<br />
        var arg = 0;<br />
        for (var i = 0; i &lt; args.length &amp;&amp; arg &lt; arguments.length; i++)<br />
            if (args[i] === undefined)<br />
                args[i] = arguments[arg++];<br />
        return fn.apply(this, args);<br />
    };<br />
};</p>
<p>///////////////////////////////////////////////////</p>
<p>Function.prototype.bind=function(context){<br />
	var that=this;<br />
	return function(){<br />
		return that.apply(context || that,arguments);<br />
	}<br />
}</p>
<p>/////////////////////////////////////////////////////</p>
<p>Function.prototype.method=function(name,fn){<br />
    this.prototype[name]=fn;<br />
    return this;<br />
}</p>
<p>////////////////////////////////////////////////////<br />
//用于优化数组循环的操作，当每个循环需要花费比较多的时间来执行的时候，尤其有用<br />
function chunk(array, process, context){<br />
    var items = array.concat();   //clone the array<br />
    setTimeout(function(){<br />
        var item = items.shift();<br />
        process.call(context, item);</p>
<p>        if (items.length &gt; 0){<br />
            setTimeout(arguments.callee, 100);<br />
        }<br />
    }, 100);<br />
}<br />
[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/334/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Javascript Show Room</title>
		<link>http://www.ilovejs.net/archives/151</link>
		<comments>http://www.ilovejs.net/archives/151#comments</comments>
		<pubDate>Mon, 04 Jan 2010 06:34:58 +0000</pubDate>
		<dc:creator>Supersha</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[show room]]></category>

		<guid isPermaLink="false">http://www.ilovejs.net/?p=151</guid>
		<description><![CDATA[/////////////// 2010-6-26 update ///////////////// 鉴于在添加DOM元素的style行内样式的时候有时候可能需要连续插入几个的需求，使用循环插入的方式可能会造成多次的reflow，故一次性的插入可能会好些，不过下面实现的需求比较单一，不能重复后续添加其他的style的属性值，除非重复设置。看具体需求而定吧： [javascript] var setStyle=function(elem,s){ var styles=[]; if(Object.prototype.toString.call(s) === &#34;[object Object]&#34;){ for(var k in s){ styles.push(k+&#34;:&#34;+s[k]); } &#8230; <a href="http://www.ilovejs.net/archives/151" class="more-link">了解更多</a>]]></description>
			<content:encoded><![CDATA[<p>
/////////////// <em>2010-6-26 update</em> /////////////////
</p>
<p>鉴于在添加DOM元素的style行内样式的时候有时候可能需要连续插入几个的需求，使用循环插入的方式可能会造成多次的reflow，故一次性的插入可能会好些，不过下面实现的需求比较单一，不能重复后续添加其他的style的属性值，除非重复设置。看具体需求而定吧：<br />
[javascript]<br />
var setStyle=function(elem,s){<br />
  var styles=[];<br />
  if(Object.prototype.toString.call(s) === &quot;[object Object]&quot;){<br />
    for(var k in s){<br />
	  styles.push(k+&quot;:&quot;+s[k]);<br />
	}<br />
	s=styles.join(&quot;;&quot;);<br />
  }<br />
  return elem.setAttribute(&quot;style&quot;,s) || (elem.style.cssText=s);<br />
}<br />
[/javascript]</p>
<p>
/////////////// <em>2010-6-20 update</em> /////////////////
</p>
<p>有时候为了实现去除数组重复项的需求，为此写了个小函数，效率也比较可观：<br />
[javascript]<br />
var pureMultilArray=function (arr){<br />
  var o={};<br />
  var a = [];<br />
  for(var i=0,l=arr.length;i &lt; l;i++){<br />
      !(arr[i] in o) &amp;&amp; a.push(arr[i]) &amp;&amp; (o[arr[i]]=&quot;&quot;);<br />
  }<br />
  return a;<br />
}<br />
[/javascript]</p>
<p>
/////////////// <em>2010-5-21 update</em> /////////////////
</p>
<p>
下面的extend函数是从<a  href="http://paularmstrongdesigns.com/projects/basejs/docs/">baseJS</a>库里面摘取的片段，觉得实现方式不错。本人对它进行了一点小修改：
</p>
<p>[javascript]<br />
var extend=function() {<br />
	var argu=arguments;<br />
    function ext(destination, source) {<br />
        for(var property in source) {<br />
            destination[property] = source[property];<br />
        }<br />
    }<br />
    if(argu.length == 2) {<br />
        ext(argu[0], argu[1])<br />
    } else {<br />
        var l = argu.length,i=l-1;<br />
        while(i) { ext(argu[0],argu[i--]);<br />
     }<br />
    }<br />
}<br />
//usage:<br />
extend(obj1,obj2,obj3,obj4); //all extend to obj1<br />
[/javascript]</p>
<p>
/////////////// <em>2010-5-14 update</em> /////////////////
</p>
<p>鉴于我们需要频繁的操作DOM元素的childNodes，所以编写了一个foreachChildNodes函数，参数depth表示需要处理的childNodes的深度，索引从1开始；参数fn是一个函数，带有每一个childNode的DOM元素作为参数，《<a  href="http://www.ilovejs.net/lab/foreachChildNodes.html">测试效果页面</a>》。同时附加上一个foreachAttributes函数作为操作DOM元素的属性：<br />
[javascript]<br />
var foreachChildNodes = function(el, fn, depth){<br />
    var nodes = el.childNodes;<br />
    depth = depth || 1;<br />
    var d = &#8211;depth;<br />
    for (var i = 0, l = nodes.length; i &lt; l; i++) {<br />
        var node = nodes[i];<br />
        if (d &gt; 0 &amp;&amp; node.childNodes.length &gt; 0) {<br />
            foreachChildNodes(node, fn, d);<br />
        }<br />
        if (node.nodeType === 1) {<br />
            fn(node);<br />
        }<br />
    }<br />
}<br />
//Usage:<br />
foreachChildNodes(document.getElementById(&quot;ul&quot;),function(el){<br />
  alert(el.innerHTML);<br />
},2);</p>
<p>var foreachAttributes = function(el, fn){<br />
    var attrs = el.attributes;<br />
    for (var i = 0, l = attrs.length; i &lt; l; i++) {<br />
        var attr = attrs[i];<br />
        fn(attr, attr.nodeValue);<br />
    }<br />
}<br />
[/javascript]</p>
<p>/////////////// <em>2010-3-8 update</em> /////////////////<br />
[javascript]<br />
var LoadJavascript=function(pattern){<br />
   pattern = pattern || &quot;Insert-DOM&quot;;<br />
   var loadPattern={<br />
      &quot;XHR-Eval&quot;:function(url,callback){<br />
	        url = url+&quot;?noCache=&quot;+(new Date()).getTime();<br />
           callback=callback || function(obj){};<br />
	        var xhr=false;<br />
			   if(window.XMLHttpRequest){<br />
			       xhr=new XMLHttpRequest();<br />
			   }else{<br />
			       try{<br />
				        xhr=new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);<br />
				    }catch(e){<br />
					     xhr = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br />
					 }<br />
			   }<br />
			   xhr.open(&quot;GET&quot;,url,true);<br />
			   xhr.onreadystatechange=function(){<br />
			       if(xhr.readyState === 4 &amp;&amp; ( xhr.status === 200 || xhr.status === 304)){<br />
				         eval(xhr.responseText);<br />
						    callback(xhr);<br />
					  }<br />
			   }<br />
xhr.send(null);<br />
	    },<br />
		&quot;XHR-Injection&quot;:function(url,callback){<br />
		      url = url+&quot;?noCache=&quot;+(new Date()).getTime();<br />
           callback=callback || function(obj){};<br />
	        var xhr=false;<br />
			   if(window.XMLHttpRequest){<br />
			       xhr=new XMLHttpRequest();<br />
			   }else{<br />
			       try{<br />
				        xhr=new ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);<br />
				    }catch(e){<br />
					     xhr = new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);<br />
					 }<br />
			   }<br />
			   xhr.open(&quot;GET&quot;,url,true);<br />
			   xhr.onreadystatechange=function(){<br />
			       if(xhr.readyState === 4 &amp;&amp; ( xhr.status === 200 || xhr.status === 304)){<br />
				        var script = document.createElement(&quot;script&quot;);<br />
						   document.getElementsByTagName(&quot;head&quot;)[0].appendChild(script);<br />
						   script.setAttribute(&quot;id&quot;,url.match(/\/(\w+)\.js/)[1]);<br />
						   script.setAttribute(&quot;type&quot;,&quot;text/javascript&quot;);<br />
						   script.text=xhr.responseText;<br />
						   callback(xhr);<br />
					  }<br />
			   }<br />
xhr.send(null);<br />
		},<br />
		&quot;Iframe&quot;:function(){<br />
		    var iframe=document.getElementById(&quot;iframe&quot;);<br />
			  document.body.appendChild(iframe);<br />
			  iframe.setAttribute(&quot;width&quot;,&quot;0&quot;);<br />
			  iframe.setAttribute(&quot;height&quot;,&quot;0&quot;);<br />
			  iframe.setAttribute(&quot;src&quot;,url);<br />
		},<br />
		&quot;Insert-DOM&quot;:function(url,callback){<br />
		    url = url+&quot;?noCache=&quot;+(new Date()).getTime();<br />
         callback=callback || function(obj){};<br />
		    var script=document.createElement(&quot;script&quot;);<br />
			  document.getElementsByTagName(&quot;head&quot;)[0].appendChild(script);<br />
			  script.setAttribute(&quot;id&quot;,url.match(/\/(\w+)\.js/)[1]);<br />
			  script.setAttribute(&quot;type&quot;,&quot;text/javascript&quot;);<br />
			  script.setAttribute(&quot;src&quot;,url);<br />
			  if(script.onreadystatechange){<br />
			     script.onreadystatechange=function(){<br />
				      if(script.status === &quot;loaded&quot; || script.status === &quot;complete&quot;){<br />
					        callback(script);<br />
					    }<br />
				   }<br />
			  }else{<br />
			     script.onload=function(){<br />
				       callback(script);<br />
				   }<br />
			  }<br />
		}<br />
   }<br />
   return loadPattern[pattern];<br />
}</p>
<p>//Usage:<br />
// LoadJavascript(&quot;XHR-Eval&quot;)(&quot;http://www.ilovejs.net/test.js&quot;);<br />
[/javascript]</p>
<p>/////////////// <em>2010-2-27 update</em> /////////////////<br />
[javascript]<br />
var getChildNodesBy = function(elem, method){<br />
    var childs = elem.childNodes;<br />
    var returnChilds = [];<br />
    for (var i = 0, len = childs.length; i &lt; len; i++) {<br />
        var child = childs[i];<br />
        if (method.call(child) &amp;&amp; child.nodeType === 1) {<br />
            returnChilds.push(child);<br />
        }<br />
    }<br />
    return returnChilds;<br />
}<br />
[/javascript]<br />
/////////////// <em>2010-2-26 update</em> /////////////////<br />
[javascript]<br />
var createElementWithName = function(tag, name){<br />
    try {<br />
        return elem = document.createElement(&#8216;&lt;&#8217; + tag + &#8216; name=&quot;&#8217; + name + &#8216;&quot;&gt;&lt;/&#8217; + tag + &#8216;&gt;&#8217;);<br />
    }<br />
    catch (e) {<br />
        elem = document.createElement(tag);<br />
        elem.setAttribute(&quot;name&quot;, name);<br />
    }<br />
    return elem;<br />
}<br />
[/javascript]</p>
<p>
/////////////// <em>2010-2-21 update</em> /////////////////
</p>
<p>[javascript]<br />
//得到一个由参数n指定长度的随机字符串，可以自定义种字符串seek。<br />
var randomString = function(n, seek){<br />
    seek = seek || &quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;<br />
    var rand = &quot;&quot;;<br />
    var l = seek.length;<br />
    for (var i = 0; i &lt; n; i++) {<br />
        rand += seek[Math.floor(Math.random() * l)];<br />
    }<br />
    return rand;<br />
}<br />
[/javascript]</p>
<p>
///////////////////////////////////////////////////////////////////
</p>
<p>
喜欢show和read代码的你是否愿意展示自己平时积累的认为自豪的代码片段呢？来吧，在这里展示一下你的code的特色，比拼一下，狠批一下，臭骂一下，鄙视一下吧，不要吝啬你的代码。
</p>
<p><span id="more-151"></span><br />
本人先入为主，下面是我平时记录的关于Event和Dom操作的一些功能函数，限于时间，就先展示一下这些吧，后续更新……<br />
[javascript]<br />
;(function(global){<br />
    global.LIB = global.LIB || {};<br />
    /*<br />
     * Static method :namespace,it is to make a namspace under the LIB.<br />
     */<br />
    LIB.namespace = function(ns){<br />
        var names = ns &amp;&amp; typeof ns.split === &quot;function&quot; &amp;&amp; ns.split(&quot;.&quot;);<br />
        var current = LIB;<br />
        for (var i = 0, l = names.length; i &lt; l; i++) {<br />
            if (!current[names[i]]) {<br />
                current[names[i]] = {};<br />
            }<br />
            current = current[names[i]];<br />
        }<br />
    }</p>
<p>    /*<br />
     * LIB.util.Event space:it is all about the event method.<br />
     */<br />
    LIB.namespace(&quot;util.Event&quot;);<br />
    var E = LIB.util.Event;<br />
    /*<br />
     * addListener: add Event to a DOM Element.use the Lazy Definition Pattern<br />
     */<br />
    E.addListener = function(el, type, handle){<br />
        E.addListener = (function(){<br />
            if (el.addEventListener) {<br />
                return function(el, type, handle){<br />
                    el.addEventListener(type, handle, false);<br />
                }<br />
            } else if (el.attachEvent) {<br />
                return function(el, type, handle){<br />
                    el.attachEvent(&quot;on&quot; + type, function(e){<br />
                        handle.call(el, e);<br />
                    });<br />
                }<br />
            } else {<br />
                return function(el, type, handle){<br />
                    el[&quot;on&quot; + type] = handle;<br />
                }<br />
            }<br />
        })();<br />
        E.addListener(el, type, handle);<br />
    };<br />
    /*<br />
     * LIB.util.Event.on:it is the same to addListener<br />
     */<br />
    E.on = E.addListener;<br />
    /*<br />
     * removeListener:remove Event from a DOM Element,use the Lazy Definition Pattern<br />
     */<br />
    E.removeListener = function(el, type, handle){<br />
        E.removeListener = (function(){<br />
            if (el.removeEventListener) {<br />
                return function(el, type, handle){<br />
                    el.removeEventListener(type, handle, false);<br />
                }<br />
            } else if (el.detachEvent) {<br />
                return function(el, type, handle){<br />
                    el.detachEvent(&quot;on&quot; + type, handle);<br />
                }<br />
            } else {<br />
                return function(el, type){<br />
                    el[&quot;on&quot; + type] = null;<br />
                }<br />
            }<br />
        })();<br />
        E.removeListener(el, type, handle);<br />
    }<br />
    /*<br />
     * LIB.util.Event.unon:it is the same with removeListener<br />
     */<br />
    E.unon = E.removeListener;<br />
    /*<br />
     * LIB.util.Event.hover:it is similar with jQuery&#8217;s hover method<br />
     */<br />
    E.hover = function(el, h_over, h_out){<br />
        E.on(el, &quot;mouseover&quot;, h_over);<br />
        E.on(el, &quot;mouseout&quot;, h_out);<br />
    }<br />
    /*<br />
     * LIB.util.Event.toggle:Loop to execute the functon&#8217;s params<br />
     */<br />
    E.toggle = function(el){<br />
        var i = 1, a = arguments;<br />
        el[&quot;onclick&quot;] = function(e){<br />
            (a[i++]).call(el, e); //执行从第二个参数开始的函数<br />
            if (i === a.length) { //如果到了参数末尾，重新开始执行<br />
                i = 1;<br />
            }<br />
        }<br />
    }<br />
    /*<br />
     * LIB.util.Event.one: Excute only once.<br />
     */<br />
    E.one = function(el, type, handle){<br />
        el[&quot;on&quot; + type] = function(e){<br />
            handle.call(el, e);<br />
            el[&quot;on&quot; + type] = null;<br />
        }<br />
    }<br />
    /*<br />
     * LIB.util.Event.onDOMReady:execute the code while DOM is able to use once.<br />
     */<br />
    E.onDOMReady = function(fn){<br />
        (function(){<br />
            if (document &amp;&amp; document.getElementsByTagName &amp;&amp; document.getElementById &amp;&amp; document.body) {<br />
                fn();<br />
            } else {<br />
                //利用arguments.callee获取匿名函数的引用，之后在setTimeout定时器里循环执行<br />
                setTimeout(arguments.callee, 20);<br />
            }<br />
        })();<br />
    }<br />
    /*<br />
     * LIB.util.Event.onAvailable:it is similar to YUI&#8217;s onAvailable event.<br />
     * onAvailable(id,fn,scope);<br />
     */<br />
    E.onAvailable = function(id, fn, scope){<br />
        (function(){<br />
            var el = document.getElementById(id);<br />
            if (el == undefined) {<br />
                setTimeout(arguments.callee, 20);<br />
            } else {<br />
                //将要调用的函数的上下文是scope，默认是当前指定id的DOM Element<br />
                fn.call(scope || el);<br />
            }<br />
        })();<br />
    }<br />
    /*<br />
     * LIB.util.Event.onContentReady:it is similar to YUI&#8217;s onContentReady event.<br />
     */<br />
    E.onContentReady = function(id, fn, scope){<br />
        (function(){<br />
            var el = document.getElementById(id);<br />
            if (!(el &amp;&amp; el.nextSibling)) {<br />
                setTimeout(arguments.callee, 20);<br />
            } else {<br />
                fn.call(scope || el);<br />
            }<br />
        })();<br />
    }<br />
    /*<br />
     * LIB.util.Event.preventDefault:prevent the default behavior of a DOM element.<br />
     */<br />
    E.preventDefault = function(ev){<br />
        if (ev &amp;&amp; ev.preventDefault) {<br />
            ev.preventDefault();<br />
        } else {<br />
            window.event.returnValue = false;<br />
        }<br />
        return false;<br />
    }<br />
    /*<br />
     * LIB.util.Event.stopPropagation:stop the event&#8217;s bubble.<br />
     */<br />
    E.stopPropagation = function(ev){<br />
        if (ev &amp;&amp; ev.stopPropagation) {<br />
            ev.stopPropagation();<br />
        } else {<br />
            window.event.cancelBubble = true;<br />
        }<br />
    }<br />
    /*<br />
     * LIB.util.Event.stopEvent:it is similar to YUI&#8217;s stopEvent method.<br />
     */<br />
    E.stopEvent = function(ev){<br />
        E.preventDefault(ev);<br />
        E.stopPropagation(ev);<br />
    }</p>
<p>    ///////////////////////////////////////////////////////<br />
    /*<br />
     * LIB.util.Dom:All about how to operate DOM Element.<br />
     */<br />
    LIB.namespace(&quot;util.Dom&quot;);<br />
    var D = LIB.util.Dom;</p>
<p>    //Get NodeList by tagName<br />
    D.getElementsByTagName = function(tag, parent){<br />
        return (parent || document).getElementsByTagName(tag || &quot;*&quot;);<br />
    }</p>
<p>    //添加对原生getElementsByClassName的支持<br />
    //get NodeList by className<br />
    D.getElementsByClassName = function(classname, tag, parent){<br />
        if (document.getElementsByClassName &amp;&amp; Array.filter) {<br />
            return Array.filter((parent || document).getElementsByClassName(classname), function(el){<br />
                return tag ? el.nodeName.toLowerCase() == tag : true;<br />
            });<br />
        } else {<br />
           var elems = (parent || document).getElementsByTagName(tag),<br />
                reg = new RegExp(&quot;\\b&quot; + classname + &quot;\\b&quot;),<br />
		nodes = [],<br />
		cn=&quot;&quot;;<br />
           for (var i = 0,l=elems.length;i&lt;l;i++) {<br />
	       cn=elems[i].className;<br />
	       if(!cn) continue;<br />
               if (reg.test(cn)) {<br />
                  nodes.push(elems[i]);<br />
              }<br />
          }<br />
          return nodes;<br />
       }<br />
    }<br />
    //Create a new DOM Element<br />
    D.create = function(tag){<br />
        return document.createElement(tag);<br />
    }<br />
    //return DOM Element&#8217;s innerhtml<br />
    D.html = function(el){<br />
        return el.innerHTML;<br />
    }<br />
    //return DOM Element&#8217;s inner text<br />
    D.text = function(el){<br />
        return this.html(el).replace(/&lt;[\/]?[^&gt;]+&gt;/gi,&quot;&quot;);<br />
    }<br />
    //return DOM Element&#8217;s html,include itself<br />
    D.outerHTML = function(el){<br />
        var wrap = D.create(&quot;div&quot;), html;<br />
        wrap.appendChild(el);<br />
        html = wrap.innerHTML;<br />
        wrap = null;<br />
        return html;<br />
    }<br />
    //return the next Element of the current Element;<br />
    D.nextSibling = function(el){<br />
        var next = el.nextSibling;<br />
        while (next.nodeType !== 1) {<br />
            next = next.nextSibling;<br />
        }<br />
        return next;<br />
    }<br />
    //return the previousSibling Element of the current Element<br />
    D.previousSibling = function(el){<br />
        var pre = el.previousSibling;<br />
        while (pre.nodeType !== 1) {<br />
            pre = pre.previousSibling;<br />
        }<br />
        return pre;<br />
    }<br />
    //return the first child of a DOM Element<br />
    D.firstChild = function(el){<br />
        var first;<br />
        while (first.nodeType !== 1) {<br />
            first = first.nextSibling;<br />
        }<br />
        return child;<br />
    }<br />
    //return the last child of a DOM Element<br />
    D.lastChild = function(el){<br />
        var last = el.lastChild;<br />
        while (last.nodeType !== 1) {<br />
            last = last.previousSibling;<br />
        }<br />
        return last;<br />
    }<br />
    //return the DOM Element&#8217;s parentNode<br />
    D.parentNode = function(el){<br />
        return el.parentNode;<br />
    }<br />
    //Weather have a className<br />
    D.hasClass = function(el, classname){<br />
        return new RegExp(&quot;\\b&quot; + classname + &quot;\\b\\s*&quot;, &quot;g&quot;).test(el.className);<br />
    }<br />
    //add a className to a DOM Element<br />
    D.addClass = function(el, classname){<br />
        var c = el.className;<br />
        el.className = c === &quot;&quot; ? classname : c + &quot; &quot; + classname;<br />
    }<br />
    //remove a className from a DOM Element<br />
    D.removeClass = function(el, classname){<br />
        var reg = new RegExp(&quot;\\b&quot; + classname + &quot;\\b\\s*&quot;, &quot;g&quot;);<br />
        el.className = el.className.replace(reg, &quot;&quot;);<br />
    }<br />
    //get DOM Elements&#8217;s reference by id<br />
    //Example: LIB.util.Dom.get(&quot;div&quot;[,&quot;test&quot;..])<br />
    D.get = function(){<br />
        var a = arguments, elems = [];<br />
        for (var i = 0, l = a.length; i &lt; l; i++) {<br />
            var el = a[i];<br />
            if (typeof el === &quot;object&quot;) {<br />
                elems.push(el);<br />
            } else if (typeof el === &quot;string&quot;) {<br />
                elems.push(document.getElementById(el));<br />
            }<br />
        }<br />
        return elems.length === 1 ? elems[0] : elems;<br />
    }<br />
    //get the DOM Element&#8217;s direction children,不算文本节点<br />
    D.getChildren = function(el){<br />
        var childs = el.childNodes, returnChilds = [];<br />
        var current;<br />
        for (var i = 0; current = childs[i++];) {<br />
            //解决FF下空白节点问题<br />
            if (current.nodeType === 1) {<br />
                returnChilds.push(current);<br />
            }<br />
        }<br />
        return returnChilds;<br />
    }<br />
	//setStyle:it is similar to YUI&#8217;s setStyle method<br />
	D.setStyle=function(el,attr,value){<br />
		//将“font-size”这样的形式转化为“fontSize”的形式。<br />
		attr=attr.replace(/-(\w)/,function(m,p){return p.toUpperCase();});<br />
		el.style[attr]=value;<br />
	}<br />
	//getStyle:it is similar to YUI&#8217;s getStyle method<br />
	D.getStyle=function(el,attr){<br />
		attr=attr.replace(/-(\w)/,function(m,p){return p.toUpperCase();});<br />
		return el.style[attr];<br />
	}<br />
})(this);<br />
[/javascript]</p>
<p>
<strong>2010-01-04 18:34:50 更新 code</strong>
</p>
<p>[javascript]<br />
    //getComputedStyle:获取DOM Element的最终样式<br />
    //注意：样式属性的书写格式必须是骆驼型，比如:font-size要写成fontSize<br />
    D.getFinalStyle = function(el, attr){<br />
        if (el.currentStyle) { //IE<br />
            return el.currentStyle[attr];<br />
        } else if (window.getComputedStyle) { //W3C<br />
            return window.getComputedStyle(el, null)[attr];<br />
        } else {<br />
            return el.style[attr];<br />
        }<br />
    }<br />
    //height:get a DOM Element&#8217;s really height,include a element&#8217;s display to ve set &#8216;none&#8217;<br />
    D.height = function(el){<br />
		//首先判断DOM Element是否隐藏<br />
        if (this.getComputedStyle(el, &quot;display&quot;) !== &quot;none&quot;) {<br />
            return el.offsetHeight || el.clientHeight;<br />
        } else {<br />
            //获取隐藏掉的函数的高度，先让它显示，获取到高度之后再隐藏，下同<br />
            el.style.display = &quot;block&quot;;<br />
            var h = el.offsetHeight || el.clientHeight;<br />
            el.style.display = &quot;none&quot;;<br />
            return h;<br />
        }<br />
    }<br />
    //width:get a DOM Element&#8217;s really width,include a element&#8217;s display to ve set &#8216;none&#8217;<br />
    D.width = function(el){<br />
        if (this.getComputedStyle(el, &quot;display&quot;) !== &quot;none&quot;) {<br />
            return el.offsetWidth || el.clientWidth;<br />
        } else {<br />
            el.style.display = &quot;block&quot;;<br />
            var w = el.offsetWidth || el.clientWidth;<br />
            el.style.display = &quot;none&quot;;<br />
            return w;<br />
        }<br />
    }<br />
	//toggleClass:如果DOM Element中有了指定的css类，则删除，反之则添加<br />
	D.toggleClass=function(el,classname){<br />
		if(this.hasClass(el,classname)){<br />
			this.removeClass(el,classname);<br />
		}else{<br />
			this.addClass(el,classname);<br />
		}<br />
	}<br />
[/javascript]</p>
<p>
<strong>2010-01-05 11:22:09 更新 code</strong>
</p>
<p>[javascript]<br />
	//getAttribute:获取DOM Element指定的属性<br />
    D.getAttribute=function(el,attr){<br />
		//使用getAttributeNode方法能直接使用‘class’，‘for’来取得属性值<br />
		return attr === &quot;href&quot; ? el.getAttribute(&quot;href&quot;,2) : el.getAttributeNode(attr).value;<br />
	}<br />
	//setAttribute:设置DOM Element指定的属性<br />
	D.setAttribute=function(el,attr,value){<br />
		attr={&quot;class&quot;:&quot;className&quot;,&quot;for&quot;:&quot;htmlFor&quot;}[attr] || attr;<br />
		try {<br />
			el[attr] = value;<br />
		}catch(e){<br />
			el.setAttribute(attr,value);<br />
		}<br />
	}<br />
	//stringToDOM:将一个HTML形式的字符串或者纯内容的字符串转化为DOM Element‘s reference<br />
	D.stringToDOM=function(str){<br />
		if(typeof str === &quot;object&quot;) return;<br />
		var div=this.create(&quot;div&quot;),elems=[];<br />
		div.innerHTML=str;<br />
		try{<br />
			var node=div.firstChild;<br />
			while(node){<br />
				elems.push(node);<br />
				node=node.nextSibling;<br />
			}<br />
			return elems.length === 1 ? elems[0] : elems;<br />
		}finally{<br />
			div=null;<br />
		}<br />
	}<br />
	//insertAfter:将一个DOM Element插入到另外一个DOM Element的后面<br />
	D.insertAfter=function(newNode,refNode){<br />
		var next=this.nextSibling(refNode);<br />
		if(next){<br />
			refNode.parentNode.insertBefore(newNode,next);<br />
		}else{<br />
			refNode.parentNode.appendChild(newNode);<br />
		}<br />
		return newNode;<br />
	}<br />
	//prepend:将一个DOM Element插入到某个DOM Element的前面<br />
	D.prepend=function(newNode,parent){<br />
		var first=parent.firstChild;<br />
		if(first){<br />
			parent.insertBefore(newNode,first);<br />
		}else{<br />
			parent.appendChild(newNode);<br />
		}<br />
	}<br />
[/javascript]</p>
<p>
<strong>2010-01-05 14:03:22 更新 code</strong>
</p>
<p>[javascript]<br />
	//wrap:将一个DOM Element被包含于另外一个DOM Element<br />
	//引入的wrap可以是一个HTML字符串，也可以是一个DOM Element&#8217;s reference.<br />
	//如果是HTML字符串的话，建议是从一个父元素开始，eg：&quot;&lt;div class=&#8217;test&#8217;&gt;&lt;/div&gt;&quot; 等等<br />
	D.wrap=function(node,wrapNode){<br />
		if(typeof wrapNode === &quot;string&quot;){<br />
			wrapNode=this.stringToDOM(wrapNode);<br />
			node.parentNode.insertBefore(wrapNode,node);<br />
			wrapNode.appendChild(node);<br />
		}else{<br />
			wrapNode.appendChild(node);<br />
		}<br />
		return wrapNode;<br />
	}<br />
[/javascript]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ilovejs.net/archives/151/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

