HTML Hypertext Markup Language),中文為「超文字標示語言」,是一種用來組織架構並呈現網頁內容的程式語言。網頁內容的組成,可能包含了段落、清單、圖片或表格…等。
JavaScript 操作 DOM 的一些方法 DOM:文件物件模型(Document Object Model), 瀏覽器幫 HTML 的元素節點轉換成 JavaScript 可以操作的物件。
選取元素 1 let element = document.querySelector('<element-name>');
新增元素節點 1 document.createElement("div");
e.g.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <body> <h1>學校每位老師的名字</h1> <ul class="school"> <li>王老師</li> </ul> </body> let el = document.querySelector(".school"); // 選取 ul 的這個 class let dataLen = data.length; //資料長度 for (let i = 0; i < dataLen; i++) { var str = document.createElement("li"); // 新增元素 li str.textContent = data[i].teacher; // li 內的字串要顯示老師的名字 el.appendChild(str); // 增加子節點為 str 的內容 }
在某元素後面加入元素
移除該元素
改變元素裡面的文字內容
改變元素文字及標籤內容
ps. 使用上要注意,有時會有安全性上的問題
新增元素節點樣式
刪除元素節點樣式
監聽元素事件 1 2 3 4 element.addEventLister('事件名稱', function(e){ // do something },<boolean>) true => 捕獲 ; false => 冒泡,不加參數的話,預設值是 false
e.g. click 事件(e.target 點擊到的元素) 1 2 3 4 5 6 7 8 <div id="test"></div> <script> document.getElementById("test").addEventListener("click", function( event ) { // 在 “clicked div”顯示點擊次數 event.target.innerHTML = "click count: " + event.detail; }, false); </script>
DOM 事件傳遞機制 捕獲
根節點開始往下傳遞子節點然後到 target
冒泡
從 target 往上到子節點一路逆向傳回去根節點
DOM 事件傳遞的順序,先捕獲 -> 自身 -> 冒泡。
取消事件傳遞 1 *加在哪邊,事件傳遞就停在那,不向上(或下)級傳遞*
el.addEventListener(‘click’, (e) => { // e.eventPhase 回傳一個整數值以代表目前事件於事件流中的傳遞階段 console.log(‘el’, e.eventPhase); e.stopPropagation(); }, true)
1 #### 取消預設行為 ```e.preventDefault()
取消瀏覽器的預設行為
1 2 3 4 5 6 // 超連結使用(不會新開分頁或是跳轉) el_link.addEventListener('click', (e) => { e.preventDefault(); }, false) // <form> 的 submit - 阻止送出表單 // <input> 的 keypress 事件 - 阻止輸入按鍵
事件傳遞應用 事件代理(Delegation) 利用 DOM 事件的冒泡特性,將子層元素的監聽事件綁定在父層元素上,好處有: 1.如果有很多子元素,就不用一一綁定監聽事件。 2.動態新增進來的子元素,因為也是會冒泡到上層,就不怕沒綁定到監聽。
元素操作範例 印出 9*9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 (function() { const chart = document.querySelector('#chart'); for (let i = 2; i <= 9; i++) { const DIV = document.createElement('div'); // 新增 DIV 節點 DIV.classList.add('col-md-4'); // 新增 DIV 樣式 chart.appendChild(DIV); // id=chart 的元素增加子節點 DIV // chart.append 將字串插入到網頁元素 const UL = document.createElement('ul'); UL.classList.add('chart-list', 'list-unstyled', 'bg-light'); DIV.appendChild(UL); let str = `<li class="chart-num">${ i }</li>`;// 2 ~ 9 // 組開頭數字 2~9 字串 //console.log('外層for', str); for (let j = 1; j <= 9; j++) { str += `<li class="h4">${ i } x ${ j } = ${ i*j }</li>`; // 2 x 1 ~ 9 x 9 //console.log('內層for', str); } //console.log('結果', str); UL.innerHTML = str; // 將字串插入到網頁元素 } }()); //立即呼叫函式 IIFE
印出正方形 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function square(size){ const chart = document.querySelector('#chart1'); for (let i = 1; i <= size; i++) { // 印出第i列 for (let j = 1; j <= size; j++) { // 第i列有size個* const sp = document.createElement('span'); sp.classList.add('col-md-4') chart.appendChild(sp); // 增加 span 元素 let str = `*`; sp.innerHTML = str; // 新增元素內容 } const Br = document.createElement('br'); chart.appendChild(Br); // 增加斷行元素 } };
印出斜一邊的三角形 1 2 3 4 5 6 7 8 9 10 11 12 13 14 function sidetriangle(size) { const chart = document.querySelector('#chart2'); for (let i = 1; i <= size; i++) { // 印出第i列 for (let j = 1; j <= i; j++) { // 第i列有i個* const sp = document.createElement('span'); sp.classList.add('col-md-4') chart.appendChild(sp); // 增加 span 元素 let str = `*`; sp.innerHTML = str; // 新增元素內容 } const Br = document.createElement('br'); chart.appendChild(Br); // 增加斷行元素 } };
參考:MDN DOM 的事件傳遞機制:捕獲與冒泡 https://yakimhsu.com/project/project_w10_review_DOM&EventListener.html