微信小程序视图控件与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 相关文章推荐
基于jquery的给文章加入关键字链接
Oct 26 Javascript
Jquery 绑定时间实现代码
May 03 Javascript
提高jQuery性能的十个诀窍
Nov 14 Javascript
Js实现动态添加删除Table行示例
Apr 14 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
javascript原生ajax写法分享
Apr 10 Javascript
js实现文字超出部分用省略号代替实例代码
Sep 01 Javascript
Vue.js开发环境搭建
Nov 10 Javascript
bootstrap插件treeview实现全选父节点下所有子节点和反选功能
Jul 21 Javascript
JavaScript设计模式之享元模式实例详解
Jan 17 Javascript
p5.js实现故宫橘猫赏秋图动画
Oct 23 Javascript
Promise静态四兄弟实现示例详解
Jul 07 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
10条php编程小技巧
2015/07/07 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript下操作css的float属性的特殊写法
2007/08/22 Javascript
DIY jquery plugin - tabs标签切换实现代码
2010/12/11 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
Jquery 表格合并的问题分享
2011/09/17 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
JavaScript正则替换HTML标签功能示例
2017/03/02 Javascript
基于vue.js实现侧边菜单栏
2017/03/20 Javascript
详解JS数组Reduce()方法详解及高级技巧
2017/08/18 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
通过vue-cli3构建一个SSR应用程序的方法
2018/09/13 Javascript
vue-router传递参数的几种方式实例详解
2018/11/13 Javascript
JavaScript undefined及null区别实例解析
2020/07/21 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
python字符串对其居中显示的方法
2015/07/11 Python
python实现按行切分文本文件的方法
2016/04/18 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
PyQt5 pyqt多线程操作入门
2018/05/05 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
python中dict使用方法详解
2019/07/17 Python
python实现的汉诺塔算法示例
2019/10/23 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
HTML5实现自带进度条和滑块滑杆效果
2018/04/17 HTML / CSS
文明好少年事迹材料
2014/08/19 职场文书
车贷收入证明范本
2014/09/14 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
多表查询、事务、DCL
2021/04/05 MySQL
一文搞懂Python Sklearn库使用
2021/08/23 Python
Java中API的使用方法详情
2022/04/06 Java/Android
Python如何利用pandas读取csv数据并绘图
2022/07/07 Python