Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
jQuery 基礎概念與選取器解析
Search
Kingsley Zheng
January 07, 2015
Programming
1
110
jQuery 基礎概念與選取器解析
介紹基本的 jQuery 概念
以及選取器效能評比
Kingsley Zheng
January 07, 2015
Tweet
Share
Other Decks in Programming
See All in Programming
第9回 情シス転職ミートアップ 株式会社IVRy(アイブリー)の紹介
ivry_presentationmaterials
1
250
Team topologies and the microservice architecture: a synergistic relationship
cer
PRO
0
1.1k
Is Xcode slowly dying out in 2025?
uetyo
1
240
Composerが「依存解決」のためにどんな工夫をしているか #phpcon
o0h
PRO
1
250
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
1.8k
GraphRAGの仕組みまるわかり
tosuri13
8
500
『自分のデータだけ見せたい!』を叶える──Laravel × Casbin で複雑権限をスッキリ解きほぐす 25 分
akitotsukahara
1
590
20250628_非エンジニアがバイブコーディングしてみた
ponponmikankan
0
530
ふつうの技術スタックでアート作品を作ってみる
akira888
0
220
5つのアンチパターンから学ぶLT設計
narihara
1
130
AIプログラマーDevinは PHPerの夢を見るか?
shinyasaita
1
180
生成AIコーディングとの向き合い方、AIと共創するという考え方 / How to deal with generative AI coding and the concept of co-creating with AI
seike460
PRO
1
340
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
42
7.6k
Fireside Chat
paigeccino
37
3.5k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.8k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.8k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
35
2.4k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
Building Adaptive Systems
keathley
43
2.6k
Automating Front-end Workflow
addyosmani
1370
200k
Transcript
JQuery by Kingsley Zheng
序 • 什麼是 JQuery • Sizzle 選取器 • JQuery 常用指令
• 事件 • callback • $(this) v.s. this • 重點整理
什麼是 JQuery - write less, do more -
Write less , do more Javascript JQuery
JQuery 優點 1. 開源 2. 豐富的插件支持、文檔資料 3. 選擇器 (sizzle) 4.
出色的DOM操作的封裝 5. 可靠的事件處理機制 6. 完善的Ajax 7. 不污染頂級變量, jQuery只建立一個名為jQuery ( $ )的對象 8. 鍊式操作方式
JQuery 目前最新版本 1.11.1 / 2.1.1
引用 http://jquery.com/download/ <script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
初探 JQuery 「快速選取元素」並且「做一些事情」 $(‘’div’’).addClass(‘’special’’) • $ 只建立一個名為jQuery ( $ )的對象
• 批次處理 • $('div') = jQuery('div') $(‘’div’’).addClass(‘’special’’)
取得 HTML 物件(DOM)的方法 Javascript : document.getElementById(‘’id’’) document.getElementsByClassName(‘’class’’) JQuery : $(‘’#id’’)
$(‘’.class’’)
包裝 v.s. 未包裝 JQuery 包裝後的物件,只能使用JQuery的方法操作
css1 ~ 3 、 Xpath Sizzle Selector
• HTML標籤 $(‘’div’’) $(‘’p‘’) • CSS類別名稱 $(‘’.logo‘’) $(‘’.header‘’) • #ID名稱
$(‘’#container‘’) $(‘’#footer‘’) • 選取器1,選取器2,選取器N $(‘’#logo,#header,span,h1‘’) 簡單選取器
層級選取器 兩個(或以上)元素組合的選取方式,也是 CSS 選取方式的一種: • $(‘’div li‘’) 兩個元素中間空一格,li 為 div
的子元素 (不管中間相隔幾層都沒關係) • $(‘’ul > li‘’) li 必須為 ul 的子元素,中間不能有其他層 • $(‘’h1 + div‘’) 兩個元素在同一層,必須相鄰 • $(‘’h1 ~ div‘’) 兩個元素在同一層,不必相鄰
子元素選取器 • :first-child: 選取指定元素,而且它是它父元素的第一個子元素 ex : $(‘’li:first-child‘’) 會選取第一個 li。 •
:last-child: 選取指定元素,而且它是它父元素的最後一個子元素 ex : $(‘’li:last-child‘’) 會選取最後一個 li。 • :only-child: 選取指定元素,而且它必須是父元素唯一的一個子元素 • :nth-child(數字): 選取指定元素,而它是父元素的第 n 個子元素,n 就是那個數字。 ex : $(‘’li:nth-child(5)‘’)
定位篩選選取器 • :first / :last:符合的第一個元素 / 符合的最後一個元素 • :not:過濾掉所有符合指定選擇器的元素 $(‘’td:not(‘.a’)‘’)
• :even / :odd:索引值為偶數的元素 / 索引值為奇數的元素 • :eq:索引值與指定的值相等的元素, $(‘’td:eq(2)‘’) 會選取 td 的第 2 個 • :gt:索引值大於指定值的元素, $(‘’td:gt(0)‘’) 會選取 td 的第 2 行與之後的行。 • :lt:索引值小於指定值的元素。 • :header:選取如 h1, h2, h3... 標題元素。 • :animated:選取所有正在執行動畫效果的元素。
:first-child VS :first ? $(’body table:first’) $(’body table:first-child’) 得到所有 table
中的第一個 table 得到一個空的 jquery 對象,table 不是 body 的第一個子元素
內容篩選選取器 根據元素內的文字內容,或是子元素來做篩選的選取方式。 • :contains:會選出含有 "title" 這幾個字的 h2 元素。 ex :
$(‘h2:contains('title')‘’) • :has:會選出內容中包含 span 元素的 p。 ex : $(‘’p:has(span)'’) • :empty: 選取指定元素,而且它必須沒有任何子元素 也沒有內容文字,即文字節點(text node) 也不能有。 ex : $(‘’div:empty'’) • :parent: ex : $(‘’li:parent‘’) 和 :empty 剛好相反,只會選出內容不是空的 <li>。
顯示性選取器 根據元素是顯示或隱藏來選取。 • :hidden:選出 display : none / 隱藏 或
type="hidden" 的所有指定元素 ex : $(‘’li:hidden‘’) • :visible:選出看得見的所有指定元素 ex : $(‘’li:visible‘’) • 這兩個屬性不會被當作隱藏,在 html 中仍屬於可視範圍 opacity : 0 visibility : hidden hidden (KK [ˋhɪdn] )
屬性選取器 • [屬性名稱=class-ame]:例如 $(‘‘p[class=ClassName]’’) 屬性值必須和指定的值完全相等 • [屬性名稱!=class-ame]:不含有指定屬性名稱,或是屬性值不等於指定值的元素。 • [屬性名稱]:not[class=other]:若要選取含有指定的屬性名稱,但值不相等時,可以使用。 •
[屬性名稱^=the]:例如 $(‘‘p[class^=the]’’) "開頭" 必須是 the。 • [屬性名稱$=the]:例如 $(‘‘p[class$=the]’’) "結尾" 必須是 the。 • [屬性名稱*=the]:例如 $(‘‘p[class*=the]’’) 屬性值必須 "包含" 指定的值。 • [屬性選取器1][屬性選取器2][屬性選取器N]:組合選取器,可以在需要同時滿足多個條件時使用。
表單選取器 這些是 jQuery 自訂虛擬類別選擇器,可以用來選取各種表單 ui 元素。 :password :checkbox :reset :file
:submit :text :image :input :radio :hidden :button :selected 使用 input[type="XXX"] 來替代 先用純CSS選取器選完,再用 .filter(":button")
表單狀態選取器 根據表單元素的屬性,是否勾選或啟用來做選取。 :enabled:選取不是 disabled ( 失效 ) 的元素。 :disabled:選取不是 enabled
( 啟用 ) 的元素 :checked:選取已經被點選擇的元素,例如 radio 和 checkbox。 :selected:選取已經被選擇的元素,例如 select 中的一個或多個選項。
JQuery 選取器速度
JQuery 選取器速度 • 速度: Id > tag > class >
attribute = 偽類 特別是 IE9 以下的版本,針對 Selector 的速度真的很慢 • 範圍:從越小的範圍來 select 會比較快
選取器速度比較 • 最快的選擇器:id選擇器和元素標籤選擇器 $(‘‘#id‘‘) $(‘‘form‘‘) $(‘‘input‘‘) • 較慢的選取器 : class選擇器
$(‘‘.className‘‘) 改成 $(‘‘tag.className‘‘) • 最慢的選擇器:偽類選擇器和屬性選擇器 $(‘‘:hidden’’) $(‘‘[attribute=value]‘‘) 但是,一些瀏覽器的新版本,增加了 querySelector() querySelectorAll() 方法,因此會使這類選擇器的性能有大幅提高。
.find()方法會調用瀏覽器的原生方法 ex : getElementById,getElementByName 這條語句的意思是,給定一個DOM對象,然後從中選擇一個子元素 • $(‘‘.child’’,$(’’#parent’’)) 同上一點,但是多處理了一次JQuery物件 這會使用$.sibling()和 javascript
的 nextSibling()方法,一個個遍歷節點 這條語句是先選.child,然後再一個個過濾出父元素#parent 同上一點,但是這一條式子可以於選擇多級子元素 牛刀小試 父元素選取子元素 • $parent.find(‘‘.child’’) • $(‘‘.child’’,$parent) • $(‘‘.child’’,$(’’#parent’’)) • $parent.children(‘‘.child’’) • $(’’#parent > .child’’) • $(’’#parent .child’’) $parent.find('child') $('#parent').find('.child')
jsperf http://jsperf.com/jq-select-speed-compare/3
jsperf http://jsperf.com/jq-select-speed-compare/3
緩存 is better for (i = 0 ; i <
10000; i ++ ) { var a= $( ' .logo ); a.append(i); } var a= $( ' .logo ); for (i = 0 ; i < 10000 ; i ++ ) { a.append(i); } 盡量減少 $ 對 dom 的查找
幾個選擇器技巧: • length • is("visible") • .closeset()
Method Chaining 鍊式操作
Method Chaining $(‘‘div’‘).hide().css(‘‘color‘‘,‘‘blue‘‘).slideDown(); $(‘‘div’‘).hide(); $(‘‘div‘‘).css(‘‘color‘‘,‘‘blue‘‘); $(‘‘div’‘).slideDown(); 許多 JQuery 指令在執行完之後都會return this;
Method Chaining 優點 糟糕的寫法: $(‘‘#top’’).find(‘‘p.classA’’); $(‘‘#top’’).find(‘‘p.classB’’); $(‘‘div).find(‘‘h3’’).eq(2).html(‘‘hello); 採用鏈式寫法時,jQuery自動緩存每一步的結果,因此比非鏈式寫法要快。 更好的寫法是: var
$ele= $(‘‘#top’’); $ele.find(‘‘p.classA’’); $ele.find(‘‘p.classB’’);
牛刀小試 // [ ul ] // [ li , li
,li ] // [ li.hi , li.hi ,li.hi ] // [ ul ] // [ a , a , a ] // [ a , a , a ] // [ ul ]
事件
先來看個錯誤範例 因為 #container 還沒載入完全,所以 $(‘#id’) 為[ ],無法對 DOM 做任何的操作
ready v.s. load $(document).ready(function() { … }) 當 document 物件下所有
DOM都可以正確取得時 $(window).load(function() { … }) 與 JavaScript 裡的 window.onload 事件一模一樣 整個視窗裡所有資源都已經全部下載後才會執行, ex : 該頁面有 100 張圖片就會等 100 圖片都下載完才會執行 其中也包括所有 iframe 子頁面的內容必須完整載入
以 Document Ready 正確寫法
回調函數(callback) 許多 jQuery 函數涉及動畫。這些函數也許會將 speed 或 duration 作為可選參數。 典型語法 :
callback 參數是一個在 hide 操作完成後被執行的函數。
還是不懂 callback ? 函數a有一個參數,這個參數就是一個函數b 當函數a執行完以後執行函數b。那麼這個過程就叫回調。 函數a ( 送她到車站並且她到家 ) 執行完成後
=> 執行函數b( 發訊息給你 ) 白話: 跟心儀的對象約會結束後你送她到車站坐車回家,離別時 你肯定會說:「到家了給我發條信息,我很擔心你。」
$(this) vs this
$(this) 被jQuery處理的當前元素對象
$(this) v.s. this this ~~~ Magic ~~~ $(this) 當前元素被jQuery處理的對象 不成立,噴錯
參考資料 選取器效能 http://a272480.s103.gzonet.com/?action=show&id=101 http://class2u.com/group/jquery/forum/topics/jquery-selector-optimization Javascript / JQuery 優良寫法 http://design2u.me/blog/606/javascript-10-js-jquery-performance-tuning https://github.com/airbnb/javascript
jQuery 效能優化 http://fanli7.net/a/JAVAbiancheng/JSPjishu/20140227/473613.html
Thank you !!
Q & A