JavaScript基礎-事件對象

一、前言

在前端開發中,用戶與頁面的交互行為(如點擊按鈕、輸入文本、滾動頁面等)都會觸發相應的事件。而這些事件發生時,瀏覽器會自動創建一個 事件對象(Event Object),它包含了當前事件的所有信息。

掌握事件對象是實現復雜交互邏輯的基礎技能之一。本文將帶你深入了解:

  • 什么是事件對象;
  • 事件對象的常見屬性與方法;
  • 如何阻止默認行為與事件傳播;
  • 實際開發中的典型使用場景;
  • 推薦的最佳實踐;

通過這篇文章,你將能夠熟練地使用 event 對象來增強網頁的交互體驗。

二、什么是事件對象?

當一個事件被觸發時(例如點擊、鍵盤按下、鼠標移動等),瀏覽器會自動為該事件創建一個事件對象(Event 或其子類實例),并將其作為參數傳遞給事件處理函數。

document.addEventListener('click', function(event) {console.log(event)
})

📌 事件對象包含的信息有:

  • 觸發事件的目標元素(target)
  • 鼠標位置坐標(clientX / clientY)
  • 鍵盤按鍵值(keyCode)
  • 是否按下了 Ctrl/Shift 等修飾鍵
  • 阻止默認行為的方法(preventDefault)
  • 阻止事件傳播的方法(stopPropagation)

三、事件對象的主要屬性和方法

屬性/方法描述
target觸發事件的真實元素(原始觸發者)
currentTarget綁定事件監聽器的元素(this 指向的對象)
type事件類型(如 'click'、'keydown' 等)
preventDefault()阻止瀏覽器的默認行為(如鏈接跳轉、表單提交)
stopPropagation()阻止事件繼續傳播(捕獲或冒泡)
stopImmediatePropagation()阻止該事件的所有后續監聽器執行
bubbles表示該事件是否會冒泡
cancelable表示是否可以取消該事件的默認行為
eventPhase當前事件所處的階段(捕獲、目標、冒泡)

? 示例:獲取事件對象的基本信息

<a href="https://example.com" id="link">點擊我</a><script>
document.getElementById('link').addEventListener('click', function(event) {console.log('事件類型:', event.type) // clickconsole.log('目標元素:', event.target) // <a> 元素console.log('綁定事件的元素:', event.currentTarget) // 同上console.log('是否可阻止默認:', event.cancelable) // trueconsole.log('是否冒泡:', event.bubbles) // trueconsole.log('事件階段:', event.eventPhase) // 2(目標階段)
})
</script>

四、target?與?currentTarget?的區別

這是開發者最容易混淆的一組屬性。

🧠 理解差異:

  • event.target:真正觸發事件的 DOM 元素(可能是子元素)。
  • event.currentTarget:綁定事件監聽器的那個元素(即?this)。

? 示例說明:

<div id="container"><button id="btn">點擊我</button>
</div><script>
document.getElementById('container').addEventListener('click', function(event) {console.log('event.target:', event.target) // 可能是 button 或 divconsole.log('event.currentTarget:', event.currentTarget) // 始終是 container
})
</script>

📌 場景總結:

使用場景推薦屬性
獲取真正點擊的元素event.target
獲取綁定事件的元素event.currentTarget

五、阻止默認行為:preventDefault()

有些 HTML 元素自帶默認行為,比如:

  • <a>?標簽點擊會跳轉;
  • <form>?提交會刷新頁面;
  • <input type="checkbox">?點擊會切換狀態;

我們可以使用 event.preventDefault() 來阻止這些默認行為。

? 示例:阻止鏈接跳轉

document.querySelector('a').addEventListener('click', function(event) {event.preventDefault()alert('鏈接被點擊,但沒有跳轉')
})

📌 注意事項:

  • 不會影響事件傳播;
  • 適用于自定義行為替代默認行為的場景。

六、阻止事件傳播:stopPropagation()

默認情況下,事件會在 DOM 樹中進行傳播(捕獲 → 目標 → 冒泡)。我們可以通過 stopPropagation() 來阻止事件繼續傳播到其他節點。

? 示例:阻止父級元素響應事件

<div id="parent">父容器<button id="child">點擊我</button>
</div><script>
document.getElementById('parent').addEventListener('click', () => {console.log('父元素被點擊')
})document.getElementById('child').addEventListener('click', function(event) {console.log('子元素被點擊')event.stopPropagation()
})
</script>

📌 輸出結果:

子元素被點擊

父元素不會收到事件通知。

七、徹底阻止事件:stopImmediatePropagation()

如果你希望不僅阻止事件傳播,還想阻止當前元素上的其它監聽器執行,可以使用這個方法。

