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获取提交的字符串的字节数
Feb 09 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
Apr 11 Javascript
jquery选择器之层级过滤选择器详解
Jan 27 Javascript
实现无刷新联动例子汇总
May 20 Javascript
JQuery实现鼠标滚轮滑动到页面节点
Jul 28 Javascript
Jquery幻灯片特效代码分享--打开页面随机选择切换方式(3)
Aug 15 Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 Javascript
Bootstrap表单Form全面解析
Jun 13 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
Jan 05 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
Jun 18 Javascript
vue 使用鼠标滚动加载数据的例子
Oct 31 Javascript
微信小程序新闻网站详情页实例代码
Jan 10 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
php二维数组合并及去重复的方法
2015/03/04 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
PHP使用观察者模式处理异常信息的方法详解
2019/09/24 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
详解jQuery中的DOM操作
2016/12/23 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
基于layui table返回的值的多级嵌套的解决方法
2019/09/19 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
在Python中操作时间之tzset()方法的使用教程
2015/05/22 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
python和opencv实现抠图
2018/07/18 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
材料会计岗位职责
2014/03/06 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
高中美术教师事迹材料
2014/08/22 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
2014大学班主任工作总结
2014/11/08 职场文书
2014年女职工工作总结
2014/11/27 职场文书
担保书范文
2015/01/20 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
教你利用Selenium+python自动化来解决pip使用异常
2021/05/20 Python
Python数据处理的三个实用技巧分享
2022/04/01 Python
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript