js移动端事件基础及常用事件库详解


Posted in Javascript onAugust 15, 2017

一、事件基础

PC:click、mouseover、mouseout、mouseenter、mouseleave、mousemove、mousedown、mouseup、mousewheel、keydown、keyup、load、scroll、blur、focus、change...

移动端:click(单击)、load、scroll、blur、focus、change、input(代替keyup、keydown)...TOUCH事件模型(处理单手指操作)、GESTURE事件模型(处理多手指操作)

TOUCH:touchstart、touchmove、touchend、touchcancel

GESTURE:gesturestart、gesturechange、gestureend

1、click:在移动端click属于单击事件,不是点击事件,在移动端的项目中我们经常会区分单击做什么和双击做什么,所以移动端的浏览器在识别click的时候,只有确定是单击后才会把它执行:

在移动端使用click会存在300ms的延迟:浏览器在第一次点击结束后,还需要等到300ms看是否触发了第二次点击,如果触发了第二次点击就不属于click了,没有触发第二次点击才属于click

下面代码是移动端模拟click时间的代码

function on(curEle,type,fn){
   curEle.addEventListener(type,fn,false);
  }
  var oBox = document.querySelector('.box');
  //移动端采用click存在300ms延迟
  // oBox.addEventListener('click',function(){
  //  this.style.webkitTransform = 'rotate(360deg)'
  // },false)
  //使用TOUCH事件模型实现点击操作(单击&&双击)
  on(oBox,'touchstart',function(ev){
   //ev:TouchEvent事件 属性 type、target、preventDefault(returnValue)、stopPropagation、changedTouches、touches
   //changedTouches和touches都是手指信息的集合(touchList),touches获取到值的必要条件只有手指还在屏幕上才可以获取,所以在touchend事件中如果想获取手指离开的瞬间坐标只能使用changedTouches获取
   var point = ev.touches[0];
   this['strX'] = point.clientX;
   this['strY'] = point.clientY;
   this['isMove'] = false;
  })
  on(oBox,'touchmove',function(ev){
   var point = ev.touches[0];
   var newX = point.clientX,
    newY = point.clientY;
   //判断是否发生滑动,我们需要判断偏移的值是否在30PX以内
   if(Math.abs(newX-this['strX'])>30 || Math.abs(newY-this['strY'])>30){
    this['isMove'] = true;
   }
  })
  on(oBox,'touchend',function(ev){
   if(this['isMove'] === false){
    //没有发生移动 点击
    this.style.webkitTransitionDuration = '1s';
    this.style.webkitTransform = 'rotate(360deg)';
    var delayTimer = window.setTimeout(function(){
     this.style.webkitTransitionDuration = '0s';
     this.style.webkitTransform = 'rotate(0deg)';
    }.bind(this),1000);
   }else{
    //滑动
    this.style.background = 'red';
   }
  })

