SlideShare une entreprise Scribd logo
1  sur  125
11. DOM、事件與樣式
• 學習目標
– 認識DOM操作
– 處理事件
– 掌握樣式
– 建立程式庫封裝細節
2
瀏覽器物件模型
• Browser Object Model
• Level 0 DOM
3
window
• JavaScript在瀏覽器執行時的全域物件
– alert、confirm、prompt、setTimeout、
clearTimeout、setInterval、
clearInterval、open、moveTo、scroll、
scrollTo
4
• navigator代表了瀏覽器
• location代表HTML頁面的URL
• frames收集了視窗中擁有的iframe對應
物件
5
• screen物件包括視窗目前所處的螢幕資訊
• history包括了瀏覽器瀏覽歷史
• document代表整份HTML文件
– forms、links、anchors、images…
6
7
• 想要取得文件中name為login的表單
• forms、links、anchors、images等,
都可以用這種方式來取得各自對應的元素
• 想取得name屬性為"user"的輸入文字框
8
• 超鏈結與錨點都是使用a標籤定義
– 超鏈結使用href屬性
– 錨點使用name屬性
• document.links與
document.anchors分別用來表示超鏈結
與錨點元素
• documents.images表示文件中的img標
籤對應的元素
9
• document.all代表文件中全部元素
• document.cookie允許設定與讀取
Cookie
10
文件物件模型
• Document Object Model(DOM)是
W3C制定
11
12
• document是Document的實例,代表整份
文件,而不是html標籤節點
• document.documentElement也可用來
取得html標籤對應的元素
• 如果想取得body標籤元素,可以透過
document.body來取得
• 文字也會形成樹狀結構中的元素。
13
• DOM API分為兩部份,一個是核心DOM
API,一個是HTML DOM API
14
走訪HTML文件
• parentNode:取得父節點
• previousSibling:前鄰接節點
• nextSibling:後鄰接節點
• firstChild:首個子節點
• lastChild:最後一個子節點
• childNodes:所有直接子節點
15
16
• parentElement:取得父元素。
• previousElementSibling:前鄰接元
素
• nextElementSibling:後鄰接元素
• firstElementChild:首個子元素
• lastElementChild:最後一個子元素
• children:所有直接子元素
17
18
• getElementsByTagName()
• getElementById()
• getElementsByName()
• getElementsByClassName()
19
20
選擇器語法
• querySelector()
• querySelectorAll()
21
22
標籤屬性與DOM特性
• 屬性(Attribute)與特性(Property)
• 多數情況下,屬性名稱是什麼,特性名稱
也會是什麼,如果標籤上設定某屬性,屬
性值為何,特性值多半就是為何
23
• 若標籤沒有設置屬性,DOM物件上的特性
會有預設值
• JavaScript中的保留字或關鍵字必須迴避
• for屬性  htmlFor特性
24
• img標籤的src屬性,就算設定為相對URL,
從對應的DOM物件上src特性取得的值一
律都是絕對URL
• 特性名稱有大小寫之別
– cellspacing、colspan、frameborder、
maxlength、readonly、rowspan、
tabindex、usemap等
– 要透過DOM特性取得必須是cellSpacing、
colSpan、frameBorder、maxLength、
readOnly、rowSpan、tabIndex、useMap
等
25
• 有個初學者常犯的錯誤,忽略了文字也是
DOM節點
• innerHTML
• textContent
26
attributes特性
27
• getAttribute()
• setAttribute()
• removeAttribute()
• 沒有任何操作可以將DOM對應於屬性的特
性移除
28
• 如果直接改變DOM上的特性,
attributes會有對應的變化
• input標籤的value屬性值,其實是對應
DOM元素的defaultValue
29
• 對input來說,想要影響
getAttribute('value')的結果
– 修改defaultValue
– 透過setAttribute()
30
修改DOM樹
31
32
33
34
• createElement()用來建立標籤對應的
元素
• 若要建立文字節點,必須使用
createTextNode()
35
大量節點操作
36
封裝DOM操作
37
38
39
40
41
42
43
44
45
46
47
48
49
50
基本事件模型
• 沒有標準化,然而基本事件模型在過去,
跨瀏覽器時較有一致性(當時的IE不支援標
準事件模型)
51
52
• 行內模型(Inline model)或行內註冊模型
(Inline registration model)
53
• 現在不鼓勵這類的寫法
• 上例相當於:
54
55
• 若是使用行內模型…
56
• 事件不一定要由使用者的操作觸發,也可
以直接呼叫方法來觸發事件
57
• 基本事件模型的缺點之一,就是事件的對
應特性只能設定一個值
58
• 事件模型在DOM Level 2時獲得標準化
• 允許事件設置多個事件處理器
• Edge、Internet Explorer 9/10/11都支援
標準事件模型
• 使用addEventListener()方法來註冊事
件處理器
59
標準事件模型
60
61
標準事件傳播
• Event實例會作為事件處理器的的第一個
參數
• 若要取得操作的目標物件,可以透過
Event實例的target特性
• 事件氣泡傳播(Event Bubbling)
– 事件不僅會觸發操作的目標元素,還會往目標
元素的父階層傳播並觸發事件
62
63
• 許多場合可以善用事件傳播,減輕個別元
素持有事件處理器的負擔
64
• 標準事件模型中,事件其實會歷經兩個傳
播階段
– 捕捉階段(Capturing phase
– 氣泡階段(Bubbling phase)
65
封裝事件處理
66
67
68
存取樣式資訊
• style屬性
69
style特性
70
• 標籤style屬性對應於元素style特性
71
• 如果沒有設置style屬性,透過style特
性,取得的各個樣式值就會是空字串
• 透過樣式表定義的樣式資訊,無法從元素
的style特性取得
• 建議將style特性用於設定樣式,而不是
取得樣式
72
• 想取得元素的樣式資訊,建議取得元素的
計算樣式(Computed style)
• 在遵守標準的瀏覽器,可以使用window的
getComputedStyle()函式
73
74
盒模型(Box model)
• 將元素當作盒子來看待時,可以怎麼描述
這個盒子
75
• 內容(content)
• 邊框(border)
• 內距(padding)
• 邊距(margin)
76
• style的width與height是用來指定內容
的寬、高
77
78
• 想知道元素在文件中佔用的總空間相關資
訊,也就是內容、內距與邊框的加總
• 可以透過offsetWidth與offsetHeight
來取得
79
80
81
82
存取元素位置
• 樣式的position屬性可以設定不同的值,
代表元素的定位方式
– static
– relative
– absolute
– fixed
• 元素的top、left、bottom、right
83
• 大多數元素預設是static,元素依序、流
動式地繪製版面上
• 設為static時,top、left、right、
bottom的設置沒有作用
84
• relative是指元素相對於static應有的
位置進行偏移
• 依序、流動式地繪製版面之後,依top、
left或bottom、right設定偏移
– 若元素左上位置,在本來流動式地繪製後
100x50
– 若設定元素的position為relative,而top、
left分別為20、30的話
– 元素最後的左上角位置會是
(100+20)x(50+30)=120x80 的位置
85
• position屬性設為absolute表示絕對定
位
• 以最接近的非static父元素為絕對定位參
考元素
– 若有個a是relative定位,其中有個span是
absolute定位
– 那麼span設定的top、left,會是以a元素的
上緣與左緣來進行絕對定位
86
• 在絕對定位時,元素可以堆疊
• 可利用z-index屬性來設定堆疊順序,數
值越大,表示在越上層
• z-index預設是頁面中標籤定義的順序,
越後面定義的標籤z-index越大
87
88
89
90
• fixed定位是以瀏覽器視埠(view-port)
為參考
– 例如,想讓某元素在捲動後,依舊可以在可視
畫面中的100x50 的位置
– 可以將position設為fixed,此時top、
left與bottom、right就是相對於可視畫面
91
• 若要取得元素相對於body的確實位置,必
須認識元素的offsetParent特性
• offsetParent是元素的父階層中最接近
的已定位(positioned)元素
• 如果元素本身的position被設為fixed,
offsetParent會是null
92
• 在不考慮捲軸的情況下
93
94
95
96
顯示、可見度與透明度
• display
• visibility
• opacity
97
• style的display用來設定元素在頁面上
的排版顯示方式
98
99
100
• 設定style的visibility為visible或
hidden,就是純綷視覺上可見或隱藏
• hidden時雖然畫面上看不見,排版仍會考
慮,也就是元素在畫面上仍會佔有空間
101
102
• 元素的不透明度設定,可以設定style的
opacity來決定,值可以是1到0
103
104
105
106
操作class屬性
• 標籤的class屬性可以設罝多個類別名稱,
多個類別之間,必須使用空白區隔
• 在早期的DOM API,若想使用程式來確定
class屬性是否設置了某名稱,必須剖析
這個以空白作區隔的字串
• 若要新增或刪除類別,必須在字串中附加
或剔除名稱
107
108
• HTML5的DOM元素具有classList特性
109
110
111
視窗維度相關資訊
• 要取得文件寬高,可以在
document.documentElement以
scrollWidth、scrollHeight取得。
• 要取得body高,可以使用document.body的
scrollWidth、scrollHeight取得。
• 要取得螢幕資訊,screen有可以使用的特性:
• 要取得螢幕的寬高,可以使用width、
height取得。
• 要取得螢幕可用區域的寬高,不含工具列的範
圍,可在availWidth、availHeight取得。
112
• 瀏覽器寬高等相關的資訊,可以在 window
物件上取得:
• 視窗在螢幕中的位置:screenX、screenY。
• 視窗寬、高:outerWidth、outerHeight。
• 視埠區域寬高(不包括選單、工具列、捲軸):
innerWidth、innerHeight。
• 水平、垂直捲軸位置:pageXOffset、
pageYOffset。
113
封裝樣式處理
114
115
116
117
118
119
120
121
122
123
124
125

Contenu connexe

Tendances

从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性
DoCode org
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Justin Lin
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Justin Lin
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Justin Lin
 

Tendances (20)

5. 建構式、原型與類別
5. 建構式、原型與類別5. 建構式、原型與類別
5. 建構式、原型與類別
 
14. 進階主題
14. 進階主題14. 進階主題
14. 進階主題
 
CH10:輸入輸出
CH10:輸入輸出CH10:輸入輸出
CH10:輸入輸出
 
反射與類別載入器
反射與類別載入器反射與類別載入器
反射與類別載入器
 
從模組到類別
從模組到類別從模組到類別
從模組到類別
 
4. 使用物件
4. 使用物件4. 使用物件
4. 使用物件
 
CH14:NIO 與 NIO2
CH14:NIO 與 NIO2CH14:NIO 與 NIO2
CH14:NIO 與 NIO2
 
資料永續與交換
資料永續與交換資料永續與交換
資料永續與交換
 
Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝Java SE 8 技術手冊第 5 章 - 物件封裝
Java SE 8 技術手冊第 5 章 - 物件封裝
 
Phpar模型实践
Phpar模型实践Phpar模型实践
Phpar模型实践
 
从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性从浏览器渲染看标准的重要性
从浏览器渲染看标准的重要性
 
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行APIJava SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
Java SE 7 技術手冊投影片第 11 章 - 執行緒與並行API
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
9. 資料結構
9. 資料結構9. 資料結構
9. 資料結構
 
Ch04 會話管理
Ch04 會話管理Ch04 會話管理
Ch04 會話管理
 
CH11:執行緒與並行API
CH11:執行緒與並行APICH11:執行緒與並行API
CH11:執行緒與並行API
 
並行與平行
並行與平行並行與平行
並行與平行
 
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
Java SE 7 技術手冊投影片第 10 章 - 輸入輸出
 
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
Java SE 7 技術手冊投影片第 16 章 - 自訂泛型、列舉與標註
 
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
Java SE 7 技術手冊投影片第 15 章 - 反射器與類別載入器
 

Similaire à 11. DOM、事件與樣式

客户端存储与计算
客户端存储与计算客户端存储与计算
客户端存储与计算
xiaotao ning
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
pan weizeng
 
前端性能测试
前端性能测试前端性能测试
前端性能测试
tbmallf2e
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps
Adam Lu
 
Zh tw introduction_to_hadoop and hdfs
Zh tw introduction_to_hadoop and hdfsZh tw introduction_to_hadoop and hdfs
Zh tw introduction_to_hadoop and hdfs
TrendProgContest13
 
那些年,我们一起跨过域
那些年,我们一起跨过域那些年,我们一起跨过域
那些年,我们一起跨过域
ksky521
 
Fiddler for chrom extension
Fiddler for chrom extensionFiddler for chrom extension
Fiddler for chrom extension
Welefen Lee
 

Similaire à 11. DOM、事件與樣式 (20)

Web dev road map part one
Web dev road map part oneWeb dev road map part one
Web dev road map part one
 
Html5
Html5Html5
Html5
 
客户端存储与计算
客户端存储与计算客户端存储与计算
客户端存储与计算
 
美团前端架构简介
美团前端架构简介美团前端架构简介
美团前端架构简介
 
前端性能测试
前端性能测试前端性能测试
前端性能测试
 
Javascript
JavascriptJavascript
Javascript
 
OPM
OPMOPM
OPM
 
一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps一步一步开发Html5 mobile apps
一步一步开发Html5 mobile apps
 
Dev camps Windows Store App 市集應用程式最佳實踐
Dev camps   Windows Store App 市集應用程式最佳實踐Dev camps   Windows Store App 市集應用程式最佳實踐
Dev camps Windows Store App 市集應用程式最佳實踐
 
Zh tw introduction_to_hadoop and hdfs
Zh tw introduction_to_hadoop and hdfsZh tw introduction_to_hadoop and hdfs
Zh tw introduction_to_hadoop and hdfs
 
前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关前端调试工具,编码相关,性能相关
前端调试工具,编码相关,性能相关
 
Html5和css3入门
Html5和css3入门Html5和css3入门
Html5和css3入门
 
Peggy 重新認識java script
Peggy 重新認識java scriptPeggy 重新認識java script
Peggy 重新認識java script
 
那些年,我们一起跨过域
那些年,我们一起跨过域那些年,我们一起跨过域
那些年,我们一起跨过域
 
HTML5 Samples
HTML5 SamplesHTML5 Samples
HTML5 Samples
 
AJAX Basic
AJAX BasicAJAX Basic
AJAX Basic
 
Html5移动网站开发实践
Html5移动网站开发实践Html5移动网站开发实践
Html5移动网站开发实践
 
Fiddler for chrom extension
Fiddler for chrom extensionFiddler for chrom extension
Fiddler for chrom extension
 
Ch01 簡介Web應用程式
Ch01 簡介Web應用程式Ch01 簡介Web應用程式
Ch01 簡介Web應用程式
 
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練22016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
2016年逢甲大學資訊系:ASP.NET MVC 4 教育訓練2
 

Plus de Justin Lin

Plus de Justin Lin (20)

Ch14 簡介 Spring Boot
Ch14 簡介 Spring BootCh14 簡介 Spring Boot
Ch14 簡介 Spring Boot
 
Ch13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/SecurityCh13 整合 Spring MVC/Security
Ch13 整合 Spring MVC/Security
 
Ch12 Spring 起步走
Ch12 Spring 起步走Ch12 Spring 起步走
Ch12 Spring 起步走
 
Ch11 簡介 JavaMail
Ch11 簡介 JavaMailCh11 簡介 JavaMail
Ch11 簡介 JavaMail
 
Ch10 Web 容器安全管理
Ch10 Web 容器安全管理Ch10 Web 容器安全管理
Ch10 Web 容器安全管理
 
Ch09 整合資料庫
Ch09 整合資料庫Ch09 整合資料庫
Ch09 整合資料庫
 
Ch08 自訂標籤
Ch08 自訂標籤Ch08 自訂標籤
Ch08 自訂標籤
 
Ch07 使用 JSTL
Ch07 使用 JSTLCh07 使用 JSTL
Ch07 使用 JSTL
 
Ch06 使用 JSP
Ch06 使用 JSPCh06 使用 JSP
Ch06 使用 JSP
 
Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器Ch05 Servlet 進階 API、過濾器與傾聽器
Ch05 Servlet 進階 API、過濾器與傾聽器
 
Ch03 請求與回應
Ch03 請求與回應Ch03 請求與回應
Ch03 請求與回應
 
Ch02 撰寫與設定 Servlet
Ch02 撰寫與設定 ServletCh02 撰寫與設定 Servlet
Ch02 撰寫與設定 Servlet
 
CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式CH1. 簡介 Web 應用程式
CH1. 簡介 Web 應用程式
 
13.並行、平行與非同步
13.並行、平行與非同步13.並行、平行與非同步
13.並行、平行與非同步
 
12. 除錯、測試與效能
12. 除錯、測試與效能12. 除錯、測試與效能
12. 除錯、測試與效能
 
11. 常用內建模組
11. 常用內建模組11. 常用內建模組
11. 常用內建模組
 
8. open() 與 io 模組
8. open() 與 io 模組8. open() 與 io 模組
8. open() 與 io 模組
 
7. 例外處理
7. 例外處理7. 例外處理
7. 例外處理
 
6. 類別的繼承
6. 類別的繼承6. 類別的繼承
6. 類別的繼承
 
4. 流程語法與函式
4. 流程語法與函式4. 流程語法與函式
4. 流程語法與函式
 

11. DOM、事件與樣式