微信小程序視圖控件與bindtap之間的問(wèn)題的解決
在微信小程序中 最常用的<view>控件 可以用bindtap(冒泡反應(yīng)) 如<view bindtap="ItemOnclick" data-mType="123">的形式綁定ItemOnclick事件并傳遞一個(gè)dataset,其包含一個(gè)名為mType的元素 值為123。
在某一次設(shè)計(jì)中
有如下結(jié)構(gòu):
<view class="func-m" bindtap="ItemOnclick" data-mType="123"> <image src="{{ROOT_PATH}}/images/icon1.png" /> </view>
ItemOnclick事件在點(diǎn)擊在圖片上時(shí)不會(huì)觸發(fā) 需要點(diǎn)擊在圖片之外及外層view范圍之內(nèi)的地方 才會(huì)觸發(fā)
若將bindtap寫在<image>標(biāo)簽內(nèi) 則反過(guò)來(lái) 點(diǎn)擊圖片會(huì)觸發(fā) 但點(diǎn)擊在圖片之外及外層view范圍之內(nèi)的地方不會(huì)觸發(fā)
由此我做出判斷
點(diǎn)擊事件不會(huì)向父級(jí)或子級(jí)控件傳遞。
(然而這與冒泡反應(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>
需要實(shí)現(xiàn) 點(diǎn)擊圖片 顯示菜單列表 點(diǎn)擊每個(gè)菜單項(xiàng) 觸發(fā)MenuItemOnclick事件并傳遞對(duì)應(yīng)的參數(shù)
然后當(dāng)在<view class="menu-list">標(biāo)簽外的地方點(diǎn)擊一下 就觸發(fā)HideMenuList事件隱藏菜單
而實(shí)際產(chǎn)生的效果是 當(dāng)點(diǎn)擊圖片時(shí) 菜單列表一閃便消失 有時(shí)直接沒(méi)顯示
后通過(guò)打印log發(fā)現(xiàn)是當(dāng)點(diǎn)擊圖片觸發(fā)了ShowMenuList事件后 HideMenuList事件也被觸發(fā)了(且總在ShowMenuList事件之后)
即點(diǎn)擊事件由<image>傳遞到了外層的<view> 因而觸發(fā)了HideMenuList事件
這樣的話那之前的判斷就是錯(cuò)誤的
目前還沒(méi)找到這兩種情況之間的關(guān)鍵差異,第二種情況的解決方案是 當(dāng)顯示菜單時(shí) 同時(shí)創(chuàng)造一個(gè)透明遮罩層覆蓋除菜單列表外的區(qū)域,點(diǎn)擊到這個(gè)透明遮罩層后觸發(fā)HideMenuList事件并銷毀或隱藏遮罩層
PS:第二種情況的方式 以前在html及Android環(huán)境下都有用過(guò) 是沒(méi)有這個(gè)問(wèn)題的,可能微信小程序這方面的底層機(jī)制和html及Android不一樣,還待深究。
微信小程序bindtap與catchtap的區(qū)別詳解
參考官方文檔 https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html
bindtap和catchtap都是當(dāng)用戶點(diǎn)擊該組件的時(shí)候會(huì)在該頁(yè)面對(duì)應(yīng)的Page中找到相應(yīng)的事件處理函數(shù)。
bind事件綁定不會(huì)阻止冒泡事件向上冒泡,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){ //點(diǎn)擊handleTap1輸出 outer view bindtap console.log("outer view bindtap") }, handleTap2: function (event) { //點(diǎn)擊handleTap2輸出 middle view catchtap console.log("middle view catchtap") }, handleTap3: function (event) { //點(diǎn)擊handleTap3輸出 inner view bindtap middle view catchtap console.log("inner view bindtap") },
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript如何向頁(yè)面中添加一個(gè)按鈕
這篇文章主要介紹了JavaScript如何向頁(yè)面中添加一個(gè)按鈕,使用兩種方式向頁(yè)面中添加一個(gè)按鈕,分別是appendChild()和innerHTML屬性,本文結(jié)合示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10js實(shí)現(xiàn)prototype擴(kuò)展的方法(字符串,日期,數(shù)組擴(kuò)展)
這篇文章主要介紹了js實(shí)現(xiàn)prototype擴(kuò)展的方法,實(shí)例分析了JavaScript針對(duì)字符串、日期、數(shù)組等的prototype擴(kuò)展相關(guān)技巧,需要的朋友可以參考下2016-01-01javascript隨機(jī)將第一個(gè)dom中的圖片添加到第二個(gè)div中示例
此代碼的是一個(gè)簡(jiǎn)單的例子,將第一個(gè)div中的五張圖片中,提取隨機(jī)兩張顯示到第二個(gè)div中,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-10-10JS頁(yè)面動(dòng)態(tài)繪圖工具SVG,Canvas,VML介簡(jiǎn)介
這篇文章主要介紹了JS頁(yè)面動(dòng)態(tài)繪圖工具SVG,Canvas,VML介簡(jiǎn)介,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10