jQuery簡單的性能優(yōu)化(二)

本文中用到的jQuery版本為v1.12.0

1. 緩存對象

 在寫jQuery代碼的時候空骚,有些開發(fā)人員喜歡這么寫:
$('#id').css('color', 'white');
$('#id').on('click', function(event) {...});
$('#id').find('.childNode').siblings().hide();
$('#id').fadeIn('500');

當(dāng)然纺讲,開發(fā)過程中的跳躍思維會導(dǎo)致你有可能書寫類似這樣的代碼,這無可厚非囤屹,但是這么書寫導(dǎo)致的是:jQuery會在創(chuàng)建每一個選擇器的過程中熬甚,查找DOM,創(chuàng)建多個jQuery對象肋坚。相對應(yīng)的则涯,比較良好的書寫方式如下:

var $id = $('#id');
$id.css('color', 'white');
$id.on('click', function(event) {...});
$id.find('.childNode').siblings().hide();
$id.fadeIn('500');

當(dāng)然复局,使用jQuery的鏈?zhǔn)讲僮鲿勾a更加簡潔:

var $id = $('#id');
$id.css('color', 'white')
        .on('click', function(event) {...})
        .find('.childNode').siblings().hide()
        .fadeIn('500');

這里只是為了說明使用緩存變量的重要性冲簿,這和Java開發(fā)中不要隨意的創(chuàng)建對象一樣粟判,可以幫助你有效地提高代碼的執(zhí)行效率。
如果在其他函數(shù)也用到了該jQuery對象峦剔,那么可以把它緩存到全局環(huán)境中档礁。如:

window.$me = {
        id1 = $('#id1'),
        head = $('#title')
};
function test () {
        $me.id1.css('color', 'white')
            .on('click', function(event) {...})
            .find('.childNode').siblings().hide()
            .fadeIn('500');
        $me.head.text('I am a Head');
}

切記:永遠(yuǎn)不要讓相同的選擇器在你的代碼中出現(xiàn)多次。

2. 循環(huán)時的DOM操作

使用jQuery可以很方便的對DOM節(jié)點進(jìn)行增刪查改吝沫,但是在一些循環(huán)中呻澜,如for()while()惨险,$.each()中處理節(jié)點時羹幸,如下例:

$ul = $('#ul-list');
$.each(dataArray, function(index, val) {
        $ul.append('<li>'+dataArray[index]+'</li>');
});

在上面代碼中,將dataArray中的數(shù)據(jù)逐個加入到ul中辫愉,期間每一條數(shù)據(jù)都通過.append()將新節(jié)點添加到容器中栅受。實際上jQuery操作消耗的性能也不低,所以更好的方式是盡可能的減少DOM操作恭朗∑聊鳎可以將整個元素字符串在插入DOM之前全部創(chuàng)建好。如:

var $ul = $('#ul-list');
var html = "";
$.each(dataArray, function(index, val) {
        html += '<li>'+dataArray[index]+'</li>';
});
$ul.html(html);

3. 數(shù)組方式使用jQuery對象

使用jQuery選擇器獲取的結(jié)果是一個jQuery對象痰腮。然而而芥,jQuery類庫會讓你感覺你在使用一個定義了索引和長度的數(shù)組。在性能方面膀值,使用for()或者while()來處理比使用$.each()要快棍丐。
同時,檢查該數(shù)組的長度也是一個檢查jQuery對象是否存在的方法沧踏。如:

var $content = $('#content');
if ($content) {...};//總是返回true
if ($content.length) {...};//擁有#content該元素時才返回true

4. 事件代理

每一個JavaScript事件(如:click歌逢,mouseover等)都會冒泡到父級節(jié)點。當(dāng)我們需要給多個元素調(diào)用同個函數(shù)時悦冀,這點會很有用趋翻。比如,我們要唯一個表格綁定這樣的行為:點擊td后盒蟆,把背景色設(shè)置為紅色踏烙,代碼如下:

$("#myTabel td").click(function(event){
      $(this).css('background-color','red');
})

假設(shè)有100個td,在使用上述方式的時候历等,就綁定了100個事件讨惩,這將帶來很負(fù)面的性能影響。
代替這種效率較低的多元素事件監(jiān)聽的方法就是寒屯,只需向它們的父節(jié)點綁定一次事件荐捻,然后通過event.tartget獲取點擊到的當(dāng)前元素黍少,代碼如下:

$("#myTabel").click(function(event){
      var $td = $(event.target);
      $td.css('background-color','red');
})

在改進(jìn)方式中,只為一個元素綁定了一個事件处面,顯然這種方式的性能要優(yōu)于之前那種厂置。同時,在jQuery 1.7版本中提供了一個新的方式:on()魂角,來幫助你將整個事件監(jiān)聽封裝到一個便利的方法中:

$("#myTabel").on('click', 'td', function(event){
      $(this).css('background-color','red');
})

5.盡量使用原生的JavaScript方法

下面的代碼昵济,用來判斷多選框是否選中:

var $cb = $('#checkbox');
$cb.click(function(e){
        if($cb.is(':checked')){
                alert('你已選中該多選框');
        }
});

這里使用了jQuery提供的is()方法來判斷多選框是否選中,但這里可以直接使用原生的JavaScript的方法:

var $cb = $('#checkbox');
$cb.click(function(event) {
    if (this.checked) {alert('checked')}
});

毋庸置疑野揪,第二種方式效率高于第一種访忿,因為它不需要再去調(diào)用其他函數(shù)。
還有很多:

//$(this).css('color','red');
this.style.color = 'red';//better;

//$('<p>');
$(document.createElement('p'));//better;

方法的選擇很重要斯稳,有時候海铆,也許你根本不需要jQuery。

6.壓縮JavaScript

現(xiàn)在的web項目總是離不開大量的JavaScript挣惰,而js文件的體積越來越大卧斟,隨之也影響到頁面的感知新能。因此通熄,需要對JavaScript文件進(jìn)行壓縮唆涝。
壓縮的方法和工具在網(wǎng)上很多,大家可以自行搜索唇辨。

完廊酣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市赏枚,隨后出現(xiàn)的幾起案子亡驰,更是在濱河造成了極大的恐慌,老刑警劉巖饿幅,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凡辱,死亡現(xiàn)場離奇詭異,居然都是意外死亡栗恩,警方通過查閱死者的電腦和手機透乾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磕秤,“玉大人乳乌,你說我怎么就攤上這事∈信兀” “怎么了汉操?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蒙兰。 經(jīng)常有香客問我磷瘤,道長芒篷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任采缚,我火速辦了婚禮针炉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仰担。我一直安慰自己糊识,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布摔蓝。 她就那樣靜靜地躺著,像睡著了一般愉耙。 火紅的嫁衣襯著肌膚如雪贮尉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天朴沿,我揣著相機與錄音猜谚,去河邊找鬼。 笑死赌渣,一個胖子當(dāng)著我的面吹牛魏铅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播坚芜,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼览芳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鸿竖?” 一聲冷哼從身側(cè)響起沧竟,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缚忧,沒想到半個月后悟泵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡闪水,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年糕非,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片球榆。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡朽肥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芜果,到底是詐尸還是另有隱情鞠呈,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布右钾,位于F島的核電站蚁吝,受9級特大地震影響旱爆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窘茁,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一怀伦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧山林,春花似錦房待、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至框冀,卻和暖如春流椒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背明也。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工宣虾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人温数。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓绣硝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撑刺。 傳聞我的和親對象是個殘疾皇子鹉胖,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容