學習筆記:Javascript(5)——事件監聽(用戶交互)

事件監聽:用戶交互的核心機制

在前端開發中,事件監聽是處理用戶交互的基礎機制。它允許我們檢測用戶的操作(如點擊、輸入、滾動等)并執行相應的代碼,讓網頁從靜態變為動態。

一、事件與事件監聽的基本概念

  • 事件(Event):指用戶在頁面上的操作或瀏覽器自身的狀態變化(如頁面加載完成、窗口大小改變)
  • 事件監聽(Event Listener):一種機制,讓程序 "等待" 特定事件發生,當事件發生時執行預設的處理函數

簡單來說:事件監聽就是 "當... 發生時,做..." 的邏輯實現。

二、常見的事件類型

1. 鼠標事件

  • click:鼠標點擊元素
  • dblclick:鼠標雙擊元素
  • mousedown:鼠標按下
  • mouseup:鼠標松開
  • mouseover:鼠標移入元素
  • mouseout:鼠標移出元素
  • mousemove:鼠標在元素上移動

2. 鍵盤事件

  • keydown:按下鍵盤按鍵
  • keyup:松開鍵盤按鍵
  • keypress:按下并釋放按鍵(已逐漸被棄用)

3. 表單事件

  • submit:表單提交
  • change:表單元素值改變(如下拉框選擇變化)
  • input:輸入框內容變化
  • focus:元素獲得焦點
  • blur:元素失去焦點

4. 窗口事件

  • load:頁面完全加載完成
  • resize:窗口大小改變
  • scroll:頁面滾動
  • unload:頁面關閉或刷新

三、事件監聽的三種實現方式

1. HTML 屬性方式(不推薦)

直接在 HTML 標簽中通過on+事件名屬性定義:

html

預覽

<button onclick="handleClick()">點擊我</button><script>function handleClick() {alert('按鈕被點擊了');}
</script>

缺點:HTML 與 JavaScript 代碼混合,不利于維護。

2. DOM 屬性方式

通過 JavaScript 為 DOM 元素的事件屬性賦值:

html

預覽

<button id="myBtn">點擊我</button><script>const btn = document.getElementById('myBtn');btn.onclick = function() {alert('按鈕被點擊了');};// 可以覆蓋之前的事件處理btn.onclick = function() {alert('新的點擊處理');};
</script>

缺點:同一個事件只能綁定一個處理函數,新的會覆蓋舊的。

3. addEventListener () 方法(推薦)

使用 DOM 標準方法addEventListener()綁定事件:

html

預覽

<button id="myBtn">點擊我</button><script>const btn = document.getElementById('myBtn');// 綁定事件btn.addEventListener('click', function() {alert('第一次點擊處理');});// 可以綁定多個處理函數btn.addEventListener('click', function() {console.log('第二次點擊處理');});// 定義命名函數便于移除function handleClick() {console.log('命名函數處理');}btn.addEventListener('click', handleClick);// 移除事件監聽btn.removeEventListener('click', handleClick);
</script>

優點

  • 可以為同一事件綁定多個處理函數
  • 可以方便地移除事件監聽
  • 可以指定事件捕獲 / 冒泡階段

四、事件對象(Event Object)

當事件發生時,瀏覽器會自動創建一個事件對象,包含事件相關的詳細信息,并作為參數傳遞給事件處理函數:

javascript

運行

btn.addEventListener('click', function(event) {// event 就是事件對象console.log('事件類型:', event.type); // "click"console.log('觸發元素:', event.target); // 觸發事件的元素console.log('當前元素:', event.currentTarget); // 綁定事件的元素console.log('鼠標X坐標:', event.clientX); // 相對于視口的X坐標console.log('鼠標Y坐標:', event.clientY); // 相對于視口的Y坐標
});

常用屬性:

  • type:事件類型(如 "click")
  • target:觸發事件的原始元素
  • currentTarget:當前處理事件的元素(通常與this相同)
  • preventDefault():阻止事件的默認行為(如鏈接跳轉、表單提交)
  • stopPropagation():阻止事件冒泡

五、事件流:捕獲與冒泡

DOM 事件流分為三個階段:

  1. 捕獲階段:事件從 window 向下傳播到目標元素
  2. 目標階段:事件到達目標元素
  3. 冒泡階段:事件從目標元素向上傳播回 window

html

預覽

<div id="outer"><div id="inner">點擊我</div>
</div><script>const outer = document.getElementById('outer');const inner = document.getElementById('inner');// 第三個參數為true表示在捕獲階段處理outer.addEventListener('click', () => console.log('outer捕獲'), true);inner.addEventListener('click', () => console.log('inner目標'));outer.addEventListener('click', () => console.log('outer冒泡'), false);
</script>

點擊 inner 元素會輸出:

outer捕獲
inner目標
outer冒泡

六、事件委托(事件代理)

利用事件冒泡機制,將子元素的事件委托給父元素處理:

html

預覽

