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
What’s New in Compose Multiplatform - A Live Tour (droidcon London 2024)
zsmb
1
480
React への依存を最小にするフロントエンド設計
takonda
12
3.5k
subpath importsで始めるモック生活
10tera
0
320
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
130
Nurturing OpenJDK distribution: Eclipse Temurin Success History and plan
ivargrimstad
0
1k
レガシーシステムにどう立ち向かうか 複雑さと理想と現実/vs-legacy
suzukihoge
14
2.3k
Jakarta EE meets AI
ivargrimstad
0
200
見せてあげますよ、「本物のLaravel批判」ってやつを。
77web
7
7.8k
シェーダーで魅せるMapLibreの動的ラスタータイル
satoshi7190
1
480
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
5
350
Arm移行タイムアタック
qnighy
0
340
Featured
See All Featured
Happy Clients
brianwarren
98
6.7k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
The Cult of Friendly URLs
andyhume
78
6k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Navigating Team Friction
lara
183
14k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
10
720
A designer walks into a library…
pauljervisheath
204
24k
Typedesign – Prime Four
hannesfritz
40
2.4k
Practical Orchestrator
shlominoach
186
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
The Cost Of JavaScript in 2023
addyosmani
45
6.8k
Agile that works and the tools we love
rasmusluckow
327
21k
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