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 相关文章推荐
web网页按比例显示图片实现原理及js代码
Aug 09 Javascript
jQuery封装的获取Url中的Get参数示例
Nov 26 Javascript
js菜单点击显示或隐藏效果的简单实例
Jan 13 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
Dec 01 Javascript
JS遍历对象属性的方法示例
Jan 10 Javascript
JS回调函数简单用法示例
Feb 09 Javascript
Vue和Bootstrap的整合思路详解
Jun 30 Javascript
webpack 模块热替换原理
Apr 09 Javascript
基于Three.js实现360度全景图片
Dec 30 Javascript
js中值引用和地址引用实例分析
Jun 21 Javascript
javascript实现抢购倒计时程序
Aug 26 Javascript
jQuery实现简单全选框
Sep 13 jQuery
微信小程序中换行空格(多个空格)写法详解
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中break及continue两个流程控制指令区别分析
2011/04/18 PHP
Yii配置与使用memcached缓存的方法
2016/07/13 PHP
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
Vue.js Ajax动态参数与列表显示实现方法
2016/10/20 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
JS在if中的强制类型转换方式
2018/07/15 Javascript
关于element-ui的隐藏组件el-scrollbar的使用
2019/05/29 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
JavaScript中展开运算符及应用的实例代码
2021/01/14 Javascript
Python学习小技巧之利用字典的默认行为
2017/05/20 Python
Python 批量合并多个txt文件的实例讲解
2018/05/08 Python
Python下调用Linux的Shell命令的方法
2018/06/12 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
centos7之Python3.74安装教程
2019/08/15 Python
python opencv调用笔记本摄像头
2019/08/28 Python
Python 列表的清空方式
2020/01/13 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
比利时家具购买网站:Home24
2019/01/03 全球购物
美国排名第一的泳池用品直接来源:In The Swim
2019/09/23 全球购物
Booking.com亚太地区:Booking.com APAC
2020/02/07 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
旺仔牛奶广告词
2014/03/20 职场文书
文明礼仪标语
2014/06/13 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
教师学期个人总结
2015/02/11 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
中秋节随笔
2015/08/15 职场文书
电力企业职工培训心得体会
2016/01/11 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书