<ul id="myList"><li>項目1</li><li>項目2</li><li>項目3</li>
</ul><script>const list = document.getElementById('myList');// 只給父元素綁定一次事件list.addEventListener('click', function(event) {// 判斷點擊的是li元素if (event.target.tagName === 'LI') {console.log('點擊了:', event.target.textContent);}});
</script>

優點

  • 減少事件綁定數量,提高性能
  • 自動支持動態添加的子元素

七、實際應用示例

綜合運用事件監聽實現一個簡單的交互功能:

html

預覽

<div class="counter"><button class="decrease">-</button><span class="value">0</span><button class="increase">+</button>
</div><script>const decreaseBtn = document.querySelector('.decrease');const increaseBtn = document.querySelector('.increase');const valueSpan = document.querySelector('.value');let count = 0;// 定義處理函數function updateValue() {valueSpan.textContent = count;}// 綁定事件decreaseBtn.addEventListener('click', () => {count--;updateValue();});increaseBtn.addEventListener('click', () => {count++;updateValue();});// 支持鍵盤操作document.addEventListener('keydown', (event) => {if (event.key === '+') {count++;updateValue();} else if (event.key === '-') {count--;updateValue();}});
</script>

總結

事件監聽是前端交互的核心,掌握以下幾點:

  1. 理解事件的概念和常見事件類型
  2. 推薦使用addEventListener()方法綁定事件
  3. 學會使用事件對象獲取事件信息和控制事件行為
  4. 理解事件流的捕獲和冒泡機制
  5. 掌握事件委托技巧提高性能

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

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

相關文章

在Linux系統中清理大文件的方法

在Linux系統的日常運維管理過程中&#xff0c;磁盤空間問題是一個非常常見且棘手的難題。隨著系統運行時間的增加&#xff0c;日志文件、臨時文件、緩存文件以及用戶產生的數據會不斷增長。如果缺乏及時的監控和清理&#xff0c;大文件往往會迅速占滿磁盤&#xff0c;導致系統性…

使用x64dbg分析調試windows可執行程序

引言 當我們僅有一個C/C等編譯的可執行程序&#xff08;windows 上的 exe 文件&#xff09;&#xff0c;而沒有源碼時我們應該怎么分析調試該可執行程序呢&#xff1f;我們可以通過動態分析或靜態分析的方式達成我們的目的&#xff0c;當然比較有效的方案當然是靜態分析結合動態…

在Windows 11上配置Cursor IDE進行Java開發

前言 Cursor IDE是一款基于VSCode的AI編程助手&#xff0c;集成了強大的AI功能&#xff0c;能夠顯著提升Java開發效率。本文詳細介紹如何在Windows 11系統上安裝和配置Cursor IDE&#xff0c;使其成為高效的Java開發環境。 1. Windows 11上安裝Cursor IDE 1.1 下載和安裝步驟…

字符串-43.字符串相乘-力扣(LeetCode)

一、題目解析 1、計算乘積后&#xff0c;將結果也按字符串返回 2、字符串長度在[1&#xff0c;200] 二、算法原理 為了方便字符串計算&#xff0c;我們將其逆置&#xff0c;符合我們的計算需求&#xff0c;"123"將變為"321" 解法1&#xff1a;模擬小學…

鴻蒙HAP包解包、打包、簽名及加固全流程解析

在鴻蒙應用開發過程中&#xff0c;HAP&#xff08;HarmonyOS Ability Package&#xff09;包的解包、打包、簽名以及加固是開發者們繞不開的重要環節。今天&#xff0c;就讓我們深入探討這一全流程&#xff0c;幫助大家更好地理解和掌握相關操作。 一、HAP解包 解包是分析和修…

PyTorch之張量創建與運算

PyTorch 主要有以下幾個基礎概念&#xff1a;張量&#xff08;Tensor&#xff09;、自動求導&#xff08;Autograd&#xff09;、神經網絡模塊&#xff08;nn.Module&#xff09;、優化器&#xff08;optim&#xff09;等。張量&#xff08;Tensor&#xff09;&#xff1a;PyTo…

數據 儲存

文件儲存 網頁版爬蟲數據庫 &#xff1a; https://spidertools.cn/#/crypto TEXT 文本儲存 可以使用記事本打開 r #讀取。 r #讀寫&#xff0c;文件指針放在文件的開頭。 w #寫入&#xff0c;覆蓋原文件。 w #讀寫&#xff0c;覆蓋原文件。 a #附加。 a #讀寫&…

Flask 博客系統(Flask Blog System)

目標&#xff1a;零基礎也能從頭搭建一個支持文章管理、評論、分類標簽、搜索、用戶登錄的博客系統 技術棧&#xff1a;Flask SQLite SQLAlchemy Jinja2 HTML/CSS Flask-Login 開發工具&#xff1a;VSCode 學習重點&#xff1a;MVC 模式、數據庫操作、會話管理、表單處理一…

基于RFID技術的寵物自動喂食器方案

