Try   HackMD

event.preventDefault() 跟 event.stopPropagation() 差別

tags: DOM

event.preventDefault()

取消事件的預設行為,例如避免送出表單或阻止超連結。
但是不會影響事件傳遞,事件的捕獲與冒泡會正常傳遞。

event.stopPropagation()

可以取消事件的傳遞,可以透過 target.addEventListener(type, listener, useCapture) 的第三個參數來控制要在捕獲階段還是冒泡階段取消事件傳遞。

範例

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

今天有一個 html 文件,html 中有 box1 與 box2 兩個區塊,並且對兩個區塊增加監聽事件。

若 box1 事件被觸發,則會執行 console.log() 印出 box1
若 box2 事件被觸發,則會送出表單,並會執行 console.log() 印出 box2

情況一:無 event.preventDefault() 也無 event.stopPropagation()

在此情況下 box1 與 box2 事件都被觸發,會送出表單並且同時印出 box1box2

情況二:在 box2 中加上 event.preventDefault()

此時表單不會被送出,但 box1box2 都會被印出來。這邊的預設行為是送出表單,因為 event.preventDefault() 因此被取消了。由於事件傳遞依然會繼續,因此 box1 仍會被印出。

情況三:在 box2 中加上 event.stopPropagation()

此時表單會被送出,會印出 box2 但不會印出 box1。因為向上傳遞的事件被取消了,因此 box1 不會歷經冒泡階段,所以不會印出 box1