jQuery性能优化11条(三)
(2011-12-23 14:38:17)
标签:
jquery性能优化it |
分类: jquery那些事 |
6、限制直接对DOM操作
DOM操作的基本做法是在内存中创建DOM结构,然后再更新DOM结构。这不是jQuery最好的做法,但对JavaScript来讲是高效的。直接操作DOM结构性能是低下的。
-
var
top_100_list //= [...], assume this has 100 unique strings -
$mylist
= $('#mylist'); // jQuery selects our <ul> element -
for
( vari=0, l=top_100_list.length; i<l; i++){ -
$mylist.append('<li>' + '</li>');top_100_list[i] + -
}
取而代之,我们希望在插入DOM结构之前先在一个字符串里创建一套元素。
代码
-
var
top_100_list //= [...], assume this has 100 unique strings -
$mylist
= $('#mylist'), // jQuery selects our <ul> element -
top_100_li
= ""; // This will store our list items -
for
( vari=0, l=top_100_list.length; i<l; i++){ -
top_100_li += '<li>' + '</li>';top_100_list[i] + -
}
-
$mylist.html(top_100_li);
更快的做法,在插入DOM结构之前我们应该总是在一个父节点里包含许多元素
-
var
top_100_list //= [...], assume this has 100 unique strings -
$mylist
= $('#mylist'), // jQuery selects our <ul> element -
top_100_ul
= '<ul id="#mylist">' ;// This will store our entire unordered list -
for
( vari=0, l=top_100_list.length; i<l; i++){ -
top_100_ul += '<li>' + '</li>';top_100_list[i] + -
}
-
top_100_ul
+= '</ul>'; // Close our unordered list -
$mylist.replaceWith(top_100_ul);
如是你照着上面的做了还是对性能有些迷惑的话,可以参考以下内容:
*
*
7
除非特别说明,每一个JavaScript事件(如click, mouseover
-
$('#myList
li).bind(' click',function(){ -
$(this).addClass('clicked'); //do stuff -
});
反而,我们应该在父级侦听click事件。
-
$('#myList).bind('click',
function(e){ -
var target //= e.target, e.target grabs the node that triggered the event. -
$target = $(target); // wraps the node in a jQuery object -
if (target.nodeName 'LI')=== { -
$target.addClass('clicked'); //do stuff -
} -
});
父节点担当着发报机的工作,可以在触发了事件的目标element上做一些工作。如果你发现自己把一个event listener绑定到很多个element上,那么你这种做法是不正确的。
8、消除查询浪费
虽然jQuery对没有找到任何匹配的elements处理的很好,但是它还是需要花费时间去查找的。如果你的站点有一个全局的JavaScript,你可能会把每个jQuery function都放在
<script
type="text/javascript>mylib.article.init();</script></body>如果你的页面模板包含多种有可能在页面或者不在页面上的模块,或者为了可视化效果你需要它们稍后再初始化,你应该在这些模块之后立即放置初始化函数。
-
<ul
id="traffic_light"> -
<li><input type="radio" class="on" name="light" value="red" /> Red </li> -
<li><input type="radio" class="off" name="light" value="yellow" /> Yellow </li> -
<li><input type="radio" class="off" name="light" value="green" /> Green </li> -
</ul>
-
<mce:script
type="text/javascript><!-- -
mylib.traffic_light.init();
-
//
--></mce:script>
你的全局JavaScript库看起来应该是这样的:
-
var
mylib ={ -
article_page : { -
init : function() { -
// Article page specific jQuery functions. -
} -
}, -
traffic_light : { -
init : function() { -
// Traffic light specific jQuery functions. -
} -
} -
}
9、遵从$(windows).load
有一种诱惑会使jQuery开发者hook所有事情到
-
$(window).load(function(){
-
// jQuery functions to initialize after the page has loaded. -
});
多余的功能,如拖拽、帮定可视化效果和动画、预读取图片等,使用这种方法比较好。
10
虽然和jQuery无关,但在这里也要提一下。使JavaScript函数和变量变得可读是一个趋势,这对开发者来讲是必不可少的,但对普通用户来
11
学习和最有效的使用jQuery,最好的方法就是去查jQuery的文档(http://api.jquery.com/)了,可以当作手册来用。
[原文出处:http://blog.csdn.net/alex197963/archive/2010/09/09/5873066.aspx]

加载中…