一、背景 寵物已經成為現代人生活中不可或缺的一部分&#xff0c;隨著養寵物的人越來越多&#xff0c;寵物的數量也越來越多&#xff0c;有些家庭甚至養了兩只以上的貓狗或者貓狗混養&#xff0c;寵物間的管理問題也越來越突出&#xff0c;如寵物之間的搶食行為&#xff0c;易…

conda常見問題

文章目錄run "conda init" before "conda activate"打開PowerShell自動進入base環境&#xff08;cmd沒有這個問題&#xff09;run “conda init” before “conda activate” 在使用conda命令創建env后使用conda activate命令&#xff0c;出現"run ‘…

第5章 HTTPS與安全配置

5.1 HTTPS概述 5.1.1 為什么需要HTTPS 數據加密:保護傳輸中的敏感數據 身份驗證:確認服務器身份的真實性 數據完整性:防止數據在傳輸過程中被篡改 SEO優勢:搜索引擎優先排名HTTPS網站 瀏覽器要求:現代瀏覽器對HTTP網站顯示不安全警告 合規要求:許多行業標準要求使用HTTP…

Java入門級教程17——利用Java SPI機制制作驗證碼、利用Java RMI機制實現分布式登錄驗證系統

目錄 1.制作驗證碼——java SPI機制 1.1 類所屬包情況 1.2 具體實現 1.2.1 核心接口&#xff1a;ICode 1.2.2 接口實現類&#xff1a;驗證碼的具體生成邏輯 1.2.3 服務工廠類&#xff1a;CodeServiceFactory&#xff08;核心&#xff1a;SPI 服務發現&#xff09; 1.2.…

ES6筆記5

1. Promise相當于一個容器&#xff0c;保存著未來才要結束的事件&#xff08;異步操作&#xff09;的一個結果&#xff0c;各種異步操作都可以用同樣方法處理 axios特點&#xff1a;對象的狀態不受外界影響&#xff0c;處理異步操作&#xff0c;3個狀態&#xff0c;Pending&…

解決idea2021maven依賴導入后還是找不到包,爆紅無法導入

1.依賴導入后pom.xml文件以及Maven,此兩處代碼還是爆紅 2.解決方法 由技術大佬同事幾分鐘解決,他記憶深刻之前搞過很久,一看就知道哪里出問題了 我之前是配過Maven的本地倉庫的但是沒有用,這次出問題之后長教訓了,技術大佬說盡量用自己的本地倉庫,不要用idea的Maven倉庫,容易…

【硬件-筆試面試題-81】硬件/電子工程師,筆試面試題(知識點:詳細講講同步時鐘與異步時鐘通信)

題目匯總版--鏈接&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持續更新學習&#xff0c;加油&#xff01;&#xff01;&#xff01;-CSDN博客 【硬件-筆試面試題-81】硬件/電子工程師&#xff0c;筆試面試題&#xff08;知識點…

php計算一個模擬增長過程函數

private function calculateGrowth($progress) {// 使用多個增長階段模擬不均勻性if ($progress < 0.3) {// 前30%時間&#xff1a;緩慢增長 30 %return pow($progress / 0.3, 0.7) * 0.3;} elseif ($progress < 0.7) {// 中間40%時間&#xff1a;快速增長 50%return 0.3…

華為USG6000v2 NAT模式下IPSEC IKE V1 實驗

USG6000v2 NAT模式下IPSEC 實驗 拓撲圖公網配置OSPF路由協議&#xff08;網絡要求能通就行&#xff09; 一、 總部配置 &#xff08;一&#xff09;交換機配置 1、 總部交換機到防火墻網段 192.168.10.0/24 2、 交換機G0/0設置成access端口劃分vlan 10&#xff0c;網關 192.168…

android 里設計context的作用

Android中的Context是一個核心設計機制&#xff0c;其作用主要體現在以下幾個方面&#xff1a; 1. 提供應用程序環境信息 Context作為抽象類&#xff0c;封裝了應用與系統交互所需的全局環境信息&#xff0c;包括資源訪問、組件啟動、系統服務調用等基礎能力。它本質上是應用…

能發彈幕的簡單視頻網站

界面參考了Youtube&#xff0c;后端使用Spring Boot&#xff0c;前端Vue&#xff0c;vuetifyjs。支持自動生成封面圖&#xff0c;發送彈幕、AI內容審核等功能。 一個簡單的視頻網站 網站名稱是 TikTok 與 YouTube 的縫合&#xff0c;Logo 為豆包 AI 生成 主要界面參考了 Yout…

了解網站安全監測系統的重要性

在當今數字化時代&#xff0c;網站已經成為企業發展和品牌推廣的關鍵渠道之一。然而&#xff0c;隨之而來的是網絡安全威脅的增加&#xff0c;包括數據泄露、惡意攻擊和病毒感染等問題。為了保護網站和用戶信息的安全&#xff0c;網站安全監測系統變得至關重要。1. 網站安全監測…