微信小程序视图控件与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 相关文章推荐
短信提示使用 特效
Jan 19 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
Oct 11 Javascript
JavaScript二维数组实现的省市联动菜单
May 08 Javascript
基于Jquery实现焦点图淡出淡入效果
Nov 30 Javascript
HTML页面,测试JS对C函数的调用简单实例
Aug 09 Javascript
老生常谈javascript的面向对象思想
Aug 22 Javascript
深入理解Vue2.x的虚拟DOM diff原理
Sep 27 Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 Javascript
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 Javascript
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 Javascript
微信小程序图片加载失败时替换为默认图片的方法
Dec 09 Javascript
vue+iview实现手机号分段输入框
Mar 25 Vue.js
微信小程序实现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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
学习jquery之一
2007/04/27 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
基于BootStarp的Dailog
2016/04/28 Javascript
JavaScript随机打乱数组顺序之随机洗牌算法
2016/08/02 Javascript
Javascript中作用域的详细介绍
2016/10/06 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
基于jQuery实现简单人工智能聊天室
2017/02/10 Javascript
Vuejs 页面的区域化与组件封装的实现
2017/09/11 Javascript
详解如何使用webpack在vue项目中写jsx语法
2017/11/08 Javascript
vue-router相关基础知识及工作原理
2018/03/16 Javascript
JS实现星星海特效
2019/12/24 Javascript
[02:23]2018DOTA2亚洲邀请赛趣味视频——反应测试
2018/04/04 DOTA
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
python二叉树的实现实例
2013/11/21 Python
解读! Python在人工智能中的作用
2017/11/14 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
python统计中文字符数量的两种方法
2019/01/31 Python
ipython和python区别详解
2019/06/26 Python
python算法题 链表反转详解
2019/07/02 Python
python中单下划线(_)和双下划线(__)的特殊用法
2019/08/29 Python
Python for循环及基础用法详解
2019/11/08 Python
解决pyecharts运行后产生的html文件用浏览器打开空白
2020/03/11 Python
机电一体化专业应届本科生求职信
2013/09/27 职场文书
成品仓库管理员岗位职责
2015/04/09 职场文书
创业计划书之奶茶店开店方案范本!
2019/08/06 职场文书
MySQL大小写敏感的注意事项
2021/05/24 MySQL
一文搞懂Redis中String数据类型
2022/04/03 Redis