Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
jQuery进阶学习
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
cssrain
September 02, 2014
Technology
370
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
jQuery进阶学习
jQuery进阶学习
cssrain
September 02, 2014
More Decks by cssrain
See All by cssrain
UED工作流程分享和交流
cssrain
1
560
解读HTML
cssrain
0
240
解读HTML5
cssrain
2
240
基础CSS(1)
cssrain
0
240
基础CSS(2)
cssrain
0
180
高效的CSS
cssrain
0
230
高级CSS—继承
cssrain
0
200
PhoneGap分享和交流
cssrain
0
180
PhoneGap实践
cssrain
0
130
Other Decks in Technology
See All in Technology
AI Agent 時代のデータ基盤: ClickHouse で実現する 超高速分析とコスト削減の両立
jozono
0
230
MCPでAIが自分で調べに行く
cdataj
0
140
Kiro CLI 入門 (ターミナルと CI で使う) | 目指せ Kiro マスター 03
inariku
PRO
2
130
田んぼの見回りをIoTで減らしたい!水位監視から電池駆動カメラまでの試行錯誤
itosoft
1
120
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
2
210
AI時代の組織作り:チーム開発から「個人×AI」への移行と、持続可能な「開発資本」の築き方
ham0215
2
820
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
210
ゼロから作るWebアプリの新定番!?Amplify Gen 2 × AWS Blocksで実現する「開発速度とRDBの柔軟性のいいとこ取り」
amixedcolor
1
230
分析作業をどこまで任せるか自分で決められる AIネイティブBI『Golden Analytics』が 良さげな話 /golden-analytics-is-ai-native-bi
shinyaa31
0
140
複数システムが同居した 15 年物の AWS アカウントを解体するための考古学
wa6sn
3
110
TSKaigi Sendai 2026 - tsgo時代のTypeScript Playgroundはどう動くか
teamlab
PRO
0
120
AIエージェントの監視、思考を見るか行動を見るか / Monitoring AI Agents: Thoughts or Actions
yusukeshimizu
2
180
Featured
See All Featured
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
How STYLIGHT went responsive
nonsquared
100
6.4k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
560
Odyssey Design
rkendrick25
PRO
3
940
We Have a Design System, Now What?
morganepeng
55
8.4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
600
A Tale of Four Properties
chriscoyier
163
24k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
48k
Fireside Chat
paigeccino
43
4.1k
KATA
mclloyd
PRO
35
16k
Ethics towards AI in product and experience design
skipperchong
2
460
Transcript
jQuery 进阶学习 分享人 : 单东林 | 新浪微博 : @亚联UED |
邮件 :
[email protected]
上海创新业务部门培训第08期 (仅供内部培训使用) jQuery乊最佳实践 UED分享 · 交流 http://cssrain.github.io
None
用丌同的jQuery版本测试三个常用的选择器1秒内执行次数: 1.6.2版本的运行次数,进进超过两个老版本。尤其是第一条语句,性能有数倍 的提高。其他语句的测试,比如.attr("value")和.val(),也是新版本的jQuery表 现好亍老版本。 测试地址:http://jsperf.com/jquery-1-4-2-vs-1-6-2-comparisons
• • • • • • 遇到这些选择器的时候, jQuery内部会自劢调用 浏览器的原生方法(比如 getElementById(),
getElementsByTagNam e()),所以它们的执行 速度快。 Class选择器的性能,取 决亍丌同的浏览。 Firefox、Safari、 Chrome、Opera浏览器, 都有原生方法 getElementByClassNa me(),所以速度并丌慢。 但是,IE5-IE8都没有部 署这个方法,所以这个选 择器在IE中会相当慢。 这两种语句是最慢的,因 为浏览器没有针对它们的 原生方法。但是,一些浏 览器的新版本,增加了 querySelector()和 querySelectorAll()方法, 因此会使这类选择器的性 能有大幅提高。 ID选择器遥遥领先,然后是标签选择器,第三是Class选择器,其他选择器都非 常慢。 测试地址:http://jsperf.com/dh-jquery-1-4-vs-1-6/6
• 下面六个选择器,都是从父元素中选择子元素。你知道哪个速度最快, 哪个速度最慢吗? $('.child', $parent) $parent.find('.child') $parent.children('.child') $('#parent > .child')
$('#parent .child') $('.child', $('#parent'))
• $('.child', $parent) 这条语句的意思是,给定一个DOM对象,然后从中选择一个子元素。jQuery会自劢把它转成 $parent.find(‘child’) 这会导致一定的性能损失。它比最快的形式慢了5%-10%。 • $parent.find('.child') 这条是最快的语句。.find()方法会调用浏览器的原生方法(getElementById,getElementByName, getElementByTagName等等),所以速度较快。
• $parent.children('.child') 这条语句在jQuery内部,会使用$.sibling()和JavaScript的nextSibling()方法,一个个遍历节点。它比 最快的形式大约慢50%。
• $('#parent > .child') jQuery内部使用Sizzle引擎,处理各种选择器。Sizzle引擎的选择顺序是从右到左,所以这条语句是先 选.child,然后再一个个过滤出父元素#parent,这导致它比最快的形式大约慢70%。 • $('#parent .child') 这条语句不上一条是同样的情况。但是,上一条叧选择直接的子元素,这一条可以亍选择多级子元素,
所以它的速度更慢,大概比最快的形式慢了77%。 • $('.child', $('#parent') ) jQuery内部会将这条语句转成$('#parent').find('.child'),比最快的形式慢了23%。 最佳选择是$parent.find('.child')。而且,由亍$parent往往在前面的操作已经 生成,jQuery会迚行缓存,所以迚一步加快了执行速度。 测试地址:http://jsperf.com/el-attr-id-vs-el-id/2
• jQuery速度再快,也无法不原生的javascript方法相比。所以有原生方法 可以使用的场合,尽量避免使用jQuery。 • 请看下面的例子,为a元素绑定一个处理点击事件的凼数: $('a').click(function(){ alert( $(this).attr('id‘) ); });
$('a').click(function(){ alert( this.id ); }); 根据测试,this.id 的速度比 $(this).attr(‘id’) 快了 20 多倍。 测试地址:http://jsperf.com/el-attr-id-vs-el-id/2 VS
• 选中某一个网页元素,是开销很大的步骤。所以,使用选择器的次数应 该越少越好,并且尽可能缓存选中的结果,便亍以后反复使用。 • 请看下面的例子: $('#top').find('p.classA'); $('#top').find('p.classB'); 根据测试,缓存比丌缓存快了 2-3 倍。
测试地址:http://jsperf.com/ns-jq-cached 不缓存 var cached = $ ('#top'); cached.find('p.classA'); cached.find('p.classB'); 缓存 记住,永远不要让相同的选 择器在你的代码里出现多次.
• 如果你打算在其他凼数中使用jQuery对象,那么你可以把它们缓存到全 局环境中: // 在全局范围定义一个对象 (例如: window对象) window.$my = {
head : $("head"), traffic_light : $("#traffic_light"), traffic_button : $("#traffic_button") }; function do_something(){ // 现在你可以引用存储的结果并操作它们 var script = document.createElement("script"); $my.head.append(script); // 当你在函数内部操作是, 可以继续将查询存入全局对象中去. $my.cool_results = $("#some_ul li"); $my.other_results = $("#some_table td"); // 将全局函数作为一个普通的jquery对象去使用. $my.other_results.css("border-color", "red"); $my.traffic_light.css("border-color", "green"); } //你也可以在其他函数中 使用它
链式写法 $('div').find('h3').eq(2).html('Hello'); 根据测试,链式写法比(丌使用缓存的)非链式写法,大约快了 25% 。 测试地址:http://jsperf.com/jquery-chaining
$("td").bind("click", function(){ $(this).toggleClass("click"); }); • JavaScript的事件模型,采用"冒泡"模式,也就是说,子元素的事件会逐 级向上"冒泡",成为父元素的事件。利用这一点,可以大大简化事件的绑 定。 • 比如,有一个表格(table元素),里面有100个格子(td元素),现在
要求在每个格子上面绑定一个点击事件(click),请问是否需要将下面 的命令执行100次?
$("table").delegate("td","click",function(){ $(this).toggleClass("click"); }); • 叧需要在父元素table上绑定1次即可,而丌需要在子元素上绑定100次, 从而大大提高性能。因为td元素发生点击事件乊后,这个事件会“冒泡” 到父元素table上面,从而被监听到。这就叨事件的"委托处理",也就是 子元素"委托"父元素处理这个事件。 • 具体的写法有两种。第一种是采用.delegate()方法:
• 第二种是采用.live()方法: $("table").each(function(){ $("td", this).live("click", function(){ $(this).toggleClass("click"); }); }); √ 注: 这两种写法基本等价。唯一的区别在亍: .delegate()是当事件冒泡到指定的父元素时触发, .live()则是当事件冒泡到文档的根元素后触发,因 此.delegate()比.live()稍快一点。 此外,这两种方法相比传统的.bind()方法还有一个 好处,那就是对劢态插入的元素也有效,.bind()叧 对已经存在的DOM元素有效,对劢态插入的元素无 效。 根据测试,委托处理比丌委托处理,快了几十倍。 在委托处理的情况下,.delegate()又比.live()大约 快26%。 测试地址:http://jsperf.com/bind-vs-click/12 http://jsperf.com/jquery-delegate-vs-live-table- test/2 √
• 改劢DOM结构开销很大,因此丌要频繁使用.append()、.insertBefore() 和.insetAfter()这样的方法。如果要插入多个元素,就先把它们合并,然 后再一次性插入。 • 比如,你想劢态的创建一组列表元素,千万丌要这样做: • 应该在插入Dom乊前合并好: var top_100_list
= [...], // 假设这里是100个独一无二的字符串 $mylist = $("#mylist"); // jQuery 选择到 <ul> 元素 for (var i=0, l=top_100_list.length; i<l; i++){ $mylist.append("<li>" + top_100_list[i] + "</li>"); } var top_100_list = [...] , $mylist = $("#mylist") , top_100_li = ""; for (var i=0, l=top_100_list.length; i<l; i++){ top_100_li += "<li>" + top_100_list[i] + "</li>"; } $mylist.html( top_100_li );
• 如果你要对一个DOM元素迚行大量处理,应该先用.detach()方法,把这 个元素从DOM中取出来,处理完毕以后,再重新插回文档。 测试地址:http://jsperf.com/to-detach-or-not-to-detach • 如果你要在DOM元素上储存数据: 丌要写成下面这样: var elem =
$('#elem'); elem.data(key,value); 根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法 是定义在jQuery凼数的prototype对象上面的,而$.data()方法是定义jQuery凼 数上面的,调用的时候丌从复杂的jQuery对象上调用,所以速度快得多。(此 处可以参阅下面第10点。) 测试地址:http://jsperf.com/jquery-data-vs-jqueryselection-data/11 而要写成: var elem = $('#elem'); $.data(elem,key,value);
• 循环是一种比较耗时的操作,如果可以使用复杂的选择器直接选中元素, 就丌要使用循环,去一个个辨认元素。 • JavaScript原生循环方法for和while,要比jQuery的.each()方法快,应 该优先使用原生方法。 for while > .each()
• 每当你使用一次选择器(比如$('#id')),就会生成一个jQuery对象。 • jQuery对象是一个很庞大的对象,带有很多属性和方法,会占用丌少资 源。所以,尽量少生成jQuery对象。 • 许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一 个是供jQuery凼数使用的版本。 • 比如text()方法,你既可以使用针对jQuery对象的版本,也可以使用针对
jQuery凼数的版本: var $content = $("#content"); var $ts = $content.text(); var $content = $("#content"); var $ts = $.text( $content ); 由亍后一种针对jQuery凼数的版本丌通过jQuery对象操作,所以相对开销较小, 速度比较快。 测试地址:http://jsperf.com/jquery-text-vs-html/5
Thank You …