点击穿透原理及解决

一、事件触发顺序

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

  手机上没有鼠标,所以就用触摸事件去实现类似的功能。touch事件包含touchstarttouchmovetouchend,注意手机上并没有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. 触摸结束时 touchend 事件触发时,preventDefault()。看上去好像没有什么问题,但是,很遗憾的是不是所有的浏览器都支持。

  2. 禁止页面缩放 通过设置meta标签,可以禁止页面缩放,部分浏览器不再需要等待 300ms,导致点击穿透。点击事件仍然会触发,但相对较快,所以 click 事件从某种意义上来说可以取代点击事件, 而代价是牺牲少数用户(click 事件触发仍然较慢)的体验。

<meta name="viewport" content="width=device-width, user-scalable=no">
IE 10可以用 CSS 取消点击穿透的延迟:
html {
    -ms-touch-action: manipulation;
    touch-action: manipulation;
}

IE 11+ 可以用 touch-action: manipulation; 属性来阻止元素的双击缩放。

  3. CSS3 的方法 虽然主要讲的是事件,但是有必要介绍一个 CSS3 的属性 —— pointer-events。

pointer-events:  auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit;

pointer-events 属性有很多值,有用的主要是 auto 和 none,其他属性为 SVG 服务。

查看浏览器支持情况 可见移动端开发还是可以用的。

属性含义
auto默认值,鼠标或触屏事件不会穿透当前层
none元素不再是target,监听的元素变成了下层的元素(如果子元素设置成 auto,点击子元素会继续监听事件)

  4.延长消失事件 可以利用jquery的fadeout,设置事件大于300ms。

 

本文参考自:https://segmentfault.com/a/1190000003848737

      http://liudong.me/web/touch-defect.html

转载于:https://www.cnblogs.com/shytong/p/5463673.html

### 回答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的内网穿透功能使得用户在不同网络环境下可以方便、安全地进行远程协助和桌面共享,极大地提高了效率和便利性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值