JQuery Tips(4) 一些關(guān)于提高JQuery性能的Tips
更新時(shí)間:2009年12月19日 01:48:23 作者:
如今咱祖國(guó)已經(jīng)崛起了..電腦的配置也是直線上升.可是js的性能問(wèn)題依然不可小覷..尤其在萬(wàn)惡的IE中..js引擎速度本來(lái)就慢..如果JS如果再寫不好,客戶端多開幾個(gè)窗口假死肯定是家常便飯了.廢話不說(shuō)了,下面說(shuō)說(shuō)js性能提升的一些小Tips.
在選擇時(shí),最好以ID選擇符作為開頭
我想這個(gè)很好理解,因?yàn)镴Query內(nèi)部使用document.getElementByID方法進(jìn)行ID選擇,這種方法比其他所有對(duì)DOM選擇的方法更快,所以以$("#")開頭是最好的,比如:
<div id="a">
<div class="b">
<div class="c">
<div class="d"></div>
</div>
</div>
</div>
<script type="text/javascript">
$(".b .c .d")//slow one
$("#a .b .c .d")//fast one
</script>
提供$()的上下文
在使用$()選擇頁(yè)面元素時(shí),提供選擇的范圍可以減少選擇的時(shí)間,換句話說(shuō),讓選擇器只在頁(yè)面的一小片范圍內(nèi)篩選而不是整個(gè)頁(yè)面當(dāng)然會(huì)減少篩選時(shí)間,通過(guò)在$()函數(shù)內(nèi)提供第二個(gè)參數(shù)作為上下文可以實(shí)現(xiàn)這一點(diǎn)
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
alert($(".inner", document.getElementById("test")).text());//increase the speed by provide context
alert($(".inner").text());//traverse all the element so that is slower than above
</script>
當(dāng)然,在jquery定義(或者js函數(shù))事件內(nèi),可以通過(guò)this來(lái)指代上下文:
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
$("#test").click(function() {
var text = $(".inner", this).text(); //this means $("#test")
alert(text);//alert hi
});
</script>
當(dāng)然,上面的例子也可以寫成下面兩種方式:
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
alert($("#test .inner").text()); //method 1
alert($("#test").find(".inner").text());//method 2 and it was best one
</script>
其中利用find方法是所有方法中效率最高的
當(dāng)然,如果你是通過(guò)id選擇符,也就是$("#..")來(lái)選擇,不需要提供上下文參數(shù).這對(duì)速度沒(méi)有影響
將經(jīng)常用的JQuery包裝好的元素進(jìn)行保存
如題,這點(diǎn)比較重要,因?yàn)槭褂?()對(duì)頁(yè)面元素進(jìn)行選擇是需要耗費(fèi)時(shí)間的.而保存為變量進(jìn)行使用時(shí),可以避免這種浪費(fèi),比如:
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
</ul>
<script type="text/javascript">
for (i = 0; i < $("ul li").length; i++) {//very bad,select $("ul li") so many times,waste a lot of time
alert($("ul li")[i].innerHTML);//same here,very bad
}
var $li = $("ul li");
for (i = 0; i < $li.length; i++) {//good one,only selct $("ul li") once
alert($li[i].innerHTML); //same here,good
}
</script>
從代碼可以看到,避免多次重復(fù)選擇可以提高性能:-)
盡量少用選擇符
JQuery的選擇器是面向數(shù)組的,所以在條件允許的情況下盡量少用選擇器,比如:
<div id="Div0"></div>
<div id="Div1"></div>
<div id="Div2"></div>
<script type="text/javascript">
$("#Div0").slideDown("slow");
$("#Div1").slideDown("slow");
$("#Div2").slideDown("slow");//slow
$("Div0,Div1,Div2").slideDown("slow");//fast
</script>
可以看出,使用選擇器并用逗號(hào)將被選擇的元素分開,并選擇多個(gè)元素不僅讓代碼更加簡(jiǎn)潔,并且通過(guò)減少創(chuàng)建JQuery的實(shí)例所以在性能上也稍勝一籌!
在循環(huán)次數(shù)很多時(shí)避免使用$().each,而使用for循環(huán)
使用$().each方法讓在進(jìn)行循環(huán)時(shí),會(huì)讓編程更加輕松,少量的循環(huán)在使用$().each時(shí)對(duì)性能的影響可以忽略不計(jì),但是當(dāng)這個(gè)數(shù)字很大的時(shí)候,對(duì)性能的影響便開始變得可觀了.
這個(gè)數(shù)字,我查了下資料,據(jù)說(shuō)是1000以下可以使用$().each方法,而這個(gè)數(shù)字如果繼續(xù)增加,則應(yīng)該使用for循環(huán)語(yǔ)句。
盡量減少對(duì)DOM的操作
在頁(yè)面中對(duì)DOM操作是比較消耗的(比如在頁(yè)面插入或刪除一段文字),把這個(gè)改動(dòng)降至最小是保持性能的最佳實(shí)踐!比如:
<ul id="test">
</ul>
<script type="text/javascript">
var $list = $("#test");
for (i = 1; i < 101; i++) {
$list.append("<li>Item" + i + "</li>");
} //very bad,change dom 100 times
var listItem = "";
for (j = 1; j < 101; j++) {
listItem += "<li>Item" + j + "</li>";
}
$list.html(listItem);
//good practice,only modify dom once
</script>
可以看出,第一個(gè)例子對(duì)DOM修改100次,而第二個(gè)只對(duì)DOM修改1次,這上面的性能差距是顯而易見的。
可以屏蔽JQuery的動(dòng)畫效果
在某些情況下,如果,可以關(guān)閉JQuery動(dòng)畫,能對(duì)性能進(jìn)行一定提升,屏蔽的方法是:
<script type="text/javascript">
jQuery.fx.off = true;
</script>
如果參數(shù)可以是JS對(duì)象,盡量使用對(duì)象
很對(duì)JQuery插件,或者JQuery的css和attr方法都接受鍵/值 或 js鍵/值對(duì)象 對(duì)作為參數(shù),傳遞鍵值對(duì)象可以減少JQuery對(duì)象的創(chuàng)建,比如:
<div></div>
<script type="text/javascript">
$("div").css("display", "block");
$("div").css("background-color", "blue")
//slow,because it create more Jquery object
$("div").css({ "display": "block", "background-color": "blue" });
//fast,only create one object
</script>
當(dāng)然也可以使用連綴的方式:
<div></div>
<script type="text/javascript">
$("div").css("display", "block").css("background-color", "blue");
</script>
但是這種方式的性能不如上面那種.需要使用兩個(gè)方法,并且需要多生成臨時(shí)對(duì)象.
以上都是一些對(duì)JQuery性能提升的小Tips
我想這個(gè)很好理解,因?yàn)镴Query內(nèi)部使用document.getElementByID方法進(jìn)行ID選擇,這種方法比其他所有對(duì)DOM選擇的方法更快,所以以$("#")開頭是最好的,比如:
復(fù)制代碼 代碼如下:
<div id="a">
<div class="b">
<div class="c">
<div class="d"></div>
</div>
</div>
</div>
<script type="text/javascript">
$(".b .c .d")//slow one
$("#a .b .c .d")//fast one
</script>
提供$()的上下文
在使用$()選擇頁(yè)面元素時(shí),提供選擇的范圍可以減少選擇的時(shí)間,換句話說(shuō),讓選擇器只在頁(yè)面的一小片范圍內(nèi)篩選而不是整個(gè)頁(yè)面當(dāng)然會(huì)減少篩選時(shí)間,通過(guò)在$()函數(shù)內(nèi)提供第二個(gè)參數(shù)作為上下文可以實(shí)現(xiàn)這一點(diǎn)
復(fù)制代碼 代碼如下:
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
alert($(".inner", document.getElementById("test")).text());//increase the speed by provide context
alert($(".inner").text());//traverse all the element so that is slower than above
</script>
當(dāng)然,在jquery定義(或者js函數(shù))事件內(nèi),可以通過(guò)this來(lái)指代上下文:
復(fù)制代碼 代碼如下:
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
$("#test").click(function() {
var text = $(".inner", this).text(); //this means $("#test")
alert(text);//alert hi
});
</script>
當(dāng)然,上面的例子也可以寫成下面兩種方式:
復(fù)制代碼 代碼如下:
<div id="test">
<div class="inner">hi</div>
</div>
<script type="text/javascript">
alert($("#test .inner").text()); //method 1
alert($("#test").find(".inner").text());//method 2 and it was best one
</script>
其中利用find方法是所有方法中效率最高的
當(dāng)然,如果你是通過(guò)id選擇符,也就是$("#..")來(lái)選擇,不需要提供上下文參數(shù).這對(duì)速度沒(méi)有影響
將經(jīng)常用的JQuery包裝好的元素進(jìn)行保存
如題,這點(diǎn)比較重要,因?yàn)槭褂?()對(duì)頁(yè)面元素進(jìn)行選擇是需要耗費(fèi)時(shí)間的.而保存為變量進(jìn)行使用時(shí),可以避免這種浪費(fèi),比如:
復(fù)制代碼 代碼如下:
<ul>
<li>one</li>
<li>two</li>
<li>three</li>
<li>four</li>
<li>five</li>
</ul>
<script type="text/javascript">
for (i = 0; i < $("ul li").length; i++) {//very bad,select $("ul li") so many times,waste a lot of time
alert($("ul li")[i].innerHTML);//same here,very bad
}
var $li = $("ul li");
for (i = 0; i < $li.length; i++) {//good one,only selct $("ul li") once
alert($li[i].innerHTML); //same here,good
}
</script>
從代碼可以看到,避免多次重復(fù)選擇可以提高性能:-)
盡量少用選擇符
JQuery的選擇器是面向數(shù)組的,所以在條件允許的情況下盡量少用選擇器,比如:
復(fù)制代碼 代碼如下:
<div id="Div0"></div>
<div id="Div1"></div>
<div id="Div2"></div>
<script type="text/javascript">
$("#Div0").slideDown("slow");
$("#Div1").slideDown("slow");
$("#Div2").slideDown("slow");//slow
$("Div0,Div1,Div2").slideDown("slow");//fast
</script>
可以看出,使用選擇器并用逗號(hào)將被選擇的元素分開,并選擇多個(gè)元素不僅讓代碼更加簡(jiǎn)潔,并且通過(guò)減少創(chuàng)建JQuery的實(shí)例所以在性能上也稍勝一籌!
在循環(huán)次數(shù)很多時(shí)避免使用$().each,而使用for循環(huán)
使用$().each方法讓在進(jìn)行循環(huán)時(shí),會(huì)讓編程更加輕松,少量的循環(huán)在使用$().each時(shí)對(duì)性能的影響可以忽略不計(jì),但是當(dāng)這個(gè)數(shù)字很大的時(shí)候,對(duì)性能的影響便開始變得可觀了.
這個(gè)數(shù)字,我查了下資料,據(jù)說(shuō)是1000以下可以使用$().each方法,而這個(gè)數(shù)字如果繼續(xù)增加,則應(yīng)該使用for循環(huán)語(yǔ)句。
盡量減少對(duì)DOM的操作
在頁(yè)面中對(duì)DOM操作是比較消耗的(比如在頁(yè)面插入或刪除一段文字),把這個(gè)改動(dòng)降至最小是保持性能的最佳實(shí)踐!比如:
復(fù)制代碼 代碼如下:
<ul id="test">
</ul>
<script type="text/javascript">
var $list = $("#test");
for (i = 1; i < 101; i++) {
$list.append("<li>Item" + i + "</li>");
} //very bad,change dom 100 times
var listItem = "";
for (j = 1; j < 101; j++) {
listItem += "<li>Item" + j + "</li>";
}
$list.html(listItem);
//good practice,only modify dom once
</script>
可以看出,第一個(gè)例子對(duì)DOM修改100次,而第二個(gè)只對(duì)DOM修改1次,這上面的性能差距是顯而易見的。
可以屏蔽JQuery的動(dòng)畫效果
在某些情況下,如果,可以關(guān)閉JQuery動(dòng)畫,能對(duì)性能進(jìn)行一定提升,屏蔽的方法是:
復(fù)制代碼 代碼如下:
<script type="text/javascript">
jQuery.fx.off = true;
</script>
如果參數(shù)可以是JS對(duì)象,盡量使用對(duì)象
很對(duì)JQuery插件,或者JQuery的css和attr方法都接受鍵/值 或 js鍵/值對(duì)象 對(duì)作為參數(shù),傳遞鍵值對(duì)象可以減少JQuery對(duì)象的創(chuàng)建,比如:
復(fù)制代碼 代碼如下:
<div></div>
<script type="text/javascript">
$("div").css("display", "block");
$("div").css("background-color", "blue")
//slow,because it create more Jquery object
$("div").css({ "display": "block", "background-color": "blue" });
//fast,only create one object
</script>
當(dāng)然也可以使用連綴的方式:
復(fù)制代碼 代碼如下:
<div></div>
<script type="text/javascript">
$("div").css("display", "block").css("background-color", "blue");
</script>
但是這種方式的性能不如上面那種.需要使用兩個(gè)方法,并且需要多生成臨時(shí)對(duì)象.
以上都是一些對(duì)JQuery性能提升的小Tips
您可能感興趣的文章:
相關(guān)文章
Jquery Easyui選項(xiàng)卡組件Tab使用詳解(10)
這篇文章主要為大家詳細(xì)介紹了Jquery Easyui菜單組件Menu的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12jQuery插件pagination實(shí)現(xiàn)無(wú)刷新分頁(yè)
本文我們一步一步看看使用jQuery、JSON、Ajax和微軟jQuery Template插件組合實(shí)現(xiàn)jQuery無(wú)刷新分頁(yè),希望能給你一些幫助,感興趣的朋友可以參考一下2016-05-05分析了一下JQuery中的extend方法實(shí)現(xiàn)原理
這篇文章主要介紹了通過(guò)jQuery.extend的源碼分析了一下JQuery中的extend方法實(shí)現(xiàn)原理以及使用方式,非常的詳細(xì),這里推薦給大家,有需要的小伙伴來(lái)參考下吧。2015-02-02jquery的index方法實(shí)現(xiàn)tab效果
jquery的index方法實(shí)現(xiàn)tab效果,需要的朋友可以參考下。2011-02-02基于MVC+EasyUI的web開發(fā)框架之使用云打印控件C-Lodop打印頁(yè)面或套打報(bào)關(guān)運(yùn)單信息
這篇文章主要介紹了基于MVC+EasyUI的web開發(fā)框架之使用云打印控件C-Lodop打印頁(yè)面或套打報(bào)關(guān)運(yùn)單信息的相關(guān)資料,非常不錯(cuò),需要的朋友可以參考下2016-08-08validform表單驗(yàn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了validform表單驗(yàn)證的實(shí)現(xiàn)方法,validform插件主要把所有的驗(yàn)證條件和驗(yàn)證提示信息綁定到每個(gè)表單元素,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03