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 相关文章推荐
jQuery页面滚动浮动层智能定位实例代码
Aug 23 Javascript
提交表单时执行func方法实现代码
Mar 17 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
jquery.validate使用时遇到的问题
May 25 Javascript
实例讲解JavaScript中的this指向错误解决方法
Jun 13 Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 Javascript
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
详解写好JS条件语句的5条守则
Feb 28 Javascript
对vue中的事件穿透与禁止穿透实例详解
Oct 28 Javascript
webpack优化之代码分割与公共代码提取详解
Nov 22 Javascript
如何利用js在两个html窗口间通信
Apr 27 Javascript
JavaScript实现登录窗体
Jun 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修改NetBeans默认字体的大小
2013/07/02 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
js对数字的格式化使用说明
2011/01/12 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jquery 设置style:display的方法
2015/01/29 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
微信小程序开发之自定义tabBar的实现
2018/09/06 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
微信小程序常用赋值方法小结
2019/04/30 Javascript
详解小程序用户登录状态检查与更新实例
2019/05/15 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
JS Array.from()将伪数组转换成数组的方法示例
2020/03/23 Javascript
jQuery实现可以扩展的日历
2020/12/01 jQuery
python3读取csv和xlsx文件的实例
2018/06/22 Python
解决Python中回文数和质数的问题
2019/11/24 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
意大利消费电子产品购物网站:SLG Store
2019/12/26 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
《郑和远航》教学反思
2014/04/16 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
党员查摆问题及整改措施
2014/10/10 职场文书
2019公司管理制度
2019/04/19 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
Python NumPy灰度图像的压缩原理讲解
2021/08/04 Python
python接口测试返回数据为字典取值方式
2022/02/12 Python
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android