不要每次都在循環中訪問數組的 length 屬性,應在循環開始之前就將其緩存:
var myLength = myArray.length;for (var i = 0; i < myLength; i++) { // do stuff}
在循環外執行 append 操作
直接操作 DOM 是非常耗費性能的,尤其不要在循環中直接操作 DOM:
// 這樣性能很差$.each(myArray, function(i, item) { var newListItem = '<li>' + item + '</li>'; $('#ballers').append(newListItem);});// 這樣性能較好
var frag = document.createDocumentFragment();$.each(myArray, function(i, item) {
var newListItem = '<li>' + item + '</li>';
frag.appendChild(newListItem);
});
$('#ballers')[0].appendChild(frag);// 這樣也很好
var myHtml = '';$.each(myArray, function(i, item) {
html += '<li>' + item + '</li>';
});
$('#ballers').html(myHtml);
代碼要保持精煉
避免做重復的事情。如果你一直在做重復的事情,那么就可能出問題了:
// 丑if ($eventfade.data('currently') != 'showing') { $eventfade.stop();}if ($eventhover.data('currently') != 'showing') { $eventhover.stop();}if ($spans.data('currently') != 'showing') { $spans.stop();}// 漂亮??!var $elems = [$eventfade, $eventhover, $spans];$.each($elems, function(i,elem) { if (elem.data('currently') != 'showing') { elem.stop(); }});
警惕匿名函數
匿名函數滿天飛是很痛苦的事情,它們難以調試、維護、測試或者復用,應盡可能的對函數命名并將其封裝在對象中,實施有效的管理:
// 不好$(document).ready(function() { $('#magic').click(function(e) { $('#yayeffects').slideUp(function() { // ... }); }); $('#happiness').load(url + ' #unicorns', function() { // ... });});// 好var PI = { onReady : function() { $('#magic').click(PI.candyMtn); $('#happiness').load(PI.url + ' #unicorns', PI.unicornCb); }, candyMtn : function(e) { $('#yayeffects').slideUp(PI.slideCb); }, slideCb : function() { ... }, unicornCb : function() { ... }};$(document).ready(PI.onReady);
選擇器的優化
隨著越來越多的瀏覽器支持 document.querySelectorAll(),選擇器的重擔已經慢慢轉移給瀏覽器了,但還是有一些技巧需要注意:
優先并盡可能地使用 ID 選擇器:
// 快$('#container div.robotarm');// 相當快$('#container').find('div.robotarm');使用 $.fn.find 的方式更快,因為在 $.fn.find 之前的選擇器并沒有使用 jQuery 自帶的 Sizzle 選擇器引擎,而是使用了瀏覽器 document.getElementById() 方法,瀏覽器原生的方法自然更快。使用組合選擇器時,盡可能使右端更明確,而左端不盡量不明確:// 未優化$('div.data .gonzalez');// 已優化$('.data td.gonzalez');
盡量在選擇器右端使用 tag.class,而左端盡可能只使用 tag 或者 .class。
避免過度具體:
$('.data table.attendees td.gonzalez');// 在不影響結果的情況下盡量刪掉中間多余部分$('.data td.gonzalez');
簡潔的 DOM 結構也有助于提升選擇器的性能,因為選擇器可能少走幾層彎路去尋找那些元素。
盡量避免使用通配符,任何顯式或隱式的使用通配符,都會降低選擇器的性能:
$('.buttons > *'); // 極慢$('.buttons').children(); // 好多了$('.gender :radio'); // 隱式地使用通配符,慢$('.gender *:radio'); // 顯式地使用通配符,同上,慢$('.gender input:radio'); // 嗯,快多了
使用事件代理
事件代理允許將一個事件綁定到某個容器上(例如一個無序列表 ul),而不是綁定到容器內所有元素上(例如列表元素 li)。雖說 $.fn.live 和 $.fn.delegate 都是將事件綁定到容器上,但是應盡可能是用 $.fn.delegate,畢竟其明確的上下文(相較于 $.fn.live 的上下文是 document)要小得多,避免了很多不必要的過濾。
除了性能方面的提升,如果給綁定了事件的容器內添加新元素,那么這些新元素就無須再次綁定事件了,這也是個優點。
// 不好 (如果列表元素非常多,你就悲劇了)$('li.trigger').click(handlerFn);// 好些:使用 $.fn.live 進行事件代理$('li.trigger').live('click', handlerFn);// 最好:使用 $.fn.delegate 進行事件代理// 因為這樣可以明確的指定一個上下文$('#myList').delegate('li.trigger', 'click', handlerFn);
將元素從 DOM 卸載出來再操作
DOM 操作是比較慢的,所以應盡量避免直接操作 DOM。jQuery 在其 1.4 版中引入了 $.fn.detach 方法,可以將元素從 DOM 中卸載出來然后進行操作,操作好了之后再添加到 DOM 中:
var $table = $('#myTable');var $parent = $table.parent();$table.detach();// ... 例如這里給表格添加了很多很多行$parent.append(table);
使用外部樣式表為大量元素修改樣式
當使用 $.fn.css 為超過 20 個元素修改樣式時,應考慮直接在頁面中添加 style 標簽,據說性能可提升 60%。
// 當元素少于 20 個時使用這個方法,多余 20 個時,速度就慢了$('a.swedberg').css('color', '#asd123');// 多余 20 個元素時,應考慮直接在頁面中添加 style 標簽$('<style type="text/css">a.swedberg { color : #asd123 }</style>') .appendTo('head');
使用 $.data 替代 $.fn.data
將 $.data 應用于 DOM 元素上,比直接在選擇器上調用 $.fn.data 要快 10 倍。當然,前提是要先明白 DOM 元素和 jQuery 結果集之間的區別。
// 速度一般$(elem).data(key,value);// 速度提升 10 倍$.data(elem,key,value);
別在空元素上浪費時間
jQuery 不會主動告訴你,你正在一個空白的結果集上運行代碼 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美高清理论片| xxxxx91麻豆| 国产视频综合在线| 影音先锋欧美在线资源| 成人欧美在线视频| 26uuu日韩精品一区二区| 国产欧美一区二区三区视频| 国产69久久精品成人| 日韩久久午夜影院| 成人在线一区二区| 狠狠躁天天躁日日躁欧美| 亚洲www永久成人夜色| 91麻豆国产语对白在线观看| 国产又爽又黄的激情精品视频| 日韩精品免费在线视频观看| 91精品国产成人| 一夜七次郎国产精品亚洲| 国产一区二区三区在线视频| 久久国产精品电影| 欧美日韩电影在线观看| 2018中文字幕一区二区三区| 久久躁狠狠躁夜夜爽| 国产精品精品视频一区二区三区| 日韩免费观看在线观看| 精品福利免费观看| 欧美影院在线播放| 欧美插天视频在线播放| 国产精品综合网站| 亚洲欧美日韩国产中文| 亚洲综合色av| 亚洲韩国青草视频| 欧美激情精品久久久久久蜜臀| 亚洲人成网站色ww在线| 欧美大全免费观看电视剧大泉洋| 麻豆一区二区在线观看| 国产中文字幕亚洲| 国产aⅴ夜夜欢一区二区三区| 欧美日韩国产91| 国产精品一区二区三区在线播放| 精品国内亚洲在观看18黄| 成人激情视频在线播放| 亚洲国产日韩一区| 91理论片午午论夜理片久久| 欧美中文字幕第一页| 97人人爽人人喊人人模波多| 性欧美xxxx交| 成人精品网站在线观看| 国产精品极品美女粉嫩高清在线| 久久久精品久久久| 最新91在线视频| 国产亚洲激情在线| 亚洲欧洲av一区二区| 欧美激情videoshd| 欧洲成人在线观看| 精品女同一区二区三区在线播放| 欧美午夜精品伦理| 57pao国产成人免费| 97**国产露脸精品国产| 国产精品xxxxx| 中文字幕久热精品在线视频| 色爱av美腿丝袜综合粉嫩av| 亚洲精品女av网站| 日韩中文字幕网站| 亚洲欧洲日韩国产| 日韩激情视频在线| 日韩在线欧美在线| 欧美性猛交xxxx富婆| 久久久久北条麻妃免费看| 欧美中文字幕在线观看| 国产精品美女主播在线观看纯欲| 国产日韩在线免费| 国产亚洲精品久久久久久牛牛| 岛国av一区二区在线在线观看| 国产日韩在线精品av| 久久全国免费视频| 亚洲欧美精品在线| 日韩欧美aⅴ综合网站发布| 欧美乱大交xxxxx另类电影| 欧美专区国产专区| 国产98色在线| 欧美最顶级的aⅴ艳星| 久久久欧美一区二区| 欧美日韩国产一区二区| 久久成人一区二区| 国产欧亚日韩视频| 久久久精品久久久| 日本久久久久亚洲中字幕| 91免费版网站入口| 欧美裸体视频网站| 国产精品日韩欧美| 国产精品第10页| 精品久久久久久亚洲国产300| 国产精品www色诱视频| 富二代精品短视频| 亚洲欧美激情在线视频| 日本电影亚洲天堂| 久久精品电影一区二区| 2024亚洲男人天堂| 国产视频一区在线| 久久久久久久网站| 亚洲国语精品自产拍在线观看| 国产精品久久久久99| 97视频在线观看视频免费视频| 日韩成人免费视频| 欧美中文字幕在线| 欧美一级大胆视频| 色综合色综合网色综合| 精品福利一区二区| 最新国产成人av网站网址麻豆| 久久免费视频观看| 久久99国产精品久久久久久久久| 欧美美最猛性xxxxxx| www.国产精品一二区| 亚洲3p在线观看| 久久精品亚洲94久久精品| 欧美午夜精品久久久久久久| 久久男人的天堂| 97精品免费视频| 欧美日韩免费在线| 亚洲精品永久免费| 98视频在线噜噜噜国产| 亚洲图中文字幕| 国产日韩欧美日韩大片| 欧美日韩在线第一页| 日韩精品在线视频观看| 国产精品av免费在线观看| 性欧美xxxx交| 国产亚洲精品激情久久| 亚洲国产成人91精品| 久久久久www| 中文字幕日韩免费视频| 亚洲视频一区二区| 久久视频在线视频| 富二代精品短视频| 永久免费看mv网站入口亚洲| 亚洲美女av黄| 亚洲国产另类久久精品| 欧美中文字幕第一页| 国产亚洲成精品久久| 国产欧美久久一区二区| 日韩精品在线免费观看| 一区二区三区视频在线| 国产精品女人久久久久久| 久久香蕉精品香蕉| 亚洲va国产va天堂va久久| 欧美亚洲第一区| 亚洲成人性视频| 久久九九国产精品怡红院| 亚洲男人的天堂网站| 欧美激情性做爰免费视频| 国产91免费观看| 97在线视频免费观看| 亚洲欧美日韩精品| 韩剧1988在线观看免费完整版| 成人黄色短视频在线观看| 91av在线播放视频| 国模叶桐国产精品一区| 国产一区二区久久精品| 97视频在线观看网址| 亚洲片国产一区一级在线观看| 热99精品里视频精品| 久久久久久免费精品| 欧美www在线| 欧美电影免费观看网站|