微信小程序 --- 事件處理

事件處理

一個應用僅僅只有界面展示是不夠的,還需要和用戶做交互,例如:響應用戶的點擊、獲取用戶輸入的值等等,在小程序里邊,我們就通過編寫 JS 腳本文件來處理用戶的操作

1. 事件綁定和事件對象

小程序中綁定事件與在網頁開發中綁定事件幾乎一致,只不過在小程序不能通過 on 的方式綁定事件,也沒有 click 等事件,小程序中綁定事件使用 bind 方法,click 事件也需要使用 tap 事件來進行代替,綁定事件的方式有兩種:

第一種方式:bind:事件名,bind 后面需要跟上冒號,冒號后面跟上事件名

<button bind:tap="handler">按鈕</button>

第二種方式:bind事件名,bind 后面直接跟上事件名

<button bindtap="handler">按鈕</button>

事件處理函數需要寫到 .js 文件中,在 .js 文件中需要調用小程序提供的 Page 方法來注冊小程序的頁面,我們可以直接在 Page 方法中創建事件處理函數。例如:

// pages/home/home.js
Page({// 頁面的初始數據data: {},// 事件處理程序handler () {console.log('我被執行啦~~~')}// 其他 coding...
})

當組件觸發事件時,綁定的事件的處理函數會收到一個事件對象,用來記錄事件發生時的相關信息。在觸發事件時,事件處理程序會主動的給我們傳入一個參數 —— event(事件對象)

// pages/home/home.js
Page({// 頁面的初始數據data: {},// 事件處理程序handler (event) {// console.log('我被觸發了~~~')console.log(event)}// 其他 coding...
})

2. 綁定并阻止事件冒泡

事件分為冒泡事件和非冒泡事件:

  1. 冒泡事件:當一個組件上的事件被觸發后,該事件會向父節點傳遞。
  2. 非冒泡事件:當一個組件上的事件被觸發后,該事件不會向父節點傳遞。

使用 bind 綁定的事件,會觸發事件冒泡,如果想阻止事件冒泡,可以使用 catch 來綁定事件。

<view bindtap="parentHandler"><!-- 使用 bind 綁定的事件,會產生事件冒泡 --><!-- <button bindtap="handler">按鈕</button> --><!-- 使用 catcht 綁定的事件,會阻止事件冒泡 --><button catchtap="handler">按鈕</button>
</view>
Page({// 頁面的初始數據data: {},// 事件處理程序handler (event) {console.log('我是子綁定的事件 ~~~')},parentHandler () {console.log('我是父綁定的事件 ~~~')}// 其他 coding...
})

WXML 中冒泡事件列表如下表:

類型觸發條件
touchstart手指觸摸動作開始
touchmove手指觸摸后移動
touchcancel手指觸摸動作被打斷,如來電提醒,彈窗
touchend手指觸摸動作結束
tap手指觸摸后馬上離開
longpress手指觸摸后,超過350ms再離開,如果指定了事件回調函數并觸發了這個事件,tap事件將不被觸發
longtap手指觸摸后,超過350ms再離開(推薦使用 longpress 事件代替)
transitionend會在 WXSS transition 或 wx.createAnimation 動畫結束后觸發
animationstart會在一個 WXSS animation 動畫開始時觸發
animationiteration會在一個 WXSS animation 一次迭代結束時觸發
animationend會在一個 WXSS animation 動畫完成時觸發
touchforcechange在支持 3D Touch 的 iPhone 設備,重按時會觸發

📌 注意事項

? 除上表之外的其他組件自定義事件,如無特殊聲明都是非冒泡事件
? 例如 form 的submit事件,input 的input事件

3. 事件傳參-data-*自定義數據

在小程序中,可以通過事件傳參的方式,將數據傳遞給事件處理函數。常見的事件包括點擊事件、輸入事件等。

在組件節點中可以通過 data- 的方式傳遞一些自定義數據,傳遞的數據可以通過事件對象的方式進行獲取

📌 注意事項

? 使用 data- 方法傳遞參數的時候,多個單詞由連字符 - 連接

? 連字符寫法會轉換成駝峰寫法,而大寫字符會自動轉成小寫字符

? 例如:

? data-element-type ,最終會呈現為 event.currentTarget.dataset.elementType

? data-elementType ,最終會呈現為 event.currentTarget.dataset.elementtype

在 wxml 文件中,使用 data-* 屬性將數據傳遞給事件處理函數。例如:

<view bindtap="parentHandler" data-parent-id="1" data-parentName="tom"><!-- 如果需要進行事件傳參,需要再組件上通過 data- 的方式傳遞數據 --><!-- <button bindtap="btnHandler" data-id="1" data-name="tom">按鈕</button> --><button data-id="1" data-name="tom">按鈕</button>
</view>

在 js 文件中,可以通過 event.currentTarget.dataset 獲取傳遞的數據

