微信小程序節點事件總結
- bindtap、catchtap、bindclick的區別?
- `bindclick` 和 `bindtap` 的區別在于:
- e.target和e.currentTarget
- e.type
- e.timeStamp
- 觸摸事件屬性(針對觸摸類事件)
- 坐標信息
- 事件綁定數據
- 冒泡與捕獲相關
- 其他特殊屬性
- **常見事件類型及特有屬性**
- **總結**
bindtap、catchtap、bindclick的區別?
bindtap 手機端沒響應,編輯器正常。pointer-events: none/auto;
如果在手機端使用 bind:tap
沒有響應,但在編輯器中正常,可以嘗試以下解決方法:
- 檢查事件綁定:確保事件正確綁定到元素上,且沒有語法錯誤。
- 確保沒有阻止事件:檢查是否有其他事件處理程序或 CSS 樣式(如
pointer-events: none
)阻止點擊。 - 調試日志:在事件處理函數中添加
console.log
語句,確認函數是否被調用。 - 更新小程序基礎庫:確保使用的是最新版本的小程序基礎庫。
- 重啟設備:有時重啟手機可以解決臨時問題。
- 檢查網絡:如果事件中有網絡請求,確保網絡正常。
- 使用其他事件:嘗試使用
bindclick
代替bindtap
看是否有效。
bindclick
和 bindtap
的區別在于:
- 觸發方式:
bindclick
:適用于鼠標點擊(PC端)或長按后松開(移動端)。bindtap
:適用于快速觸摸,通常用于移動端。
- 事件響應:
bindclick
:可能會有延遲。bindtap
:響應更快,適合快速交互。
- 兼容性:
bindclick
更通用,適用于多種設備。bindtap
更適合移動設備的觸摸操作。
總體來說,bindtap
更適合移動端的用戶體驗。
e.target和e.currentTarget
寫了個嵌套層級的元素A-B,A上獲取dataset的內容,事件寫在A上,點擊到內部的元素B的時候,e.target是B元素節點,e.currentTarget才是A節點,才有數據。
即事件源(target
) 與 事件綁定元素(currentTarget
) 的區別。
e.type
事件類型(如 tap
、touchstart
、change
等)。
e.timeStamp
事件觸發的時間戳(毫秒)。
觸摸事件屬性(針對觸摸類事件)
-
touches
當前屏幕上所有觸摸點的信息(數組)。
示例:console.log('當前觸摸點:', e.touches); // 輸出: [{ identifier: 0, pageX: 100, pageY: 200 }]
-
changedTouches
觸摸狀態發生變化的觸摸點信息(數組)。
示例:console.log('變化的觸摸點:', e.changedTouches); // 輸出: [{ identifier: 0, pageX: 100, pageY: 200 }]
-
detail
事件特定的額外信息(如input
事件中的輸入值)。
示例:<input bindinput="onInput" />
onInput(e) {console.log('輸入值:', e.detail.value); // 輸出用戶輸入的內容 }
坐標信息
-
pageX
/pageY
觸摸點在整個頁面中的坐標(相對于頁面左上角)。
示例:console.log('頁面坐標:', e.pageX, e.pageY); // 輸出: 100, 200
-
clientX
/clientY
觸摸點在當前視窗中的坐標(相對于視窗左上角)。
示例:console.log('視窗坐標:', e.clientX, e.clientY); // 輸出: 80, 150
事件綁定數據
currentTarget.dataset
綁定事件元素(bindtap
所在元素)的data-*
屬性。
示例:<view data-id="123" bindtap="handleTap"></view>
handleTap(e) {console.log('數據ID:', e.currentTarget.dataset.id); // 輸出: "123" }
冒泡與捕獲相關
-
bubbles
事件是否冒泡(布爾值)。
示例:console.log('是否冒泡:', e.bubbles); // 輸出: true/false
-
cancelable
事件是否可以被取消(布爾值)。
示例:console.log('是否可取消:', e.cancelable); // 輸出: true/false
其他特殊屬性
-
target.id
/currentTarget.id
觸發事件元素或綁定事件元素的id
屬性。
示例:<view id="myView" bindtap="handleTap"></view>
handleTap(e) {console.log('元素ID:', e.currentTarget.id); // 輸出: "myView" }
-
target.dataset
/currentTarget.dataset
區分觸發事件元素與綁定事件元素的data-*
屬性。
示例:<view data-id="parent" bindtap="handleTap"><text data-id="child">點擊我</text> </view>
handleTap(e) {console.log('target數據:', e.target.dataset.id); // 可能輸出: "child"console.log('currentTarget數據:', e.currentTarget.dataset.id); // 輸出: "parent" }
常見事件類型及特有屬性
事件類型 | 特有屬性 | 說明 |
---|---|---|
tap | - | 點擊事件 |
longpress | - | 長按事件 |
touchstart | touches , changedTouches | 觸摸開始 |
touchmove | touches , changedTouches | 觸摸移動 |
touchend | touches , changedTouches | 觸摸結束 |
input | detail.value | 輸入框內容變化 |
change | detail.value | 表單組件值變化(如 checkbox ) |
scroll | detail.scrollTop | 滾動事件 |
總結
根據事件類型不同,可獲取的屬性也有所差異。在處理事件時,建議:
- 優先使用
currentTarget
獲取綁定事件元素的數據。 - 通過
detail
獲取特定事件的額外信息(如輸入值、滾動位置)。 - 利用坐標屬性(
pageX
、clientX
)實現交互效果(如拖拽)。
示例代碼:
handleEvent(e) {console.log('事件信息匯總:');console.log('類型:', e.type);console.log('坐標:', e.pageX, e.pageY);console.log('數據:', e.currentTarget.dataset);console.log('額外信息:', e.detail);
}