? 示例:

const btn = document.getElementById('btn')btn.addEventListener('click', function (e) {console.log('第一個監聽器')e.stopImmediatePropagation()
})btn.addEventListener('click', function () {console.log('第二個監聽器') // 不會執行
})

📌 效果:

  • 第一個監聽器調用?stopImmediatePropagation()?后,所有后續監聽器都不會執行。

八、事件對象的實際應用場景

場景描述
表單驗證在 submit 事件中使用?preventDefault()?自定義提交邏輯
彈窗關閉點擊遮罩層關閉彈窗,使用?target?判斷是否點擊了遮罩區域
表格行點擊獲取點擊的具體行數據
鼠標坐標獲取記錄用戶點擊的位置
多個監聽器控制使用?stopImmediatePropagation()?控制優先級
動態加載內容通過?target?判斷點擊的是哪個動態生成的元素

九、事件對象的兼容性注意事項

雖然現代瀏覽器都支持標準的 Event API,但在一些舊版本瀏覽器(如 IE)中可能會存在兼容問題。

方法/屬性IE 支持情況解決方案
event.target? IE9+
event.currentTarget? IE8 及以下不支持
event.preventDefault()? IE9+
event.stopPropagation()? IE9+
event.stopImmediatePropagation()? IE 不支持
event.clientX / Y? 支持良好

📌 推薦做法:

  • 使用現代瀏覽器開發;
  • 若需兼容舊版瀏覽器,建議使用框架(如 jQuery)封裝兼容性處理;
  • 或自行封裝 polyfill。

十、總結對比表

特性推薦方式
獲取觸發元素event.target
獲取綁定元素event.currentTarget
阻止默認行為event.preventDefault()
阻止事件傳播event.stopPropagation()
徹底阻止事件event.stopImmediatePropagation()
獲取鼠標坐標event.clientX / clientY
推薦程度? 所有開發者必須掌握

十一、結語

感謝您的閱讀!如果你有任何疑問或想要分享的經驗,請在評論區留言交流!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87048.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

藍橋杯_染色_bfs_Java

臨時抱抱佛腳&#xff0c;太浮躁了&#xff0c;藍橋杯已經快1個半月沒做題了。 本人比較菜&#xff0c;感覺這個時間節點也只能把暴力題給盡量多做做&#xff0c;找找做題手感&#xff0c;其他就純憑運氣了吧。T-T。 題目 問題描述 小藍有一個 n 行 m 列的白色棋盤, 棋盤的每一…

MySQL 究極奧義·動態乾坤大挪移·無敵行列轉換術

導入大SQL文件 [mysqld] # 大批量導入優化 bulk_insert_buffer_size1G max_allowed_packet1G innodb_autoextend_increment512M innodb_buffer_pool_size4G innodb_log_buffer_size4G innodb_log_file_size4G動態行列轉換 DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_sco…

Excel大廠自動化報表實戰(互聯網金融-數據分析周報制作中)

這是Excel大廠自動化報表實戰第三期--互聯網金融-數據分析周報制作中 數據資源已經與這篇博客捆綁&#xff0c;有需要者可以下載通過網盤分享的文件&#xff1a;2.4自動化報表-8月成交數據.xlsx&#xff0c;2.4自動化報表-8月獲客數據.csv等2個文件 鏈接: https://pan.baidu.c…

langchain從入門到精通(七)——利用回調功能調試鏈應用 - 讓過程更透明

1. Callback 功能介紹 Callback 是 LangChain 提供的回調機制&#xff0c;允許我們在 LLM 應用程序的各個階段使用 hook &#xff08;鉤子&#xff09;。鉤子的含義也非常簡單&#xff0c;我們把應用程序看成一個一個的處理邏輯&#xff0c;從開始到結束&#xff0c;鉤子就是在…

如何使用Postman做接口自動化測試

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 本文適合已經掌握 Postman 基本用法的讀者&#xff0c;即對接口相關概念有一定了解、已經會使用 Postman 進行模擬請求等基本操作。 工作環境與版本&#xff1a; …

ELK日志文件分析系統——E(Elasticsearch)

目錄 基本概念 一、架構設計 二、核心原理 三、關鍵特性 四、應用意義 部署步驟 ?一、環境準備? ?二、安裝 Elasticsearch? ?三、關鍵配置&#xff08;elasticsearch.yml&#xff09;? ?四、啟動與驗證? ?五、集群擴展&#xff08;新增節點&#xff09;? …

融智學教育觀及其數學公式體系凝練匯總

