700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > pc 端与移动端区分点击与拖拽事件

pc 端与移动端区分点击与拖拽事件

时间:2021-01-11 22:37:50

相关推荐

pc 端与移动端区分点击与拖拽事件

pc 端与移动端区分点击与拖拽事件

PC 端移动端

在 html 的应用中,拖拽事件为 mousedown -> mousemove -> mouseup 三个事件组成,在一个有拖拽事件的 div 中监听一个 click 事件,当拖拽之后也会出发 click 事件,为了不让拖拽事件影响到点击事件,需要区分点击事件和拖拽事件

PC 端

示例代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Click</title><style>#container {width: 500px;height: 500px;background-color: aqua;}</style></head><body><div id="container"></div><script>const container = document.getElementById('container');container.addEventListener('mousedown', (event) => {console.log('mousedown event is', event)})container.addEventListener('mouseup', (event) => {console.log('mouseup event is', event)})</script></body></html>

当点击时,可以查看打印信息

点击时的打印信息

拖拽后的打印信息

可以看出点击后的 mousedown 和 mouseup 的 MouseEvent 的 clientX 与 clientY 的值是相等的,而拖拽后的 clientX 与 clientY 的值不同,故可以通过判断 clientX 和 clientY 的值来判断点击事件或者拖拽事件,修改后的代码为:

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Click</title><style>#container {width: 500px;height: 500px;background-color: aqua;}</style></head><body><div id="container"></div><script>const clientOffset = {};const container = document.getElementById('container');container.addEventListener('mousedown', (event) => {clientOffset.clientX = event.clientX;clientOffset.clientY = event.clientY;})container.addEventListener('mouseup', (event) => {const clientX = event.clientX;const clientY = event.clientY;if (clientX === clientOffset.clientX && clientY === clientOffset.clientY) {console.log('click');} else {console.log('drag');}})</script></body></html>

移动端

在移动端中,点击以及拖拽时没有 mousedown 和 mouseup 事件,所以我们需要使用移动端的事件,移动端的事件如下

所以我们需要使用 touchstart 和 touchend 来代替 mousedown 和 mouseup,并且 TouchEvent 接口的点击位置在 event.changeTouches 列表中记录,所以取 clientOffset 值的时候需要从 changeTouches 列表中取值

示例代码

<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Click</title><style>#container {width: 200px;height: 200px;background-color: aqua;}</style></head><body><div id="container"></div><script>const clientOffset = {};const container = document.getElementById('container');container.addEventListener('touchstart', (event) => {clientOffset.clientX = event.changedTouches[0].clientX;clientOffset.clientY = event.changedTouches[0].clientY;})container.addEventListener('touchend', (event) => {const clientX = event.changedTouches[0].clientX;const clientY = event.changedTouches[0].clientY;if (clientX === clientOffset.clientX && clientY === clientOffset.clientY) {console.log('click');} else {console.log('drag');}})</script></body></html>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。