jquery性能最佳實踐

jquery
forlength
var myLength myArray.length;
for (var 0myLengthi++{
    // 要做的事
}

使append

DOMDOM
// 別這樣
$.each(reallyLongArrayfunction(countitem{
    var newLI '<li>' item '</li>';
    $('#ballers').append(newLI);
});
//較好的做法
var frag document.createDocumentFragment();
$.each(reallyLongArrayfunction(countitem{
    var newLI '<li>' item '</li>';
    frag.appendChild(newLI[0]);
});
$('#ballers')[0].appendChild(frag);each()$('#id')domdocument.createDocumentFragment()DOM

// 或者這樣
var myHtml '';
$.each(myArrayfunction(iitem{
    html += '<li>' item '</li>';
});
$('#ballers').html(myHtml);


// 不理想
if ($ventfade.data('currently'!= 'showing'{
    $ventfade.stop();
}
if ($venthover.data('currently'!= 'showing'{
    $venthover.stop();
}
if ($spans.data('currently'!= 'showing'{
    $spans.stop();
}
// 較好的
var elems [$ventfade$venthover$spans];
$.each(elemsfunction(kv{
    if (v.data('currently'!= 'showing'{
        v.stop();
    }
})


調使調


// 不要這樣
$(document).ready(function({...
    $('#magic').click(function(e{
        $('#yayeffects').slideUp(function({...
        });
    });
    $('#happiness').load(url ' #unicorns'function({...
    })
});

// 較好的
var PI {
    onReadyfunction({...
        $('#magic').click(PI.candyMtn);
        $('#happiness').load(url ' #unicorns'PI.unicornCb);
    },
    candyMtnfunction(e{
        $('#yayeffects').slideUp(PI.slideCb);
    },
    slideCbfunction({...
    },
    unicornCbfunction({...
    }
}
$(document).ready(PI.onReady);


DOM
ID使#idelement
// 非常快
$('#container div.robotarm');
// 超級快
$('#container').find('div.robotarm');使$.fn.findjqueryID.JavascriptgetElementById()DOMID


// 未優化
$('div.data .gonzalez');
// 優化後
$('.data td.gonzalez');使tag.classtag.class


$('.data table.attendees td.gonzalez');
// 不寫中間的會更好
$('.data td.gonzalez');DOM


使

$('.buttons > *')// 極慢
$('.buttons').children()// 快很多
$('.gender :radio')// 無定向搜索
$('.gender *:radio')// 同上
$('.gender input:radio')// 這樣好很多

使

jQuery$.fn.live$.fn.delegate使$.fn.delegate$.fn.live$.fn.live80 使


// 不好的 (如果列表裏面元素很多)
$('li.trigger').click(handlerFn);

// 較好的: event delegation with $.fn.live
$('li.trigger').live('click'handlerFn);

// 最優的: $.fn.delegate
$('#myList').delegate('li.trigger''click'handlerFn);

移除元
DOMjQuery1.4
$.fn.detachDOM
var $table $('#myTable');
var $parent table.parent();
$table.detach();
// ... 添加大量的行到表格中
$parent.append(table);

.
detach().remove().detach()jQueryDOM


CSS使

$.fn.css20CSSstyle60 
// 多於20明顯慢
$('a.swedberg').css('color''#asd123');
$('<style type="text/css">a.swedberg { color : #asd123 }</style>').appendTo('head');

使$.data$.fn.data$.dataDOM調jQuery$.fn.data10.DOMjQuery
// 常用
$(elem).data(keyvalue);
// 快十倍
$.data(elemkeyvalue);




jQuery
//太遭了,執行了三個方法後才意識到裏面是空的
$('#nosuchthing').slideUp();

// 較好
var $mySelection $('#nosuchthing');
if ($mySelection.length{
    mySelection.slideUp();
}

// 最佳: add a doOnce plugin
jQuery.fn.doOnce function(func{
    this.length && func.apply(this);
    return this;
}
$('li.cartitems').doOnce(function({
    // make it ajax! \o/
});
jQuery UI widget使





// 老套寫法
var test 1;
var test2 function({...
};
var test3 test2(test);

// 
var test 1,
    test2 function({...
    },
    test3 test2(test);(function(foobar{...
})(
12);



// 舊方法
if (type == 'foo' || type == 'bar'{...
}

// 好方法
if (/^(foo|bar)$/.test(type){...
}

// 查找對象
if (({
    foo1,
    bar1
})[
type]{...

}

 

 

前端優化



    本文轉自曾祥展博客園博客,原文鏈接:http://www.cnblogs.com/zengxiangzhan/archive/2010/12/05/1897073.html,如需轉載請自行聯繫原作者