摘要&#xff1a;本文系統闡述了鄒曉輝教授的融智學教育觀&#xff0c;通過原創數學公式體系構建了人機協同教育模型。核心內容包括&#xff1a;認知本體論&#xff08;文明智慧當量方程&#xff09;、方法論&#xff08;七遍通訓練算子&#xff09;、生態位控制論&#xff08;…

互聯網大廠Java求職面試:AI大模型應用實踐中的架構挑戰與實戰

互聯網大廠Java求職面試&#xff1a;AI大模型應用實踐中的架構挑戰與實戰 引言 在當今技術飛速發展的時代&#xff0c;AI大模型已成為企業數字化轉型的重要引擎。無論是內容生成、智能客服、個性化推薦&#xff0c;還是知識圖譜構建和語義理解&#xff0c;大模型的應用場景正在…

龜兔賽跑算法(Floyd‘s Cycle-Finding Algorithm)尋找重復數

龜兔賽跑算法&#xff08;Floyd’s Cycle-Finding Algorithm&#xff09;尋找重復數 問題描述 給定一個長度為 N1 的數組 nums&#xff0c;其中每個元素的值都在 [1, N] 范圍內。根據鴿巢原理&#xff0c;至少有一個數字是重復的。請找出這個重復的數字。 要求&#xff1a; …

紫光展銳T8300以創新音頻技術重塑感知世界

數字化時代&#xff0c;從語音通話到智能交互&#xff0c;從聆聽音樂到創作Vlog&#xff0c;聲音已成為隱形的基礎措施。日益發展的音頻技術正在重構用戶感知世界的方式&#xff0c;重塑用戶的聽覺體驗。 T8300是紫光展銳專為全球主流用戶打造的5G SoC&#xff0c;采用了紫光展…

寫作詞匯積累(A):頗有微詞、微妙(“微”字的學習理解)

一、頗有微詞 1、基本介紹 【頗有微詞】指對某人或某事有輕微的批評、不滿或不同意見&#xff0c;但表達得含蓄委婉 【頗】表示程度較深&#xff0c;【微詞】表示隱晦的批評 【微】表示隱晦的、不直白的&#xff0c;強調批評的委婉性 2、使用實例 1、盡管公司的新考勤制度…

flowable工作流的學習demo

1.spring 部署流程 刪除部署 查看歷史信息 加載一個默認的配置文件 里面包含用戶名和數據庫信息 加載自定義的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下載得到一個文件 ┌──(kali?kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali?kali)-[~] └─$ cat misc50 …

【編譯工具】(自動化)AI 賦能的自動化測試工具:如何讓測試效率提升 500% 并實現智能質檢?

#『編程工具』提升效率征文挑戰賽# 目錄 引言&#xff1a;AI 如何重塑自動化測試格局 一、新一代 AI 測試工具核心能力解析 二、實戰演示&#xff1a;Testim 智能測試平臺 &#xff08;1&#xff09;智能錄制測試流程 ① 步驟演示 ② AI 元素定位原理 &#xff08…

毛紀逆向分析

文章目錄 毛紀逆向分析前言知識系統整體架構概述模塊分析模塊0模塊1模塊2模塊3模塊4模塊5總結毛紀逆向分析 對爬蟲、逆向感興趣的同學可以查看文章,一對一小班教學(系統理論和實戰教程)、提供接單兼職渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 簡單 C】141. 環形鏈表

目錄 題目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指針 題目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服務注冊與發現原理和使用

1.Eureka 基礎概念 Eureka 是 Netflix 開發的服務注冊與發現組件&#xff0c;是 Spring Cloud 微服務架構中的核心模塊&#xff0c;用于解決微服務間的自動發現與通信問題。其核心功能包括&#xff1a; 服務注冊&#xff1a;服務實例將自身信息&#xff08;IP、端口、健康狀態等…

create_react_agent + MCP tools

文章目錄 MCP tools 調用結果輸出MCP Tool 內容成功返回失敗返回 普通工具調用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 調用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示詞Prompts(1)

摘要&#xff1a; 本文介紹了langchain.prompts中基礎的提示詞模板的用法&#xff0c;包括基礎的文本模板、對話模板、小樣本模板、以及主要兩種樣本選擇器的用法。 文章目錄 1. prompts介紹&#xff1f;2. 提示詞模板體系 Prompt Templates2.1 基礎文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安裝最新版本的 VirtualBox

Elementary OS 是一個基于 Ubuntu Linux 的發行版&#xff0c;它易于使用&#xff0c;對初學者友好&#xff0c;并且在用戶中非常受歡迎。如果你是 Elementary OS 的用戶&#xff0c;并且想在上面虛擬運行和探索其他操作系統&#xff0c;那么 Oracle VirtualBox 是一個非常不錯…