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中undefined与null的区别
Mar 29 Javascript
javascript中数组的定义及使用实例
Jan 21 Javascript
JSON与String互转的实现方法(Javascript)
Sep 27 Javascript
使用原生的javascript来实现轮播图
Feb 24 Javascript
JavaScript高阶函数_动力节点Java学院整理
Jun 28 Javascript
Webpack框架核心概念(知识点整理)
Dec 22 Javascript
详解angular应用容器化部署
Aug 14 Javascript
vue中使用gojs/jointjs的示例代码
Aug 24 Javascript
vue中的mescroll搜索运用及各种填坑处理
Oct 30 Javascript
VUE table表格动态添加一列数据,新增的这些数据不可以编辑(v-model绑定的数据不能实时更新)
Apr 03 Javascript
jQuery实现购物车全功能
Jan 11 jQuery
手写Spirit防抖函数underscore和节流函数lodash
Mar 22 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+mysql一个名片库程序
2006/10/09 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
客户端静态页面玩分页
2006/06/26 Javascript
jQuery 1.0.2
2006/10/11 Javascript
jQuery之排序组件的深入解析
2013/06/19 Javascript
常用DOM整理
2015/06/16 Javascript
AngularJS 单元测试(二)详解
2016/09/21 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
脚手架vue-cli工程webpack的作用和特点
2018/09/29 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 的列表遍历删除实现代码
2020/04/12 Python
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
对python中Json与object转化的方法详解
2018/12/31 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
浅析python连接数据库的重要事项
2021/02/22 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
解决html5中的video标签ios系统中无法播放使用的问题
2020/08/10 HTML / CSS
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
个人简历自我评价范文
2014/02/04 职场文书
幼儿园中秋节活动反思
2014/02/16 职场文书
四议两公开实施方案
2014/03/28 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
初中家长意见
2015/06/03 职场文书
团支部书记竞选稿
2015/11/21 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
gateway与spring-boot-starter-web冲突问题的解决
2021/07/16 Java/Android
Go 中的空白标识符下划线
2022/03/25 Golang
php解析非标准json、非规范json的方式实例
2022/05/10 PHP