点击穿透原理及解决

一、事件触发顺序

PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown、mouseup、mousemove和click事件。一次点击行为,可被拆解成:mousedown -> mouseup -> click 三步。

  手机上没有鼠标,所以就用触摸事件去实现类似的功能。touch事件包含touchstart、touchmove、touchend,注意手机上并没有tap事件。手指触发触摸事件的过程为:touchstart -> touchmove -> touchend。

  手机上没有鼠标,但不代表手机不能响应mouse事件(其实是借助touch去触发mouse事件)。也就是说在移动端的click事件可以拆解为:touchstart -> touchmove -> touchend -> click。

  浏览器在 touchend 之后会等待约 300ms ,如果没有 tap 行为,则触发 click 事件。 而浏览器等待约 300ms 的原因是,判断用户是否是双击(double tap)行为,双击过程中就不适合触发 click 事件了。 由此可以看出 click 事件触发代表一轮触摸事件的结束。

  上面说到原生事件中并没有 tap 事件,可以参考经典的 zepto.js 对 singleTap 事件的处理。见源码 136-143 行

  可以看出,singleTap 事件的触发时机 —— 在 touchend 事件响应 250ms 无操作后,触发singleTap。

二、点击穿透场景及原因

有了以上的基础,我们就可以理解为什么会出现点击穿透现象了。我们经常会看到“弹窗/浮层”这种东西,我做个了个demo。

这里写图片描述

整个容器里有一个底层元素的div,和一个弹出层div,为了让弹出层有模态框的效果,我又加了一个遮罩层。

<div class="container">
    <div id="underLayer">底层元素</div>

    <div id="popupLayer">
        <div class="layer-title">弹出层</div>
        <div class="layer-action">
            <button class="btn" id="closePopup">关闭</button>
        </div>
    </div>
</div>
<div id="bgMask"></div>

然后为底层元素绑定 click 事件,而弹出层的关闭按钮绑定 tap 事件。

$('#closePopup').on('tap', function(e){
    $('#popupLayer').hide();
    $('#bgMask').hide();
});

$('#underLayer').on('click', function(){
    alert('underLayer clicked');
});

点击关闭按钮,touchend首先触发tap,弹出层和遮罩就被隐藏了。touchend后继续等待300ms发现没有其他行为了,则继续触发click,由于这时弹出层已经消失,所以当前click事件的target就在底层元素上,于是就alert内容。整个事件触发过程为 touchend -> tap -> click。

  而由于click事件的滞后性(300ms),在这300ms内上层元素隐藏或消失了,下层同样位置的DOM元素触发了click事件(如果是input框则会触发focus事件),看起来就像点击的target“穿透”到下层去了。

  因此,点击穿透的现象就容易理解了,在这 300ms 以内,因为上层元素隐藏或消失了,由于 click 事件的滞后性,同样位置的 DOM 元素触发了 click 事件(如果是 input 则触发了 focus 事件)。在代码中,给我们的感觉就是 target 发生了飘移。

三、解决

1、只用touch

最简单的解决方案,完美解决点击穿透问题

把页面内所有click全部换成touch事件(touchstart 、’touchend’、’tap’), 需要特别注意 a标签,a标签的href也是click,需要去掉换成js控制的跳转,或者直接改成span + tap控制跳转。如果要求不高,不在乎滑走或者滑进来触发事件的话,span + touchend就可以了,毕竟tap需要引入第三方库

不用a标签其实没什么,移动app开发不用考虑SEO,即便用了a标签,一般也会去掉所有默认样式,不如直接用span

2、只用click

下下策 ,因为会带来300ms延迟,页面内任何一个自定义交互都将增加300毫秒延迟,想想都慢

不用touch就不会存在touch之后300ms触发click的问题,如果交互性要求不高可以这么做, 强烈不推荐 ,快一点总是好的

3、拿个东西来挡住

比较笨的方法, 千万不要用

4、tap后延迟350ms再隐藏mask

改动最小,缺点是隐藏mask变慢了,350ms还是能感觉到慢的

只需要针对mask做处理就行,改动非常小,如果要求不高的话,用这个比较省力

5、fastclick

