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 相关文章推荐
javascript 最常用的10个自定义函数[推荐]
Dec 26 Javascript
jQuery学习笔记 获取jQuery对象
Sep 19 Javascript
javascript实现获取cookie过期时间的变通方法
Aug 14 Javascript
C++中的string类的用法小结
Aug 07 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
Jan 05 Javascript
原生javascript实现匀速运动动画效果
Feb 26 Javascript
JS插件plupload.js实现多图上传并显示进度条
Nov 29 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
Jun 13 Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 jQuery
使用ajax的post同步执行(实现方法)
Dec 21 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
Mar 07 Javascript
详解小程序BackgroundAudioManager踩坑之旅
Dec 08 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
一个域名查询的程序
2006/10/09 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
二招解决php乱码问题
2012/03/25 PHP
php读取本地json文件的实例
2018/03/07 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
用js获取电脑信息(是使用与IE浏览器)
2013/01/15 Javascript
jquery改变tr背景色的示例代码
2013/12/28 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
20分钟成功编写bootstrap响应式页面 就这么简单
2016/05/12 Javascript
Bootstrap table简单使用总结
2017/02/15 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
JavaScript数组的5种迭代方法
2017/09/29 Javascript
微信小程序开发实现消息推送
2020/11/18 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
在Python的Django框架中用流响应生成CSV文件的教程
2015/05/02 Python
Python编程之属性和方法实例详解
2015/05/19 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
Python TestCase中的断言方法介绍
2019/05/02 Python
Python依赖包整体迁移方法详解
2019/08/15 Python
python 内置函数汇总详解
2019/09/16 Python
python 实现dict转json并保存文件
2019/12/05 Python
Pytorch之finetune使用详解
2020/01/18 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
css3选择器基本介绍
2014/12/15 HTML / CSS
控制工程专业个人求职信
2013/09/25 职场文书
环境科学专业个人求职信
2013/09/26 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
环保倡议书100字
2014/05/15 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
幼儿学前班评语
2014/12/29 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书