博客
关于我
HTML5手势、拖放、定位事件
阅读量:135 次
发布时间:2019-02-27

本文共 6000 字,大约阅读时间需要 20 分钟。

文章目录

1.手势事件(移动端)

引入:

zepto库,该库与jQuery用法相同。封装了移动端手势

  • Zepto.js是专门为现代智能手机浏览器推出的JavaScript框架
  • Zepto的一些可选功能专门针对移动浏览器,因为最初的目标是专门为移动网站提供一个精简的jQuery替代方案

移动端事件再使用之前,必须添加移动端优先的设置:

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

1.1 click事件

IOS设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。

不需要使用fastclick的情况

  1. FastClick是不会对PC浏览器添加监听事件
  2. Android版Chrome 32+浏览器,如果设置viewport meta的值为width=device-width,这种情况下浏览器会马上出发点击事件,不会延迟300毫秒。
  3. 所有版本的Android Chrome浏览器,如果设置viewport meta的值有user-scalable=no,浏览器也是会马上出发点击事件。
  4. IE11+浏览器设置了css的属性touch-action: manipulation,它会在某些标签(a,button等)禁止双击事件,IE10的为-ms-touch-action: manipulation

1.2 tap类事件

tap事件需要引入zepto库,该库与jQuery用法相同。

触碰事件**,一般用于移动端代替click事件**,有tap longTap singleTap doubleTap四种之分tap 事件在用户轻击 一个元素时触发。

事件名 解释
tap 手指碰一下屏幕会触发
longTap 手指长按屏幕会触发
singleTap 手指碰一下屏幕会触发
doubleTap 手指双击屏幕会触发

注意:
1)如果要使用zepto.js时,有些api单独放在其它js模块中,使用时需要引入这些模块,然后才能调用对应的方法。
2)如果要使用zepto.js中的tap事件,需要引入touch.js描件。
3)tap事件在PC端使用时是无效的,只能在移动端使用。
4)如果要使用常规事件,如click事件等,需要引入event.js插件。

1.3 swipe类事件

滑动事件,有swipe swipeLeft swipeRight swipeUp swipeDown 五种之分。

事件名 解释
swipe 手指在屏幕上滑动时会触发
swipeLeft 手指在屏幕上向左滑动时会触发
swipeRight 手指在屏幕上向右滑动时会触发
swipeUp 手指在屏幕上向上滑动时会触发
swipeDown 手指在屏幕上向下滑动时会触发
<script src="js/zepto.js"></script><script src="js/event.js"></script><script src="js/touch.js"></script><script>    $(document).swipe(function () {           console.log('我是swipe事件');    });    $(document).swipeLeft(function () {           console.log('我是swipeLeft事件');    });    $(document).swipeRight(function () {           console.log('我是swipeRight事件');    });    $(document).swipeUp(function () {           console.log('我是swipeUp事件');    });    $(document).swipeDown(function () {           console.log('我是swipeDown事件');    });

1.4 touch类事件

触摸事件,有touchstart touchmove touchend touchcancel 四种之分。

这时Js原生为我们提供的事件,因此我们不需要依赖任何库。

事件名 解释
touchstart 手指触摸到屏幕会触发
touchmove 当手指在屏幕上移动时,会触发
touchend 当手指离开屏幕时,会触发
touchcancel 可由系统进行的触发,比如手指触摸屏幕的时候,突然alert了一下,或者系统中其他打断了 touch的行为,则可以触发该事件
 document.body.ontouchstart=function(){           console.log('ontouchstart');    }    document.body.ontouchmove=function(){           alert();        console.log('ontouchmove');            }    document.body.ontouchend=function(){           console.log('ontouchend');    }    document.body.ontouchcancel=function(){           console.log('ontouchcancel');    }

2.拖放事件

拖放是一种常见的特性,即抓取对象以后拖到另一个位置。在 HTML5 中,拖放是标准的一部分,任何元素都 能够拖放。

设置元素可以被拖动,必须现在元素上添加属性draggable,否则拖动无效。

事件 说明 作用位置
ondragstart 当拖拽元素开始被拖拽的时候触发的事件 被拖曳元素上
ondragenter 当拖曳元素进入目标元素的时候触发的事件 目标元素上
ondragover 拖拽元素在目标元素上移动的时候触发的事件 目标元素上
ondrop 被拖拽的元素在目标元素上同时鼠标放开触发的事件 目标元素上
ondragend 当拖拽完成后触发的事件 被拖曳元素上

注意:

  1. 事件对象中包含DataTransfer对象,它是用来拖拽对象用来传递的媒介,使用一般为Event.dataTransfer 。

  2. Event.effectAllowed 属性:就是拖拽的效果。

  3. Event.preventDefault() 方法:阻止默认的些事件方法等执行。在ondragover中千万一定要执行 preventDefault(),否则ondrop事件不会被触发。另外,如果是从其他应用软件或是文件中拖东西进来,尤 其是图片的时候,默认的动作是显示这个图片或是相关信息,并不是真的执行drop。此时需要用用 document的ondragover事件把它直接干掉 。

