微信小程序视图控件与bindtap之间的问题的解决


Posted in Javascript onApril 08, 2019

在微信小程序中 最常用的<view>控件 可以用bindtap(冒泡反应) 如<view bindtap="ItemOnclick" data-mType="123">的形式绑定ItemOnclick事件并传递一个dataset,其包含一个名为mType的元素 值为123。

在某一次设计中

有如下结构:

<view class="func-m" bindtap="ItemOnclick" data-mType="123">
    <image src="{{ROOT_PATH}}/images/icon1.png" />
  </view>

ItemOnclick事件在点击在图片上时不会触发 需要点击在图片之外及外层view范围之内的地方 才会触发

若将bindtap写在<image>标签内 则反过来 点击图片会触发 但点击在图片之外及外层view范围之内的地方不会触发

由此我做出判断

点击事件不会向父级或子级控件传递。

(然而这与冒泡反应的定义是不一致的)

但是最近又碰到下面这种情况:

<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>

需要实现 点击图片 显示菜单列表 点击每个菜单项 触发MenuItemOnclick事件并传递对应的参数

然后当在<view class="menu-list">标签外的地方点击一下 就触发HideMenuList事件隐藏菜单

而实际产生的效果是 当点击图片时 菜单列表一闪便消失 有时直接没显示
后通过打印log发现是当点击图片触发了ShowMenuList事件后 HideMenuList事件也被触发了(且总在ShowMenuList事件之后)

即点击事件由<image>传递到了外层的<view> 因而触发了HideMenuList事件

这样的话那之前的判断就是错误的

目前还没找到这两种情况之间的关键差异,第二种情况的解决方案是 当显示菜单时 同时创造一个透明遮罩层覆盖除菜单列表外的区域,点击到这个透明遮罩层后触发HideMenuList事件并销毁或隐藏遮罩层

PS:第二种情况的方式 以前在html及Android环境下都有用过 是没有这个问题的,可能微信小程序这方面的底层机制和html及Android不一样,还待深究。

微信小程序bindtap与catchtap的区别详解

参考官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html

bindtap和catchtap都是当用户点击该组件的时候会在该页面对应的Page中找到相应的事件处理函数。

bind事件绑定不会阻止冒泡事件向上冒泡,catch事件绑定可以阻止冒泡事件向上冒泡:

//视图层
<view id="outer" bindtap="handleTap1">   //在组件中绑定bindtap事件 函数handleTap1
 outer view
 <view id="middle" catchtap="handleTap2"> //在组件中绑定catchtap事件 函数handleTap2
  middle view
  <view id="inner" bindtap="handleTap3"> //在组件中绑定bindtap事件 函数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") 
  },

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 10件让人费解的事情
Feb 15 Javascript
jquery获取下拉列表的值为null的解决方法
Mar 18 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
Nov 27 Javascript
js中array的sort()方法使用介绍
Feb 20 Javascript
Javascript中引用示例介绍
Feb 21 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
AngularJS 霸道的过滤器小结
Apr 26 Javascript
一个可复用的vue分页组件
May 15 Javascript
two.js之实现动画效果示例
Nov 06 Javascript
jQuery+koa2实现简单的Ajax请求的示例
Mar 06 jQuery
Vue通过WebSocket建立长连接的实现代码
Nov 05 Javascript
为什么node.js不适合大型项目
Apr 28 Javascript
微信小程序实现bindtap等事件传参
Apr 08 #Javascript
详解vue中axios请求的封装
Apr 08 #Javascript
使用taro开发微信小程序遇到的坑总结
Apr 08 #Javascript
vue+element+Java实现批量删除功能
Apr 08 #Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 #Javascript
详解element-ui日期时间选择器的日期格式化问题
Apr 08 #Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 #Javascript
You might like
php Ajax乱码
2008/04/09 PHP
php数组编码转换示例详解
2014/03/11 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
如何简单地用YUI做JavaScript动画
2007/03/10 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
JavaScript实现简单图片滚动附源码下载
2014/06/17 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
基于Bootstrap重置输入框内容按钮插件
2016/05/12 Javascript
基于Node.js + WebSocket打造即时聊天程序嗨聊
2016/11/29 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
Vue中this.$router.push参数获取方法
2018/02/27 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[00:52]DOTA2齐天大圣预告片
2016/08/13 DOTA
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
django admin组件使用方法详解
2019/07/19 Python
浅析使用Python搭建http服务器
2019/10/27 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
python基于opencv 实现图像时钟
2021/01/04 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
Skyscanner新西兰:全球领先的旅游搜索网站
2019/08/26 全球购物
巴西网上药店:Drogaria Araujo
2021/01/06 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
党建示范点实施方案
2014/03/12 职场文书
企业新年寄语
2014/04/04 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
超市店庆活动方案
2014/08/31 职场文书
自我查摆剖析材料
2014/10/11 职场文书
欢送领导祝酒词
2015/08/12 职场文书