微信小程序视图控件与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+Ajax+Json的高效分页实现代码
Oct 29 Javascript
B/S模式项目中常用的javascript汇总
Dec 17 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
Dec 29 Javascript
JS实现下拉菜单赋值到文本框的方法
Aug 18 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
使用FileReader API创建Vue文件阅读器组件
Apr 03 Javascript
150行Node.js实现的dns代理工具
Aug 02 Javascript
小程序外卖订单界面的示例代码
Dec 30 Javascript
Element-UI+Vue模式使用总结
Jan 02 Javascript
weui上传多图片,压缩,base64编码的示例代码
Jun 22 Javascript
vue设置全局访问接口API地址操作
Aug 14 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的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
2017/09/26 PHP
chrome原生方法之数组
2011/11/30 Javascript
javascript Array.prototype.slice的使用示例
2013/11/14 Javascript
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
AngularJS 中文API参考手册
2016/07/28 Javascript
JavaScript中常用的验证reg
2016/10/13 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
package.json文件配置详解
2017/06/15 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
JavaScript回调函数callback用法解析
2020/01/14 Javascript
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
Python实现Linux监控的方法
2019/05/16 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
python实现连连看游戏
2020/02/14 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
Myprotein瑞士官方网站:运动营养和健身网上商店
2019/09/25 全球购物
德国的大型美妆个护电商:Flaconi
2020/06/26 全球购物
普天C++笔试题
2016/03/20 面试题
商场总经理岗位职责
2014/02/03 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
何时使用Map来代替普通的JS对象
2021/04/29 Javascript
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
Python实现对齐打印 format函数的用法
2022/04/28 Python
利用Python实现翻译HTML中的文本字符串
2022/06/21 Python