实例:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>         .box{                overflow: hidden;         }         .box1,.box2{             float: left;          width: 300px;          height: 400px;          border: 1px solid black;         }         #img{                width: 100%;         }             </style></head><body> <div class="box">     <div class="box1">         <img id="img" draggable="true" src="img/tu.jpg">     </div>     <div class="box2"></div> </div></body><script>    var box1=document.querySelector('.box1');    var box2=document.querySelector('.box2');    var img=document.querySelector('#img');    img.ondragstart=function(e){           console.log(e.dataTransfer);        e.dataTransfer.setData('tt',e.target.id);    }    box2.ondragover=function(e){          e.preventDefault();    }    box2.ondrop=function(e){          this.appendChild(document.getElementById(e.dataTransfer.getData('tt')));    }    box1.ondragover=function(e){          e.preventDefault();    }    box1.ondrop=function(e){          this.appendChild(document.getElementById(e.dataTransfer.getData('tt')));    }</script></html>

3.定位事件

HTML5 Geolocation API 用于获得用户的地理位置。 Internet Explorer 9、Firefox、Chrome、Safari 以及 Opera 支持地理定位。对于拥有 GPS 的设备,比如 iPhone,地理定位更加精确。该对象主要有三个方法: getCurrentPosition(),watchPosition(),clearWatch()。但是我们要判断浏览器的支持情况。

实例:

if (navigator.geolocation){     // 支持}else{     // 不支持    console.log("您的浏览器不支持定位")}

3.1 getCurrentPosition()方法

getCurrentPosition()方法 可以传递三个参数。调用这个方法就会触发请求用户共享地理定位信息的对话框 。 这个方法接收三个具体的参数分别是成功的回调函数,失败回调函数,以及配置选项。

getCurrentPosition方法参数说明

参数 说明 是否必须
successFn( position ) 成功回调函数 ,成功的回调函数会返回一个位置数据对象
errorFn(msg) 失败回调函数 ,返回一个msg对象包含错误信息和代码
option 配置选项对象

实例:

 if (navigator.geolocation) {           console.log('支持定位');        navigator.geolocation.getCurrentPosition(succeed);        function succeed(params) {               console.log(params.coords.latitude);            console.log(params.coords.longitude);        }    } else {           console.log('不支持定位');            }

注意:因为我们的这个API默认访问的使用谷歌地图,所以很有可能会出现错误,因为国内访问谷歌地图服务器有 限制。

3.2 watchPosition()方法

如果要跟踪用户的位置,那么可以使用 watchPosition() 方法。这个方法的使用和 getCurrentPosition() 完全 相同。实际上 watchPosition() 与定时调用 getCurrentPosition() 能得到相同效果。在第一次调用 watchPosition() 方法后,会取得当前位置,执行成功回调或者错误回调。然后,watchPosition() 就地等待系统发出位置已改变的 信号。

调用 watchPosition() 会返回一个数值标识符,用于跟踪监控的操作。基于这个返回值可以取消监控操作,只 要将其传递给 clearWatch() 方法即可(与使用 setTimeout() 和 clearTimeout() 类似),例如:

var watchId = navigator.geolocation.watchPosition(success, error);clearWatch(watchId);

3.3 clearWatch()方法

清除一个跟踪控制监听。需要传入使用watchPosition函数返回的值。

3.4 百度地图api获取当前定位

步骤:

  1. 进入网站
  2. 注册并登录
  3. 在控制台->我的应用中添加一个应用,用于获取ak(密钥)值,注意:百度地图1.4以下的版本不需要ak,1.4以上的版本必须要ak
  4. 开发(看文档)
  5. 运行(必须在服务端运行)

附:再Vscode中可以使用Live Server和http-server(需要安装Node)开启服务

i)安装node.js
ii)在VS Code中打开终端,安装http-server(用来启动服务)
npm i http-server -g
iii)用http-server启动服务
http-server
或:
http-server -p 81
iv)在浏览器地址栏输入网址:http://127.0.0.1:81

转载地址:http://lymf.baihongyu.com/

你可能感兴趣的文章
MySQL CRUD 数据表基础操作实战
查看>>
multisim变压器反馈式_穿过隔离栅供电:认识隔离式直流/ 直流偏置电源
查看>>
mysql csv import meets charset
查看>>
multivariate_normal TypeError: ufunc ‘add‘ output (typecode ‘O‘) could not be coerced to provided……
查看>>
MySQL DBA 数据库优化策略
查看>>
multi_index_container
查看>>
MySQL DBA 进阶知识详解
查看>>
Mura CMS processAsyncObject SQL注入漏洞复现(CVE-2024-32640)
查看>>
Mysql DBA 高级运维学习之路-DQL语句之select知识讲解
查看>>
mysql deadlock found when trying to get lock暴力解决
查看>>
MuseTalk如何生成高质量视频(使用技巧)
查看>>
mutiplemap 总结
查看>>
MySQL DELETE 表别名问题
查看>>
MySQL Error Handling in Stored Procedures---转载
查看>>
MVC 区域功能
查看>>
MySQL FEDERATED 提示
查看>>
mysql generic安装_MySQL 5.6 Generic Binary安装与配置_MySQL
查看>>
Mysql group by
查看>>
MySQL I 有福啦,窗口函数大大提高了取数的效率!
查看>>
mysql id自动增长 初始值 Mysql重置auto_increment初始值
查看>>