同时也可以使用fastclick.js来解决移动端click事件的300ms延迟 (github地址https://github.com/zhouxiaotian/fastclick)

2、点击、单击、双击、长按、滑动、左滑、右滑、上滑、下滑

单击和双击(300MS)

点击和长按(750MS)

点击和滑动(X/Y轴偏移的距离是否在30PX以内,超过30PX就是滑动)

左右滑动和上下滑动(X轴偏移的距离 > Y轴偏移的距离 = 左右滑 相反就是上下滑)

左滑和右滑(偏移的距离 >0 = 右滑  相反就是左滑)

二、常用的事件库

FastClick.js :解决CLICK事件300MS的延迟

TOUCH.js:百度云移动手势库  GitHub地址  https://github.com/Clouda-team/touch.code.baidu.com

实例如下:

var oBox = document.querySelector('.box');
  //单击
  touch.on(oBox,'tap',function(ev){
   this.style.webkitTransitionDuration = '1s';
   this.style.webkitTransform = 'rotate(360deg)';
   var delayTimer = window.setTimeout(function(){
    this.style.webkitTransitionDuration = '0s';
    this.style.webkitTransform = 'rotate(0deg)';
    window.clearTimeout(delayTimer)
   }.bind(this),1000)
  })
  //双击
  touch.on(oBox,'doubletap',function(ev){
   this.style.webkitTransitionDuration = '1s';
   this.style.webkitTransform = 'rotate(-360deg)';
   var delayTimer = window.setTimeout(function(){
    this.style.webkitTransitionDuration = '0s';
    this.style.webkitTransform = 'rotate(0deg)';
    window.clearTimeout(delayTimer)
   }.bind(this),1000)
  })
  //长按
  touch.on(oBox,'hold',function(ev){
   this.style.backgroundColor = 'red';
  })

HAMMER.js

Zepto.js:被誉为移动端的小型JQ,JQ由于是在PC端使用的,所以代码中包含了大量对于ie低版本浏览器的兼容处理,而ZEPTO只应用在移动端开发,所以在JQ的基础上没有对低版本的ie进行支持

JQ中提供了很多的选择器类型及DOM操作方法,但是ZEPTO只是实现了部分常用的选择器和方法。例如:JQ中的动画方法有animate、hide、show、fadeIn、fadeOut、fadeToggle、slideDown、slideUp、slideToggle...但是在ZEPTO中只有animate

ZEPTO的源代码大小比JQ小很多

ZEPTO专门为移动端开发而诞生,所以相对于JQ来说更适合移动端:

ZEPTO的animate动画方法支持了CSS3动画的操作

ZEPTO专门的准备了移动端常用 的事件操作:tap、singleTap、doubleTap、longTap、swipe、swipeUp、swipeDown、swipeLeft、swipeRight

实例代码如下:

$('.box').singleTap(function(ev){
   $(this).animate({
    rotate:'360deg'
   },1000,'linear',function(){
    this.style.webkitTransform = 'rotate(0)'
   })
  })

  $('.box').on('touchstart',function(){
   $(this).css('background','red')
  })
  $.ajax({
   url:'',
   type:'get',
   dataType:'json',
   cache:false,
   success:function(){
    
   }
  })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
Aug 29 Javascript
node.js入门教程
Jun 01 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
Jun 07 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
JS/HTML5游戏常用算法之追踪算法实例详解
Dec 12 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
Sep 10 Javascript
Vue实现购物车实例代码两则
May 30 Javascript
详解用js代码触发dom事件的实现方案
Jun 10 Javascript
JS中作用域以及变量范围分析
Jul 18 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
js实现移动端轮播图效果
Dec 09 #Javascript
JavaScript递归算法生成树形菜单
Aug 15 #Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 #Javascript
input输入框内容实时监测(附代码)
Aug 15 #Javascript
vue的基本用法与常见指令
Aug 15 #Javascript
vue如何集成raphael.js中国地图的方法示例
Aug 15 #Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 #Javascript
You might like
PHP+HTML+JavaScript+Css实现简单爬虫开发
2016/03/28 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
javascript SpiderMonkey中的函数序列化如何进行
2012/12/05 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
javascript闭包入门示例
2014/04/30 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
用NODE.JS中的流编写工具是要注意的事项
2016/03/01 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
图片上传之FileAPI与NodeJs
2017/01/24 NodeJs
Koa日志中间件封装开发详解
2019/03/09 Javascript
[03:40]DOTA2英雄梦之声_第01期_炼金术士
2014/06/23 DOTA
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
python循环监控远程端口的方法
2015/03/14 Python
python列出目录下指定文件与子目录的方法
2015/07/03 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
使用darknet框架的imagenet数据分类预训练操作
2020/07/07 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
文明礼仪事迹材料
2014/01/09 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
艾滋病宣传标语
2014/06/25 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
开幕式邀请函
2015/01/31 职场文书
企业计划生育责任书
2015/05/09 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python
vue3不同环境下实现配置代理
2022/05/25 Vue.js