# JS & DOM ##### Steve Jian --- ## 前端三巨頭 ![](https://i.imgur.com/clt6xDv.jpg) ---- ### HTML5 網站的基石 定義網頁的內容 ``` HTML <html> <head> <title>HTML Example</title> </head> <body> <button>Hello</button> </body> </html> ``` ---- ### CSS 將HTML中的元素(element) 套用不同的頁面樣式(style) ``` CSS button { color: blue; } ``` ---- ### JavaScript 使網頁產生互動 ``` javascript window.alert('Hi') ``` [Demo](https://codepen.io/steve5631/pen/rNNgXOX) --- ## JavaScript讓 ## 開發者與瀏覽器打交道? ---- 嚴格來說JavaScript並沒有提供網頁的操作方法 網頁的操作方法都是由 JS 的執行平台,也就是「瀏覽器」提供的 ---- ### 瀏覽器上的 JavaScript 實際上包含了 * JavaScript 核心 (以 ECMAScript 標準為基礎) * BOM (Browser Object Model) * DOM (Document Object Model) ---- 前端開發者就是透過 JavaScript 去呼叫 BOM 與 DOM 提供的 API,進一步透過它們去控制瀏覽器的行為與網頁的內容 ---- ![](https://i.imgur.com/myk8aoE.png) --- ## BOM (Browser Object Model) ## 瀏覽器物件模型 ---- 瀏覽器所有功能的核心,與網頁的內容無關 其核心是 window 物件 ---- 瀏覽器裡的 window 物件扮演著兩種角色 * ECMAScript 標準裡的「全域物件」 (Global Object) * JavaScript 用來與瀏覽器溝通的窗口 ---- 設定全域變數 ``` javascript var a = 10; console.log( window.a ); // 10 ``` ---- BOM API Demo ``` javascript window.alert("message"); //顯示一個對話框 window.history.back(); // 等同于点击浏览器的上一頁 ``` ---- 除了```alert()```之外瀏覽器還有提供很多BOM API 可以參考[MDN Window](https://developer.mozilla.org/zh-CN/docs/Web/API/Window) --- ### DOM (Document Object Model) ## 文件物件模型 ---- 將 HTML 文件以樹狀的結構來表示的模型,而組合起來的樹狀圖,我們稱之為「DOM Tree」 ---- 當一個網頁被載入到瀏覽器時,瀏覽器會先分析這個 HTML 檔案,然後會依照這份 HTML 的內容解析成「DOM」 ---- ``` html <html> <head> <title>一個簡單的網頁</title> </head> <body> <h1>這是標題</h1> <p>這是一個<i>簡單</i>的網頁</p> </body> </html> ``` ---- ![](https://i.imgur.com/ZLTM6GZ.png) --- 複習一下GitHub把等等要用的範例clone下來 [傳送門](https://github.com/steve5631/EX.code) ---- 取得節點 ``` javascript // 根據傳入的值,找到 DOM 中 id 為 'xxx' 的元素。 document.getElementById('xxx'); // 針對給定的 tag 名稱,回傳所有符合條件的 NodeList 物件 document.getElementsByTagName('xxx'); // 針對給定的 class 名稱,回傳所有符合條件的 NodeList 物件。 document.getElementsByClassName('xxx'); //針對給定的 Selector 條件,回傳第一個 或 所有符合條件的 NodeList document.querySelector('xxx'); ``` ---- DOM 節點的類型 * ELEMENT_NODE (1) HTML 元素的 Element 節點 * TEXT_NODE (3) 實際文字節點,包括了換行與空格 * COMMENT_NODE (8) 註解節點 * DOCUMENT_NODE (9) 根節點 (Document) ---- 可以用.nodeType查看節點類型 ![](https://i.imgur.com/pjyWB3j.png) --- ### 子節點 DOM 節點有分層的概念 每個節點物件都有 childNodes 屬性 回傳所有子節點的NodeList 物件 ---- ![](https://i.imgur.com/wOeu2xZ.png) ---- ### 父節點 parentNode 屬性可以用來取得父元素 ![](https://i.imgur.com/Gqyiytj.png) --- ### 新增節點 ``` javascript //建立一個元素節點 document.createElement('tagName'); //建立一個文字節點 document.createTextNode('Text'); ``` 建立新的節點後,這時候我們在瀏覽器上還看不到它,需將新元素加入至指定的位置之後才會顯示。 ---- appendChild(newNode) 可以將指定的 childNode 節點,加入到 Node 父容器節點的末端 ``` javascript // 取得容器 var myList = document.querySelector('.container') // 建立新的 <li> 元素 var newList = document.createElement('li'); // 建立 textNode 文字節點 var textNode = document.createTextNode("Hello world!"); // 透過 appendChild 將 textNode 加入至 newList newList.appendChild(textNode); // 透過 appendChild 將 newList 加入至 myList myList.appendChild(newList); ``` ---- ![](https://i.imgur.com/jPmyKLs.png) ---- insertBefore(newNode, refNode) 方法,則是將新節點 newNode 插入至指定的 refNode 節點的前面 ``` javascript // 取得容器 var myList = document.querySelector('.container') // 取得 "<li>Item 02</li>" 的元素 var refNode = myList.childNodes[2]; // 建立 li 元素節點 var newNode = document.createElement('li'); // 建立 textNode 文字節點 var textNode = document.createTextNode("Hello world!"); newNode.appendChild(textNode); // 將新節點 newNode 插入 refNode 的前方 myList.insertBefore(newNode, refNode); ``` ---- ![](https://i.imgur.com/RnhHJZU.png) ---- replaceChild(newChildNode, oldChildNode) 方法,則是將原本的 oldChildNode 替換成指定的 newChildNode ```javascript // 取得容器 var myList = document.querySelector('body') // 選擇被取代的節點 var oldNode = document.querySelectorAll('h1')[0]; // 建立 h1 元素節點 var newNode = document.createElement('h1'); // 建立 textNode 文字節點 var textNode = document.createTextNode("Hello world!"); newNode.appendChild(textNode); // 將原有的 oldNode 替換成新節點 newNode myList.replaceChild(newNode, oldNode); ``` ---- ![](https://i.imgur.com/8IdjgT7.png) --- 事件的註冊綁定 對 HTML 元素來說,只要支援某個「事件」的觸發,就可以透過 on+事件名 的屬性來註冊事件: ``` html <button id="btn" onclick="console.log('HI');">Click</button><button id="btn" onclick="console.log('HI');">Click</button> ``` ---- 上面範例,透過 onclick 屬性 我們就可以在```<button>```元素上面註冊 click 事件 換句話說,當我按下這個```<button>```元素時 就會執行```console.log('HI');```的程式碼。 --- 練習時間~ 請參考DOM.html的原始碼 新增一個按鈕使計數器遞減 --- # *fin* ![](https://i.imgur.com/HCHBybK.jpg)
{"metaMigratedAt":"2023-06-15T01:58:02.462Z","metaMigratedFrom":"YAML","title":"JS & DOM","breaks":true,"slideOptions":"{\"transition\":\"slide\"}","contributors":"[{\"id\":\"d182e945-f719-41cd-8488-cb93bdb49c93\",\"add\":5619,\"del\":975}]"}
    491 views