// cate.js
Page({// 按鈕觸發的事件處理函數btnHandler (event) {// currentTarget 事件綁定者,也就是指:哪個組件綁定了當前事件處理函數// target 事件觸發者,也就是指:哪個組件觸發了當前事件處理函數// currentTarget 和 target 都是指按鈕,因為是按鈕綁定的事件處理函數,同時點擊按鈕觸發事件處理函數// 這時候通過誰來獲取數據都可以console.log(event.currentTarget.dataset.id)console.log(event.target.dataset.name)},// view 綁定的事件處理函數parentHandler (event) {// 點擊藍色區域(不點擊按鈕)// currentTarget 事件綁定者:view// target 事件觸發者:view// currentTarget 和 target 都是指 view,如果想獲取 view 身上的數據,使用誰都可以// 點擊按鈕(不點擊藍色區域)// currentTarget 事件綁定者:view// target 事件觸發者:按鈕// 如果想獲取 view 身上的數據,就必須使用 currentTarget 才可以// 如果想獲取的是事件觸發者本身的數據,就需要使用 targetconsole.log(event)// 在傳遞參數的時候,如果自定義屬性是多個單詞,單詞與單詞直接使用中劃線 - 進行連接// 在事件對象中會被轉換為小托峰寫法console.log(event.currentTarget.dataset.parentId)// 在傳遞參數的時候,如果自定義屬性是多個單詞,單詞如果使用的是小托峰寫法// 在事件對象中會被轉為全部小寫的console.log(event.currentTarget.dataset.parentname)}})

4. 事件傳參-mark 自定義數據

小程序進行事件傳參的時候,除了使用 data-* 屬性傳遞參數外,還可以使用 mark 標記傳遞參數

mark是一種自定義屬性,可以在組件上添加,用于來識別具體觸發事件的 target 節點。同時 mark 還可以用于承載一些自定義數據(類似于 dataset

markdataset 很相似,主要區別在于:

mark 會包含從觸發事件的節點到根節點上所有的 mark: 屬性值 (事件委托的)

dataset 僅包含觸發事件那一個節點的 data- 屬性值。

在 wxml 文件中,使用 mark:自定義屬性 的方式將數據傳遞給事件處理函數

<!-- pages/index/index.wxml --><view bindtap="parentHandler" mark:parentid="1" mark:parentname="tom"><!-- 如果需要使用 mark 進行事件傳參,需要使用 mark:自定義屬性的方式進行參數傳遞 --><!-- <button bindtap="btnHandler" mark:id="1" mark:name="tom">按鈕</button> --><button mark:id="1" mark:name="tom">按鈕</button>
</view>
// cart.js
Page({// 按鈕綁定的事件處理函數btnHandler (event) {console.log(event.mark.id)console.log(event.mark.name)},// view 綁定的事件處理函數parentHandler (event) {// 先點擊藍色區域 (不點擊按鈕)// 通過事件對象獲取的是 view 身上綁定的數據// 先點擊按鈕 (不點擊藍色區域)// 通過事件對象獲取到的是 觸發事件的節點 已經 父節點身上所有的 mark 數據console.log(event)}})

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

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

相關文章

sora會是AGI的拐點么?

©作者|謝國斌 來源|神州問學 OpenAI近期發布的Sora是一個文本到視頻的生成模型。這項技術可以根據用戶輸入的描述性提示生成視頻&#xff0c;延伸現有視頻的時間&#xff0c;以及從靜態圖像生成視頻。Sora可以創建長達一分鐘的高質量視頻&#xff0c;展示出對用戶提示的精…

PoC免寫攻略

在網絡安全領域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起著重要的作用&#xff0c;并且在安全研究、漏洞發現和漏洞利用等方面具有重要的地位。攻擊方視角下&#xff0c;常常需要圍繞 PoC 做的大量的工作。常常需要從手動測試開始編寫 PoC&#xff0c;再到實…

vue項目電商

這個項目功能有首頁&#xff0c;分類&#xff0c;商品詳情&#xff0c;購物車&#xff0c;用戶注冊、登錄等等的實現&#xff0c;并且可以在手機上進行展示。 git倉庫地址&#xff1a;https://gitee.com/BisShen/project.git

應用層http協議包解析與https加密策略解析

文章目錄 一.應用層協議--http協議基礎認知二.https協議加密策略解析加密策略1--通信雙方只使用對稱加密加密策略2--通信雙方使用單方非對稱加密加密策略3--通信雙方都使用非對稱加密加密策略4--非對稱加密與對稱加密配合使用中間人攻擊數據簽名與CA證書HTTPS數據安全認證的本質…

二維碼門樓牌管理系統技術服務的分類與應用

文章目錄 前言一、二維碼門樓牌管理系統的分類二、二維碼門樓牌管理系統的應用優勢三、結論 前言 隨著城市管理的精細化和智能化&#xff0c;二維碼門樓牌管理系統成為了現代城市管理的重要工具。該系統將傳統的門牌、樓牌、戶牌與二維碼技術相結合&#xff0c;實現了信息的快…

如何優化一個運行緩慢的SQL查詢?有哪些常見的優化技巧?

如何優化一個運行緩慢的SQL查詢&#xff1f; 當面對一個運行緩慢的SQL查詢時&#xff0c;優化是提升數據庫性能的關鍵步驟。優化查詢不僅可以減少查詢執行時間&#xff0c;還可以降低系統資源消耗&#xff0c;提高整體的系統吞吐量。以下將詳細探討如何優化一個運行緩慢的SQL查…

MySQL:常用的SQL語句

提醒&#xff1a;設定下面的語句是在數據庫名為 db_book執行的。 一、創建表 1. 創建t_booktype表 USE db_book; CREATE TABLE t_booktype(id INT AUTO_INCREMENT, bookTypeName VARCHAR(20),bookTypeDesc varchar(200),PRIMARY KEY (id) );2. 創建t_book表 USE db_book; C…

[筆記] wsl 禁用配置 win系統環境變量+代理

wsl 配置禁用 win系統環境變量 進入 wsl 的 /etc/wsl.conf 目錄&#xff0c;增加以下配置&#xff1a; [interop] enabledfalse appendWindowsPathfalse然后退出wsl&#xff0c;并且執行關閉正在運行的 wsl&#xff0c;執行命令 wsl --shutdown 最后重新進入wsl 即可。 參考…

C語言-----動態內存管理(1)

1.引入 我們之前已經學習了幾種開辟內存空間的方式&#xff1a; &#xff08;1&#xff09;int a10;開辟4個字節大小的空間 &#xff08;2&#xff09;int arr[10]{0}定義數組開辟了一串連續的空間 2.malloc和free (1)malloc開辟內存空間可能會失敗&#xff0c;因此需要檢查…

HTML5+CSS3+JS小實例:文字陰影還能這么玩

實例:文字陰影還能這么玩 技術棧:HTML+CSS+JS 效果: 源碼: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"…

Android java基礎_泛型

一.java泛型是什么 Java 泛型&#xff08;Generic&#xff09;是 Java 5 中引入的一種特性&#xff0c;它允許類、接口和方法在定義時使用一個或多個類型參數&#xff0c;這些類型參數在調用時會被實際類型替換&#xff0c;從而增強了代碼的重用性和類型安全性。通過使用泛型&…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:形狀裁剪)

用于對組件進行裁剪、遮罩處理。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形狀對當…

Spring基礎——XML配置Bean的實例化

目錄 實例化Bean的方式使用構造函數實例化Bean使用靜態工廠的方式實例化Bean使用實例化工廠方式實例化Bean通過實現FactoryBean自定義實例化Bean 實例化Bean的方式 bean的創建本質上就是創建一個或多個具有外部配置屬性的對象&#xff0c;容器在啟動的時候會查看命名Bean的配置…

中美加密監管突傳“巨響”!比特幣突破7萬信號出現!馬斯克一句話掀起大行情!

比特幣本周觸及64000美元高價&#xff0c;2月交易所儲備減少近45000多枚比特幣&#xff0c;市場將其解讀為看漲70000美元的關鍵信號。中美加密監管傳利好&#xff0c;香港加密牌照申請期限結束&#xff0c;已有24家機構入列待批&#xff0c;美國考慮允許比特幣ETF及相關信托期權…

uview2中上傳文件和若依前后端分離配合的代碼

uview2中的上傳文件需要配合著自己后端的上傳的代碼 uview2 代碼&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后續自己封裝let a uni.uploadFile({//自己的請求路徑url: that.$baseURL /uploadAvater, //上傳的文件filePath: tha…

Java | vscode如何使用命令行運行Java程序

1.在vscode中新建一個終端 2.在終端中輸入命令 javac <源文件>此命令執行后&#xff0c;在文件夾中會生成一個與原java程序同名的.class文件。然后輸入如下命令&#xff1a; java <源文件名稱>這樣java程序就運行成功了。&#x1f607;

LeetCode:2368. 受限條件下可到達節點的數目(dfs Java)

目錄 2368. 受限條件下可到達節點的數目 題目描述&#xff1a; 實現代碼與解析&#xff1a; DFS 原理思路&#xff1a; 2368. 受限條件下可到達節點的數目 題目描述&#xff1a; 現有一棵由 n 個節點組成的無向樹&#xff0c;節點編號從 0 到 n - 1 &#xff0c;共有 n - …

02-Vue 計算屬性與監聽器與VUE-cli使用

1.計算屬性 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…

Android java基礎_反射

一.反射的基本概念 反射&#xff08;Reflection&#xff09;&#xff0c;Java 中的反射機制是指&#xff0c;Java 程序在運行期間可以獲取到一個對象的全部信息。 反射機制一般用來解決Java 程序運行期間&#xff0c;對某個實例對象一無所知的情況下&#xff0c;如何調用該對…

單源最短路的建圖方式

1129. 熱浪 - AcWing題庫 這道題可以有三種方法來做&#xff0c;樸素版的dijkstra、堆優化版的dijkstra和spfa算法 &#xff08;1&#xff09;spfa算法 這里的隊列用循環隊列&#xff0c;而不是像模板那樣用普通隊列是因為它的隊列長度不確定 import java.util.*;public class…