兩個是不同的執行環境,所以能夠使用的語法也會有些微差異。
瀏覽器也只是一種軟體,能做的事相對比較少一點,像是 Node.js 引入模組的 require 語法在瀏覽器上就無法使用。
DOM 物件是「 瀏覽器 」幫 HTML 的「 節點 」轉換成 「 JS 可以操作的物件 」,等於是 HTML 跟 JS 之間溝通的橋樑。
使用 element = document.querySelector(<element-name>) 選取到 DOM 物件
document.createElement("div"); 新增元素節點document.createTextNode("123") 新增文字節點.appendChild() 在最後面加入元素.removeChild() 移除該元素.innerText() 裡面的文字內容.innerHTML() 裡面的文字及標籤內容.outerHTML() 自身與裡面的文字及標籤內容.style.background = 'red' 直接操縱樣式.classList.add('<class-name>') 新增class.classList.delete('<class-name>') 刪減class.classList.toggle('<class-name>') toggle class.classList.contains('<class-name>') 是否包含該 classelement.addEventLister('<event-name>', function(){
// do something
})
常用 event :
click 點擊
e.target 點擊到的元素e.screenX 滑鼠離視窗左邊的距離e.screenY 滑鼠離視窗上邊的距離keydown 按下按鍵
e.key 按鍵號碼是 DOM 事件傳遞的順序,先捕獲 -> 自身 -> 冒泡。
我們可以夠過傳參數「 改變事件監聽的時機 」,但傳遞方式是保持不變的。
事件代理就是利用 DOM 事件的冒泡特性,將子層元素的監聽事件綁定在父層元素上,主要有兩點好處:
e.preventDefault() 是阻止瀏覽器上的特定元素在該事件預設的行為,以下是比較常用的情況:
<form> 的 submit - 阻止送出表單<a> 的 click 事件 - 阻止跳網址<input> 的 keypress 事件 - 阻止輸入按鍵e.stopPropagation() 就是阻止事件的傳遞,換句話說,就是不向上( 或下 )級傳遞。
要改變「 在哪個階段加上監聽器 」,可以在 .addEventListener 方法加上第 3 個參數,為 boolean 值。
注意:「 事件的傳遞方式 」並沒有改變,改變的是「 在哪個階段做監聽? 」因為不管在哪裡監聽它,都一樣是以先捕獲再冒泡,事件的傳遞方式是不會變的。
.addEventListener('click', function (e) {
// do something
}, <boolean>) // => 改變監聽階段
true => 捕獲 ; false => 冒泡false假設畫面上有兩個元素( 父子 ),我點了內層的子元素會觸發以下:
父元素 -> 捕獲
子元素 -> 自身
父元素 -> 冒泡
如果事件監聽的階段是在「 監聽冒泡 」( 參數為 false ),加上 e.stopPropagation() 停止事件傳遞,點擊內層的子元素會觸發以下,會發現冒泡被阻止了:
父元素 -> 捕獲
子元素 -> 自身
如果事件監聽的階段是在「 監聽捕獲 」( 參數為 true ),加上 e.stopPropagation() 停止事件傳遞,點擊內層的子元素會觸發以下,會發現子元素的自身跟冒泡都被阻止了:
父元素 -> 捕獲
因為當 父元素 的捕獲階段 (1) 就被阻止的話,根本傳不到 子元素 ,所以 子元素 的 (2)(3) 當然就沒有執行下去。
( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )
Written on June 17th, 2019 by Yakim shu