DOM 物件和 BOM 物件
DOM物件
1. DOM 簡介
DOM (Document Object Model)是 W3C 的標準,是指文件物件模型(樹結構)。
DOM 定義了訪問和操作 HTML 文件的標準方法。通過它,可以訪問HTML文件的所有元素。
2. HTML DOM 樹
3. DOM 節點
根據 W3C 的 HTML DOM 標準,HTML 文件中的所有內容都是節點(NODE):
- 文件節點:整個文件(document物件)
- 元素節點:每個 HTML 元素(element 物件)
- 文字節點:HTML 元素內的文字(text物件)
- 屬性節點:每個 HTML 屬性(attribute物件)
- 註釋節點:註釋(comment物件)
畫dom樹是為了展示文件中各個物件之間的關係,用於物件的導航。這裡只需要記住 Document 物件和 Element 物件即可。
4. DOM 查詢
直接查詢
// 根據標籤名獲取標籤合集 const div1 = document.getElementsByTagName("div"); // div1 div2 div3 div4 div5 (元素集合 HTMLCollection) const div2 = document.querySelectorAll("div"); // div1 div2 div3 div4 div5 (節點集合 NodeList) // 根據class屬性獲取 const div3 = document.getElementsByClassName("div"); // div1 div2 (元素集合 HTMLCollection) const div4 = document.querySelectorAll(".div"); // div1 div2 (節點集合 NodeList) // 根據id屬性值獲取 const div5 = document.getElementById("div"); // div3 (一個標籤) const div6 = document.querySelectorAll("#div"); // div3 (節點集合 NodeList) // 根據name屬性值獲取 const div7 = document.getElementsByName("div"); // div4 div5 (節點集合 NodeList) // 根據標籤名獲取標第一個 const div8 = document.querySelector("div"); // div1 (一個標籤)
間接查詢
parentElement //父節點標籤元素
children //所有子標籤
firstElementChild //第一個子標籤元素
lastElementChild //最後一個子標籤元素
nextElementtSibling //下一個兄弟標籤元素
previousElementSibling //上一個兄弟標籤元素
// 示例:
var ele1=document.getElementsByTagName("a")[0];
var ele2=ele1.parentElement;
console.log(ele2);
5. DOM 操作
// 建立節點
var divEle = document.createElement("div");
var pEle = document.createElement("p");
var aEle = document.createElement("a");
// 新增節點
document.body.appendChild(divEle); // 將上面建立的div元素加入到body的尾部
document.body.insertBefore(pEle, divEle); // 在body下,將p元素新增到div元素前面
//替換節點
document.body.replaceChild(aEle, pEle); // 在body下,用a元素替換p元素
//設定文字節點
aEle.innerText = "在幹嘛"
divEle .innerHTML = "<p>在幹嘛<p/>"
//設定屬性
divEle .setAttribute("class","list"); // 給div元素加上class='list'屬性
//獲取class值
divEle.className // 獲取div元素上的class
// 設定style樣式
divEle.style.color = "red"; // 把div元素的color樣式設定成red
divEle.style.margin = "10px"
divEle.style.width = "10px"
divEle.style.left = "10px"
divEle.style.position = "relative"
6. DOM 事件
HTML 4.0 的新特性之一是有能力使 HTML 事件觸發瀏覽器中的動作(action),比如當用戶點選某個 HTML 元素時啟動一段 JavaScript。下面是一個屬性列表,這些屬性可插入 HTML 標籤來定義事件動作。
常用事件:
onclick 當用戶點選某個物件時呼叫的事件控制代碼。
ondblclick 當用戶雙擊某個物件時呼叫的事件控制代碼。
onfocus 元素獲得焦點。 //練習:輸入框
onblur 元素失去焦點。 //應用場景:用於表單驗證,使用者離開某個輸入框時,代表已經輸入完了,我們可以對它進行驗證。
onchange 域的內容被改變。//應用場景:通常用於表單元素,當元素內容被改變時觸發,(三級聯動)
onkeydown 某個鍵盤按鍵被按下。//應用場景: 當用戶在最後一個輸入框按下回車按鍵時,表單提交。
onkeypress 某個鍵盤按鍵被按下並鬆開。
onkeyup 某個鍵盤按鍵被鬆開。
onload 一張頁面或一幅影象完成載入。
onmousedown 滑鼠按鈕被按下。
onmousemove 滑鼠被移動。
onmouseout 滑鼠從某元素移開。
onmouseover 滑鼠移到某元素之上。
onmouseleave 滑鼠從元素離開
onselect 文字被選中。
onsubmit 確認按鈕被點選。
7. DOM 優化
DOM 操作都是代價昂貴的操作,它會導致 WEB 應用程式的 UI 反應遲鈍。所以,應當儘可能減少這類過程的發生。
// 不快取 DOM 查詢結果
for (let i = 0; i < document.getElementsByTagName("div").length; i++) {
// 每次迴圈,都會計算length,頻繁進行 DOM 查詢
}
// 快取 DOM 查詢結果
const div = document.getElementsByTagName("div");
const length = div.length;
for (let i = 0; i < length; i++) {
// 只進行一次 DOM 查詢
}
將頻繁的 DOM 操作改成一次性操作:
var el = document.getElementById('mydiv');
// 未優化前的DOM操作,會導致三次重排
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';
// 優化後的DOM操作,只會一次重排
el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';
BOM 物件
BOM(Browser Object Model)
是指瀏覽器物件模型,可以對瀏覽器視窗進行訪問和操作。
使用 BOM,開發者可以移動視窗、改變狀態列中的文字以及執行其他與頁面內容不直接相關的動作。
使 JavaScript 有能力與瀏覽器"對話"。
1. window 物件
window物件是客戶端JavaScript最高層物件之一,由於window物件是其它大部分物件的共同祖先,在呼叫window物件的方法和屬性時,可以省略window物件的引用。例如:window.document.write()
可以簡寫成:document.write()
。
- 所有瀏覽器都支援 window 物件。它表示瀏覽器視窗;
- 概念上講:一個html文件對應一個window物件;
- 功能上講:控制瀏覽器視窗的;
- 使用上講:window物件不需要建立物件,直接使用即可;
- 所有 JavaScript 全域性物件、函式以及變數均自動成為 window 物件的成員;
- 全域性變數是 window 物件的屬性。全域性函式是 window 物件的方法。
window物件方法:
alert() 顯示帶有一段訊息和一個確認按鈕的警告框。
confirm() 顯示帶有一段訊息以及確認按鈕和取消按鈕的對話方塊。
prompt() 顯示可提示使用者輸入的對話方塊。
open() 開啟一個新的瀏覽器視窗或查詢一個已命名的視窗。
close() 關閉瀏覽器視窗。
setInterval() 按照指定的週期(以毫秒計)來呼叫函式或計算表示式。
clearInterval() 取消由 setInterval() 設定的 timeout。
setTimeout() 在指定的毫秒數後呼叫函式或計算表示式。
clearTimeout() 取消由 setTimeout() 方法設定的 timeout。
2. Navigator 物件
Navigator 物件包含有關瀏覽器的資訊。
const ua = navigator.userAgent;
// Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36
3. Screen 物件
Screen 物件包含有關客戶端顯示螢幕的資訊。
console.log(screen); // Screen {availWidth: 1920, availHeight: 1040, width: 1920, height: 1080, colorDepth: 24, …}
console.log(screen.width); // 1920
console.log(screen.height); //1080
4. Location 物件
Location 物件包含有關當前 URL 的資訊。
Location 屬性:
// 獲取完整的url
location.href; // "https://www.baidu.com/?id=123&num=456"
// 跳轉到指定頁面(可以返回上一個頁面)
location.href="https://www.baidu.com/";
// 獲取url的協議部分
location.protocol; // "https:"
// 獲取url的主機名和埠
location.host; // "www.baidu.com"
// 獲取url的查詢部分(問號 ? 之後的部分)
location.search; // "?id=123&num=456"
Location 方法:
// 重新載入頁面,即重新整理
location.reload();
// 載入一個新的文件,跳轉到指定頁面(可以返回上一個頁面)
location.assign("https://www.baidu.com/");
// 跳轉到指定頁面(不可以返回上一個頁面)
location.replace("https://www.baidu.com/");
5. History 物件
History 物件包含使用者(在瀏覽器視窗中)訪問過的 URL。
History 物件方法:
history.forward() // 前進一頁
history.back() // 後退一頁