用 preventDefault 來「取消預設觸發行為」
html:
1 | <a href="#" style="margin-top: 1800px; display: block;">menu icon</a> |
因為margin-top: 1800px;
,所以a
連結會在頁面的底部
但是,當我點擊a
連結後,我發現:
❗️ 跳到網頁的「最上方」了
❗️ 網址帶上了一個「#」
原因為:這是瀏覽器的「預設行為」。瀏覽器想要找到「錨點」,但是因為沒有寫錨點(href="#"
),所以就會跑到網頁的「最上方」
🎃 瀏覽器會有一些「預設的行為」
例如:
🍋 <form>
表單
- 預設行為:按下「
submit
」按鈕後,會把「欄位內的資料」,都送到後端資料庫去 - 取消“預設行為”:取消「
submit
」的動作(不要將資料送到後端資料庫去)
為什麼需要取消「元素的預設行為」?
下面有一個a
連結,點擊後就會跳到 https://www.google.com
1 | <a href="https://www.google.com" style="margin-top: 1800px; display: block;" class="link">menu icon</a> |
現在,我想要取消a
連結的「預設行為」
原因為:這個a
連結「不是一個“真正的連結”」,而是一個「menu icon」
✅ 我希望:點擊a
連結後,會展開右側選單–> a
連結只是單純讓我用來“操控其他元素”
❌ 我不希望:點擊a
連結後,會「跳轉到指定網頁」(這是「元素的預設行為」)
取消「元素的預設行為」
作法如下:
JS:
🎃 建立變數el
,來選取.link
.addEventListener
🎃 因為「<a></a>
」是一個「連結」,對「連結」會做的動作是「點擊」,所以.addEventListener
要使用「click 事件」
取消「元素的預設行為」
🎃 「click 事件」的function
小括號裡面要寫「e
」,原因為:要仰賴這個e
來提供「點擊後的各種資訊」(e
會用“物件”的形式來呈現)
🎃 用e.preventDefault();
來取消「元素的預設行為」
🍋 a
連結的預設行為是:點擊後,會「跳轉到指定網頁」
1 | var el = document.querySelector('.link'); |
🍋 點擊a
連結之前
因為margin-top: 1800px;
,所以a
連結會在頁面的底部
🍋 點擊a
連結後
a
連結還是會在頁面的底部,因為已經取消「元素的預設行為」了
e.preventDefault();
常會用在:
🎃 取消a
連結的預設行為
🎃 取消「submit
」按鈕的預設行為
❌ 我不希望:透過傳統的「submit
」方式來傳送資料到後端做驗證
✅ 我希望:先透過我的 JS 去查詢表單有無錯誤(先做驗證,表單填寫有錯誤–> 就會彈跳提醒訊息),驗證完成後再透過 post 去傳送