vue自定义移动端touch事件之点击、滑动、长按事件


Posted in Javascript onJuly 10, 2018

用法:

**HTML**
<div id="app" class="box" 
  v-tap="vuetouch" //vuetouch为函数名,如没有参数,可直接写函数名
  v-longtap="{fn:vuetouch,name:'长按'}" //如果有参数以对象形式传,fn 为函数名
  v-swipeleft="{fn:vuetouch,name:'左滑'}"
  v-swiperight="{fn:vuetouch,name:'右滑'}"
  v-swipeup="{fn:vuetouch,name:'上滑'}"
  v-swipedown="{fn:vuetouch,name:'下滑'}"
>{{ name }}</div>

**js**
kim=new Vue({
  el:"#app",
  data:{
    name:"开始"
  },
  methods:{
    vuetouch:function(s,e){
      this.name=s.name;
    }
  }
});

js核心内容

function vueTouch(el,binding,type){
  var _this=this;
  this.obj=el;
  this.binding=binding;
  this.touchType=type;
  this.vueTouches={x:0,y:0};
  this.vueMoves=true;
  this.vueLeave=true;
  this.longTouch=true;
  this.vueCallBack=typeof(binding.value)=="object"?binding.value.fn:binding.value;
  this.obj.addEventListener("touchstart",function(e){
    _this.start(e);
  },false);
  this.obj.addEventListener("touchend",function(e){
    _this.end(e);
  },false);
  this.obj.addEventListener("touchmove",function(e){
    _this.move(e);
  },false);
};
vueTouch.prototype={
  start:function(e){
    this.vueMoves=true;
    this.vueLeave=true;
    this.longTouch=true;
    this.vueTouches={x:e.changedTouches[0].pageX,y:e.changedTouches[0].pageY};
    this.time=setTimeout(function(){
      if(this.vueLeave&&this.vueMoves){
        this.touchType=="longtap"&&this.vueCallBack(this.binding.value,e);
        this.longTouch=false;
      };
    }.bind(this),1000);
  },
  end:function(e){
    var disX=e.changedTouches[0].pageX-this.vueTouches.x;
    var disY=e.changedTouches[0].pageY-this.vueTouches.y;
    clearTimeout(this.time);
    if(Math.abs(disX)>10||Math.abs(disY)>100){
      this.touchType=="swipe"&&this.vueCallBack(this.binding.value,e);
      if(Math.abs(disX)>Math.abs(disY)){
        if(disX>10){
          this.touchType=="swiperight"&&this.vueCallBack(this.binding.value,e);
        };
        if(disX<-10){
          this.touchType=="swipeleft"&&this.vueCallBack(this.binding.value,e);
        };
      }else{
        if(disY>10){
          this.touchType=="swipedown"&&this.vueCallBack(this.binding.value,e);
        };
        if(disY<-10){
          this.touchType=="swipeup"&&this.vueCallBack(this.binding.value,e);
        }; 
      };
    }else{
      if(this.longTouch&&this.vueMoves){
        this.touchType=="tap"&&this.vueCallBack(this.binding.value,e);
        this.vueLeave=false
      };
    };
  },
  move:function(e){
    this.vueMoves=false;
  }
};
Vue.directive("tap",{
  bind:function(el,binding){
    new vueTouch(el,binding,"tap");
  }
});
Vue.directive("swipe",{
  bind:function(el,binding){
    new vueTouch(el,binding,"swipe");
  }
});
Vue.directive("swipeleft",{
  bind:function(el,binding){
    new vueTouch(el,binding,"swipeleft");
  }
});
Vue.directive("swiperight",{
  bind:function(el,binding){
    new vueTouch(el,binding,"swiperight");
  }
});
Vue.directive("swipedown",{
  bind:function(el,binding){
    new vueTouch(el,binding,"swipedown");
  }
});
Vue.directive("swipeup",{
  bind:function(el,binding){
    new vueTouch(el,binding,"swipeup");
  }
});
Vue.directive("longtap",{
  bind:function(el,binding){
    new vueTouch(el,binding,"longtap");
  }
});

2018-03-08

有朋友提出一个bug

“v-for循环 生命周期后 获取不到新值 比如更新了数据”

这个问题是v-for的就地复用机制导致的,也就是可以复用的dom没有重复渲染,官方给出的方法是需要为每项提供一个唯一 key 属性。理想的 key 值是每项都有的且唯一的 id。

<div v-for="item in items" :key="item.id">
 <!-- 内容 -->
</div>

我的解决方案是directive的钩子函数参数有一个vnode,这个是虚拟dom节点,给vnode.key赋予一个随机id,强制dom刷新。

Vue.directive("tap",{
  bind:function(el,binding,vnode){
    vnode.key = randomString()//randomString会返回一个随机字符串
    new vueTouch(el,binding,"tap");
  }
});

最新的版本已经在GitHub更新

https://github.com/904790204/vue-touch

总结

以上所述是小编给大家介绍的vue自定义移动端touch事件之点击、滑动、长按事件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js数组转json并在后台对其解析具体实现
Nov 20 Javascript
防止jQuery ajax Load使用缓存的方法小结
Feb 22 Javascript
分享一个自己写的简单的javascript分页组件
Feb 15 Javascript
通过隐藏iframe实现无刷新上传文件操作
Mar 16 Javascript
vue.js element-ui validate中代码不执行问题解决方法
Dec 18 Javascript
JS实现的抛物线运动效果示例
Jan 30 Javascript
超出JavaScript安全整数限制的数字计算BigInt详解
Jun 24 Javascript
json字符串传到前台input的方法
Aug 06 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
Aug 28 Javascript
Angular2中监听数据更新的方法
Aug 31 Javascript
vue子传父关于.sync与$emit的实现
Nov 05 Javascript
微信小程序单选框自定义赋值
May 26 Javascript
微信小程序中换行空格(多个空格)写法详解
Jul 10 #Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 #Javascript
Angular5中提取公共组件之radio list的实例代码
Jul 10 #Javascript
ng-alain表单使用方式详解
Jul 10 #Javascript
JavaScript基于对象方法实现数组去重及排序操作示例
Jul 10 #Javascript
React之PureComponent的使用作用
Jul 10 #Javascript
详解在React.js中使用PureComponent的重要性和使用方式
Jul 10 #Javascript
You might like
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
宝塔面板在NGINX环境中TP5.1如何运行?
2021/03/09 PHP
JavaScript 内置对象属性及方法集合
2010/07/04 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
AngularJS入门教程引导程序
2016/08/18 Javascript
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
Vue axios 跨域请求无法带上cookie的解决
2020/09/08 Javascript
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
python删除列表内容
2015/08/04 Python
pycharm创建一个python包方法图解
2019/04/10 Python
python 实现简单的FTP程序
2019/12/27 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python程序文件扩展名知识点详解
2020/02/27 Python
python实现提取COCO,VOC数据集中特定的类
2020/03/10 Python
Python selenium文件上传下载功能代码实例
2020/04/13 Python
python多进程下的生产者和消费者模型
2020/05/07 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
IE9对HTML5中部分属性不支持的原因分析
2014/10/15 HTML / CSS
荷兰手表网站:Watch2Day
2018/07/02 全球购物
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
几个Linux面试题笔试题
2012/12/01 面试题
安全生产计划书
2014/05/04 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
党员转正申请报告
2015/05/15 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
Redis入门教程详解
2021/08/30 Redis
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
Python Numpy库的超详细教程
2022/04/06 Python