整理下PC和移动获取点击、移动坐标的代码和坑
一、PC
PC是通过鼠标点击和移动,相对比较简单,比如onmousedown、onmouseup、onmousemove、onmouseout鼠标按键按下、按键起来、鼠标在元素上移动、鼠标从元素上离开。
canvas.onmousedown = function(e) {
console.log(e.clientX, e.clientY);
}
canvas.onmouseup = function(e) {
console.log(e.clientX, e.clientY);
}
canvas.onmousemove = function(e) {
console.log(e.clientX, e.clientY);
}
canvas.onmouseout = function(e) {
console.log(e.clientX, e.clientY);
}
PC端可以直接通过事件的clientX和clientY来获取点击的坐标,这个坐标(e.clientX , e.clientY)是相对于window的左上角来确定的。
同样事件参数evnet,有一些常用方法如阻止事件在浏览器中的默认操作和事件冒泡。
e.preventDefault()为阻止事件在浏览器中的默认操作,如input type为submit时的提交操作,我一般在事件函数中都会使用它,特别是在移动端。记得之前有个坑,在微信内置浏览器中,touchmove事件触发时,微信内置浏览器会默认拖动整个WebView向上或向下移动,显示出那个QQ浏览器内核什么鬼的文字,而没有执行想要的操作。
e.stopPropagation()为防止事件穿透,不调用此方法时,事件被捕获后,仍然会继续传播可能会被下方的元素事件所捕获进而造成影响。所以在元素覆盖元素,且都有绑定事件的时候需要阻止事件冒泡。
二、移动
移动和PC在处理事件上有些不同之处,首先事件上不同,移动这边是touchstart、touchmove、touchend这3个事件。
canvas.addEventListener("touchstart", function(e) {
console.log(e.touches[0].pageX, e.touches[0].pageY);
});
canvas.addEventListener("touchmove", function(e) {
if(e.touches.length > 1 || e.scale && e.scale !== 1) return;
console.log(e.touches[0].pageX, e.touches[0].pageY);
});
canvas.addEventListener("touchend", function(e) {});
移动端由于是手指操作而非鼠标,所以存在多点触控,即多根手指在屏幕上触发事件。所以,不在跟PC一样,通过e.clientX来获取单个点坐标。而是事件event中存在一个触控集合touches这个数组,通过取数组的第一个元素来获取坐标位置,即第一个触碰屏幕手指的坐标(e.touches[0].pageX , e.touches[0].pageY)。而有时往往有需要获取全部触碰点的位置,那就要循环数组了,逐个处理。另一个坑就是有时要防止多点触碰,以及手指对屏幕进行缩放的影响,可以加入以上判断if(e.touches.length > 1 || e.scale && e.scale != 1)。
最后就是touchend事件,代表手指离开屏幕不存在触控,所以e.touches这个数组的长度为0,也就不能在touchend的处理函数中获取pageX属性了。
三、元素内的位置
通过以上方法获取的坐标是以window左上角为原点的坐标,但是在实际中,往往获取的是以某个元素左上角为原点的坐标,这时就需要做个转化。以canvas为例
function windowToCanvas(x, y) { //window坐标转canvas坐标
return {
x: Math.round(x - document.getElementById("canvas").getBoundingClientRect().left - document.body.scrollLeft),
y: Math.round(y - document.getElementById("canvas").getBoundingClientRect().top - document.body.scrollTop)
}
}
getBoundingClientRect()方法可以获取元素的盒子模型,通过top、left、right、bottom这4个属性可以拿到四周的边距。
整理下PC和移动获取点击、移动坐标的代码和坑的更多相关文章
- (java)selenium webdriver学习,选择模块,点击下一页,获取当前url
selenium webdriver学习,选择模块,点击下一页,获取当前url 查找下一页有多种方法,这里列举两种: isSelected()函数用于判断是否点击选中,返回Boolean类型 impo ...
- jQuery获取点击对象的父级
一.使用$('body').on('click','.index',function(event){})绑定事件时,例: <div class="project-box"&g ...
- win7下用python3.3获取cable modem的设备信息
毕业一年多了,一直做cable modem的测试,总是觉得在国内这一行的人才很少,想找个师傅真的很不容易. 苦闷了许久之后,终于决定,自己去写点东西,万一就找到同行了呢? 下面就是本小姐写的第一篇博客 ...
- Android tabhost下的activity怎样获取传来的值
android tabhost下的activity怎样获取传来的值,具体解决方案如下: 解决方案: 其他activity设置intent:Intent intent=new Intent(); int ...
- 基于定位下拉框或者需要点击link才显示的下拉框,二次定位与多次定位实现的实际效果区别
还是基于上次那个练习的后续出现的思考,http://www.cnblogs.com/8013-cmf/p/6555790.html 界面: 源码: 写法如下: 继续解释这两种的区别: 1.其实基于定 ...
- ios下,<input type="checkbox"> 点击时出现黑色块
ios下,<input type="checkbox"> 点击时出现黑色块如下图 解决方法:
- 清流,获取点击的img路径
清流: <div style="clear:both"></div> 获取img的路径到TextBox3内: //获取展示的头像的集合var _heads ...
- 百度“搜索设置”之基于定位下拉框或者需要点击link才显示的下拉框,二次定位与多次定位实现的实际效果区别
还是基于上次那个练习的后续出现的思考,http://www.cnblogs.com/8013-cmf/p/6555790.html 界面: 源码: 写法如下: 继续解释这两种的区别: 1.其实基于定 ...
- 页面中php传值后循环列表js获取点击的id
页面中php传值后循环列表js获取点击的id值进行js操作 <script type="text/javascript" src="__PUBLIC__/js/jq ...
随机推荐
- Linux服务器基本信息查看
Linux服务器基本信息通常包括如下几方面: CPU信息 内存使用信息 硬盘使用情况 服务器负载状况 其它参数 1.获取CPU的详细情况 [root@VM_41_84_centos ~]# cat / ...
- 玩转type类型(牛逼克拉斯 )
一.前言 一说起type()方法肯定有很多人都知道这不就是查看某个对象类型的嘛,其实不然,他还有更牛逼的应用------创建类 >>> type(1) <class 'int' ...
- bootstrap模板
一.bootstrap基本介绍 1.什么是bootstrap? bootstrap就是个前端快速开发的工具,该工具是个简单.直观.强悍的前端开发框架,让web开发更加迅速简单,同时也是个响应式布局,兼 ...
- atoi函数的一种实现
atoi函数的使用实例:[Ubuntu环境] main.c: #include <stdio.h> #include <stdlib.h> extern int factori ...
- 在像Angular2这样的SPA应用中使用Google Analytics的方法
Angular2のようなシングルページアプリケーションでGoogleアナリティクスを使う方法 如何在像Angular2这样的SPA应用中使用Google Analytics? 试着调查了一下. 由于S ...
- 常用模块之hashlib,configparser,logging模块
常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...
- python之网络socket编程
一.网络协议 客户端/服务器架构 1.硬件C/S架构(打印机) 2.软件C/S架构(互联网中处处是C/S架构):B/S架构也是C/S架构的一种,B/S是浏览器/服务器 C/S架构与socket的关系: ...
- android 获取视频缩略图终极解决方案(ffmpeg)
http://blog.csdn.net/u010499721/article/details/50338623 前些天有个师弟(在做一个仿LinkInEyes行车记录仪的app)问我怎么获取视频缩略 ...
- Python编程-编码、变量、数据类型
一.Python和其他语言对比 C语言最接近机器语言,因此运行效率是最高的,但需要编译. JAVA更适合企业应用. PHP适合WEB页面应用. PYTHON语言更加简洁,丰富的类库,使初学者更易实现应 ...
- unity json解析IPA后续
以前说到的,有很大的限制,只能解析简单的类,如果复杂的就会有问题,从老外哪里看到一片博客,是将类中的list 等复杂对象序列化, using UnityEngine; using System.C ...