谁若孜孜于寻找,就越容易迷失自己。一切孤独皆是罪过。
介绍一下怎么去封装移动端的轻敲事件,也就是pc端的点击事件
- 为什么封装 :
- 首先为什么封装轻敲事件
- 因为在移动端click事件会有300ms 的延迟,用户体验不好,
- 所以我们根据移动端的三大时间类封装一个tap(统称)事件
- 需求 :
- 在tap事件发生的时候,不能触发touchmove 事件
- touchend发生的时间 — toouchstart发生的时间 < 150ms
- 移动端的轻敲事件 :
- @param {Object} el 发生事件的元素
- @param {Function} fn 事件处理函数
代码实现 :
<script>
// 1. 首先为什么封装轻敲事件
// 因为在移动端click事件会有300ms 的延迟,用户体验不好,
// 所以我们根据移动端的三大时间类封装一个tap(统称)事件
// 2. 需求需求
// 在tap事件发生的时候,不能触发touchmove 事件
// touchend发生的时间 --- toouchstart发生的时间 < 150ms
function tap(ele, fn) {
var startTime;
var flag = false;
// 在轻敲事件开始的时候记录一下时间 由于后面也要使用,所以使用全局变量
ele.addEventListener('touchstart', function() {
// 将获取的时间转化为时间戳
startTime = new Date().getTime();
console.log(startTime); // 1533460365267
});
// 在tap事件发生的时候,不能触发touchmove 事件,这该怎么办呢?
// 知道 flag 吗? 来一个开关
ele.addEventListener('touchmove', function() {
// 如果进入这里面的话,将开关重新赋值
flag = true;
});
// 当手指与屏幕离开的时候
ele.addEventListener('touchend', function() {
// 记录结束的时间
var endTime = new Date().getTime();
// 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
if (flag == false && endTime - startTime < 150) {
fn();
}
})
}
var html = document.documentElement;
tap(html, function(e) {
console.log(e);
console.log(this);
});
</script>
上面封装好了,但是有很多细节问题
- 当调用一个函数的时候 如果有形参 没有实参 形参的值为undefined , 如果是undefined的时候是不是就会报错,所以呢? 进行判断
- 注意观察这里的代码与上面的有什么不同
ele.addEventListener('touchend', function() {
// 记录结束的时间
var endTime = new Date().getTime();
// 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
if (flag == false && endTime - startTime < 150) {
fn && fn();
// 这是什么意识,js中的并且运算符,两边都为真的时候,才能够触发,
}
})
还有一个问题,就是节点的问题,js中最常见的三个节点 : 文本节点,元素节点,属性节点
所以~~还得进行判断,一步到位
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 1. 首先为什么封装轻敲事件
// 因为在移动端click事件会有300ms 的延迟,用户体验不好,
// 所以我们根据移动端的三大时间类封装一个tap(统称)事件
// 2. 需求需求
// 在tap事件发生的时候,不能触发touchmove 事件
// touchend发生的时间 --- toouchstart发生的时间 < 150ms
function tap(ele, fn) {
// 如果el身上有nodeType属性 并且属性值为1的话
if (ele.nodeType && ele.nodeType == 1) {
var startTime;
var flag = false;
// 在轻敲事件开始的时候记录一下时间 由于后面也要使用,所以使用全局变量
ele.addEventListener('touchstart', function() {
// 将获取的时间转化为时间戳
startTime = new Date().getTime();
console.log(startTime); // 1533460365267
});
// 在tap事件发生的时候,不能触发touchmove 事件,这该怎么办呢?
// 知道 flag 吗? 来一个开关
ele.addEventListener('touchmove', function() {
// 如果进入这里面的话,将开关重新赋值
flag = true;
});
// 当手指与屏幕离开的时候 // 这里的 e 是浏览器传进来的事件对象,
ele.addEventListener('touchend', function(e) {
// 记录结束的时间
var endTime = new Date().getTime();
// 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
if (flag == false && endTime - startTime < 150) {
// 因为是自己调用的自己,没有事件对象,那该怎么办呢?谁有事件对象? touchend 有,手指离开那个元素,这就是事件对象
// 这里是函数调用 , 所以这里的 e 是实参
// 还需要是函数调用的时候,将这个this指向这个事件对象
fn && fn.call(ele, e);
}
})
} else {
// 进行一个警告
console.warn('轻敲事件的第一个参数必须是元素对象类型');
}
}
var html = document.documentElement;
// 注意这里的函数只是一个普通函数,没有事件对象,如果我们信息网有一个事件对象,哪该怎么办呢?
// 是不是应该在调用的时候传进来呢! 这里是形参
tap(html, function(e) {
console.log(e);
console.log(this);
});
</script>
</body>
</html>
好了,tap事件就封装好了.好好回顾一下!!!
在此附上我的QQ: 2489757828 有问题的话可以一同探讨
我的私人博客: 李大玄