DOM-網路事件處理


Posted by stella572322 on 2020-09-25

DOM 文件物件模型

  • DOM 全名為 Document Object Model
  • 就是把 HTML 的標籤( Document ) 轉換成物件( Object )。

JavaScript 可以操作物件,但不能直接操作頁面上的標籤,所以 DOM 就是瀏覽器幫 object 轉換成 => HTML 對應的標籤,進而讓 JS 可以改變到頁面的元素。也就是說「DOM 就是 JS 跟 HTML 溝通的橋樑。」

選取元素

  • Tag
    document.getElementsByTagName("header");
  • Class Name
    document.getElementsByClassName("cotainerBody");
  • ID ( 注意:Element 沒有 s,因為 ID 元素只能有一個 )
    document.getElementById("container");
  • CSS 選擇器
    document.querySelector("#header p"); =>可以選取到 #header 底下的第一個 p
    document.querySelectorAll("#header p"); =>可以選取到 #header 底下所有的 p
  • 就像寫 CSS 來選擇元素。
    id#class 用 .tag<tag 本身>關係選擇器 > + ~

    • 但 querySelector 只會回傳第一個元素,如果想要選取到所有匹配到的元素,可以改用 querySelectorAll。
    • element.closest() 選取最靠近的父層元素
  • 注意:script 要放增加、刪減 className

增加、刪減 className

增加 : .classList.add("active")
移除 : .classList.remove("active")
開關 : .classList.toggle("active")
沒有此 class → 新增、有此 class → 移除
是否包含該 class : .classList.contains("active")在元素後面,不然 JS 無法對元素操作

修改 text & HTML

.innerText

  • 只抓取標籤裡的內容、不包含標籤本身
  • 只能寫入純文字,將要設定的值「賦值」到 innerText
    element.innerText = "content"

.innerHTML

  • 抓取標籤裡的所有內容、包含子標籤 ( 如果裡面沒有子標籤,抓取內容就跟 innerText 一樣 )
  • 跟 innerText 不同的是,可以寫入標籤
    element.innerHTML = "<div>content</div>"

.outerHTML

  • 改變標籤內容、包括標籤本身
    element.outerHTML = "<new-element>...<div>content</div>...<new-element>"

新增元素

  • 注意:要新增 or 刪除元素,要先找到它的父層,再利用 appendChild() or removeChild() 處理

  • 創造元素
    document.createElement('button') =>表示<button></button>

  • 加上屬性
    .setAttribute('data-value', num) =>表示<button data-value="num"></button>
  • 加上 className
    .classList.add('btn') =>表示 <button class="btn" data-value="num"></button>
  • 在 <目標物> 最後加上元素
    • 舉例:在 <div></div> 底下新增 <button></button> 元素
    • document.querySelector('div').appendChild(document.createElement('button')) => 表示 <div><button></button></div>
    • 舉例:在 <div></div> 底下新增 <button class="btn"></button> 元素
    • document.querySelector('div').appendChild(document.createElement('button').classList.add('btn')) => 表示 <div><button class="btn"></button></div>
  • 移除元素

    • 舉例:把 <div></div> 底下的 <button class="btn"></button> 元素移除
    • document.querySelector('div').removeChild(document.querySelector('.btn')) => 表示 <div><button class="btn"></button></div> 裡面這個 class="btn" 的元素就被移除掉了
  • 舉例:新增按鈕

    document.querySelector('.add__btn').addEventListener('click', () => {
    const btn = document.creatElement('button'); // 創造元素
    btn.setAttribute('data-value', num); // 加上屬性
    btn.classList.add('btn'); // 加上 className
    btn.innerText = num; // 加上內容 =>表示<button class="btn" data-value="num">num</button>
    document.querySelector('.outer').appendChild(btn); // 把新元素放上去
    })
    

事件監聽 Event Listener

  • 簡單來說就是指定畫面的某一元素,電腦會監聽當此元素發生 「什麼事」 、會再進行後續的反應,而我們可以指定監聽的「 事件 」是什麼、當它發生的這動作稱為 「觸發」。
  • 在 element 綁定一個 click 事件
  • 當滑鼠點擊到 element ,即觸發了element 的 click 事件,會進行 callback function
element.addEventListener('click', function(){
    // ... callback => 當按鈕點擊時、要做的動作
});

事件資訊 function(e)

  • onClick 事件發生的同時,瀏覽器會記下當下的數據(點選的位置, 點選的標籤, 相關內容),我們可以藉由程式碼來撈取我們所需要的訊息

  • event 資訊會放在 callback function 裡面的第一個參數,通常都是取名 event 或簡寫 e,可以當成是一個「 物件 」,裡面有各種此事件的參數值,例如:

  • click 點擊

    • e.target 點擊到的元素
    • e.screenX 滑鼠離視窗左邊的距離
    • e.screenY 滑鼠離視窗上邊的距離
  • 若是想拿到我們點擊的 element 屬性
    e.target.getAttribute('data-value')
  • keydown 按下按鍵
  • e.key 按鍵號碼

表單事件處理 onSubmit

  • 當表單 form 中的 submit 按鈕 click 的時候,會有個預設行為,就是「 送出表單 」,預設是 GET 方法,並把參數帶入原網址送出,而 submit 事件是在表單送出前會觸發,用處是可以拿來驗證表單內容。

  • 例如 密碼 跟 確認密碼 輸入的值不一樣的話,可以用 e.preventDefault() 來阻止表單送出。

<body>
  <form class="form" action="">
    密碼:<input type="password" name="password1">
    確認密碼:<input type="password" name="password2">
    <button type="submit">送出表單</button>
  </form>
  <script>
    const form = document.querySelector('.form');
    form.addEventListener('submit', function(e){
      const pw1 = document.querySelector('input[name="password1"]');
      const pw2 = document.querySelector('input[name="password2"]');
      if (pw1.value !== pw2.value) e.preventDefault(); // 密碼不同、無法送出表單
    });
  </script>
</body>
//重點:
事件監聽 Event Listener(滑鼠點、滾輪、鍵盤)
反應(變色、換頁、發API)
指令:
選到 節點(標籤) 加上 Listener 設定反應
`document.querySelector(節點).addEventListener(監聽, 反應)`

阻止預設動作 e.preventDefault()

  • 阻止瀏覽器上的特定元素在該事件預設的行為,以下是比較常用的情況:
    <form> 的 submit - 阻止送出表單
    <a> 的 click 事件 - 阻止跳網址
    <input> 的 keypress 事件 - 阻止輸入按鍵









Related Posts

[6] 持續整合,自動化測試的價值

[6] 持續整合,自動化測試的價值

資結、 Sorting Algorithms I

資結、 Sorting Algorithms I

「三元運算子」不好嗎?

「三元運算子」不好嗎?


Comments