好用的解决方案,不介意多加载几KB的话, 不建议使用 ,因为有人遇到了bug,更多信息请查看: Fastclick 导致click事件触发两次的问题

首先引入fastclick库,再把页面内所有touch事件都换成click,其实稍微有点麻烦,建议引入这几KB就为了解决点透问题不值得,不如用第一种方法呢

### 回答1: TeamViewer 是一款远程控制软件,可以通过互联网进行远程访问。如果要在内网中使用 TeamViewer,需要进行内网穿透设置。 内网穿透可以通过在内网中部署一个服务器,并将其与公网进行连接,从而实现公网与内网之间的数据传输。这样,就可以通过公网访问内网中的设备。 要在 TeamViewer 中实现内网穿透,需要进行以下步骤: 1. 在内网中部署一个服务器,并将其与公网进行连接。 2. 在 TeamViewer 中设置“远程访问”选项,选择“使用代理服务器”。 3. 在代理服务器设置中,输入内网服务器的 IP 地址和端口号。 4. 点击“测试连接”按钮,检查是否能够成功连接到内网服务器。 5. 完成设置后,就可以通过公网访问内网中的设备了。 需要注意的是,内网穿透涉及到网络安全问题,建议在使用前进行相关的安全评估和测试。 ### 回答2: TeamViewer内网穿透是一种技术,通过这种技术可以让用户在跨越不同网络的情况下,实现远程访问和控制其他计算机的功能。 内网穿透是为了解决用户在局域网中无法直接访问外网设备的问题。在传统的网络环境下,如果用户想要从外部网络访问到局域网中的设备,通常需要进行端口映射等一系列复杂的设置。而使用TeamViewer内网穿透技术,用户只需要安装并配置好TeamViewer软件,就能够快速地实现远程访问。 TeamViewer内网穿透原理是通过TeamViewer服务器作为中继,将用户的请求转发至目标计算机。当用户进行远程操作时,TeamViewer会将操作指令传递给目标计算机上安装的TeamViewer软件,并将目标计算机的屏幕图像传回给用户。这样,用户就可以像操作本地计算机一样远程控制目标计算机。 使用TeamViewer内网穿透技术可以实现许多实用的功能,比如远程协助、文件传输、远程演示等。而且,TeamViewer已经成为了一种非常成熟和可靠的内网穿透软件,使用者众多,安全性较高。 总而言之,TeamViewer内网穿透技术可以方便快捷地实现远程访问和控制功能,为用户带来了许多便利。无论是在家办公、远程工作,还是需要远程技术支持,TeamViewer都是一种不错的选择。 ### 回答3: TeamViewer是一款远程协助和桌面共享软件,内网穿透是它的一个重要功能。 内网穿透是指在局域网中建立一个通过公网访问的通道,使得用户可以通过互联网远程控制局域网中的设备。而TeamViewer就是利用内网穿透技术来实现远程协助和桌面共享的。 使用TeamViewer进行内网穿透,需要将一个设备作为服务器,另一个设备作为客户端。服务器设备在局域网中开启TeamViewer,并通过TeamViewer的ID和密码与客户端设备建立连接。而客户端设备可以通过公网访问TeamViewer服务器,从而与服务器设备进行远程协助和桌面共享。 TeamViewer通过隐藏在公网的中继服务器实现通信,将客户端的请求和服务器的响应转发到对应的设备。通过中继服务器的帮助,TeamViewer可以绕过局域网中的路由器和防火墙限制,实现设备间的远程访问。 TeamViewer的内网穿透功能在以下场景中非常实用: 1. 远程技术支持:用户无需懂得网络配置知识,只需提供TeamViewer的ID和密码给技术人员,技术人员可以直接通过公网远程连接到用户的设备进行故障排查和解决。 2. 远程办公:员工可以通过TeamViewer从家或出差地远程访问公司局域网中的设备,进行远程操作和文件共享。 3. 远程演示和培训:通过TeamViewer,用户可以远程进行演示和培训,实现桌面共享和远程操作。 总之,TeamViewer的内网穿透功能使得用户在不同网络环境下可以方便、安全地进行远程协助和桌面共享,极大地提高了效率和便利性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值