微信小程序視圖控件與bindtap之間的問題的解決
在微信小程序中 最常用的<view>控件 可以用bindtap(冒泡反應(yīng)) 如<view bindtap="ItemOnclick" data-mType="123">的形式綁定ItemOnclick事件并傳遞一個dataset,其包含一個名為mType的元素 值為123。
在某一次設(shè)計中
有如下結(jié)構(gòu):
<view class="func-m" bindtap="ItemOnclick" data-mType="123">
<image src="{{ROOT_PATH}}/images/icon1.png" />
</view>
ItemOnclick事件在點擊在圖片上時不會觸發(fā) 需要點擊在圖片之外及外層view范圍之內(nèi)的地方 才會觸發(fā)
若將bindtap寫在<image>標(biāo)簽內(nèi) 則反過來 點擊圖片會觸發(fā) 但點擊在圖片之外及外層view范圍之內(nèi)的地方不會觸發(fā)
由此我做出判斷
點擊事件不會向父級或子級控件傳遞。
(然而這與冒泡反應(yīng)的定義是不一致的)
但是最近又碰到下面這種情況:
<view style="background-color:#eee;" bindtap="HideMenuList"><!--此為最外層view-->
<image src="{{ROOT_PATH}}/images/icon1.png" bindtap="ShowMenuList" />
<view class="menu-list">
<view class="menu-item" data-mType="CP" bindtap="MenuItemOnclick">
</view>
<view class="menu-item" data-mType="HW" bindtap="MenuItemOnclick">
</view>
</view>
</view>
需要實現(xiàn) 點擊圖片 顯示菜單列表 點擊每個菜單項 觸發(fā)MenuItemOnclick事件并傳遞對應(yīng)的參數(shù)
然后當(dāng)在<view class="menu-list">標(biāo)簽外的地方點擊一下 就觸發(fā)HideMenuList事件隱藏菜單
而實際產(chǎn)生的效果是 當(dāng)點擊圖片時 菜單列表一閃便消失 有時直接沒顯示
后通過打印log發(fā)現(xiàn)是當(dāng)點擊圖片觸發(fā)了ShowMenuList事件后 HideMenuList事件也被觸發(fā)了(且總在ShowMenuList事件之后)
即點擊事件由<image>傳遞到了外層的<view> 因而觸發(fā)了HideMenuList事件
這樣的話那之前的判斷就是錯誤的
目前還沒找到這兩種情況之間的關(guān)鍵差異,第二種情況的解決方案是 當(dāng)顯示菜單時 同時創(chuàng)造一個透明遮罩層覆蓋除菜單列表外的區(qū)域,點擊到這個透明遮罩層后觸發(fā)HideMenuList事件并銷毀或隱藏遮罩層
PS:第二種情況的方式 以前在html及Android環(huán)境下都有用過 是沒有這個問題的,可能微信小程序這方面的底層機制和html及Android不一樣,還待深究。
微信小程序bindtap與catchtap的區(qū)別詳解
參考官方文檔 https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html
bindtap和catchtap都是當(dāng)用戶點擊該組件的時候會在該頁面對應(yīng)的Page中找到相應(yīng)的事件處理函數(shù)。
bind事件綁定不會阻止冒泡事件向上冒泡,catch事件綁定可以阻止冒泡事件向上冒泡:
//視圖層 <view id="outer" bindtap="handleTap1"> //在組件中綁定bindtap事件 函數(shù)handleTap1 outer view <view id="middle" catchtap="handleTap2"> //在組件中綁定catchtap事件 函數(shù)handleTap2 middle view <view id="inner" bindtap="handleTap3"> //在組件中綁定bindtap事件 函數(shù)handleTap3 inner view </view> </view> </view>
//邏輯層
Page({
handleTap1:function(event){
//點擊handleTap1輸出 outer view bindtap
console.log("outer view bindtap")
},
handleTap2: function (event) {
//點擊handleTap2輸出 middle view catchtap
console.log("middle view catchtap")
},
handleTap3: function (event) {
//點擊handleTap3輸出 inner view bindtap middle view catchtap
console.log("inner view bindtap")
},
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JS實現(xiàn)十字坐標(biāo)跟隨鼠標(biāo)效果
這篇文章給大家分享一下通過JS實現(xiàn)十字坐標(biāo)跟隨鼠標(biāo)效果的代碼,有需要的朋友參考學(xué)習(xí)下吧。2017-12-12
npm install 、npm install --save 和&n
這篇文章主要介紹了npm install 、npm install --save 和 npm install --save-dev的區(qū)別介紹,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
微信小程序picker組件關(guān)于objectArray數(shù)據(jù)類型的綁定方法
這篇文章主要介紹了微信小程序picker組件關(guān)于objectArray數(shù)據(jù)類型的綁定方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-03-03
JavaScript輸入框字?jǐn)?shù)實時統(tǒng)計更新
這篇文章主要介紹了JavaScript輸入框字?jǐn)?shù)實時統(tǒng)計更新,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
Javascript拖拽&拖放系列文章3之細(xì)說事件對象
Javascript中的事件對象其實和.NET中繼承自EventArgs類的派生類類似,用來給事件處理程序傳遞狀態(tài)信息,從而進行相應(yīng)的操作。這一篇文章將講述Javascript事件對象中和實現(xiàn)拖拽功能相關(guān)的幾個屬性,并在最后將IE事件模型和標(biāo)準(zhǔn)DOM事件模型的差異封裝到一個類中,從而適應(yīng)所有的瀏覽器。2008-09-09

