zoukankan      html  css  js  c++  java
  • 移动端事件 touch

    移动端事件 touch

    touch事件有包括以下三个:

    • touchstart 手指在元素按下
    • touchmove 手指在元素按下后,手指在屏幕中移动
    • touchend 手指在元素按下后,手指在屏幕中抬起

    注意:touch绑定方式

    1. touch 事件在模拟器下不支持用on方式绑定事件;
    2. 在真机上on方式和事件侦听都没有问题
    3. 推荐都使用addEventListener()的方式添加事件

    touch事件和mouse 事件的区别

    可以对比记忆两者:

    • touchstart ---> mousedown
    • touchmove ---> mousemove
    • touchend ---> mouseup

    touch事件和mouse事件的区别

    • touchstart 手指在元素上按下
    • touchmove 手指在元素上按下之后,在整个屏幕中移动
    • touchend 手指在元素上按下,然后手指从屏幕上抬起

    其实,在touchmove和touchend依赖touchstart事件,就是 touchmove要向触发就必须先触发touchstart事件,touchend也就先触发了touchstart事件

    其实,在移动端上mouse事件也是可以被监听到的,但是,在移动端上,mouse事件有300ms的延迟,也就是说,你点击了某一个元素一下(假设它已经绑定了mouse类的事件),300ms后才会触发这个元素的mouse事件.

    在某一个像素上有两个以上的元素时( 通过定位来做到),当上面的元素添加了touch事件,下面的元素有click事件的时候,由于click有300ms的延迟,如果300ms之后下面的元素获得了点击,那么就会触发下面元素的click事件

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta name="viewport" content="width=device-width,user-scalable=no" />
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
    #box {
    	position: absolute;
    	left: 0;
    	top: 0;
    	 200px;
    	height: 200px;
    	background: rgba(255, 0, 0, .5);
    }	
    </style>
    </head>
    <body>
    <a href="http://www.baidu.com">百度</a>
    <div id="box"></div>
    <script type="text/javascript">
    
    box.addEventListener('touchstart', function(e) {
    	box.style.display = "none";
    });	
    //在box和a标签重合的地方点击,浏览器会跳转到百度
    </script>	
    </body>
    </html>
    
    

    事件点透

    1. 当我们在元素上按下,首先立即执行元素的touch事件
    2. 另外,浏览器会记录我们按下时的坐标,300ms之后,在该坐标上重新查找元素,如果元素有mouse事件,就把元素的mouse执行了.

    a 标签会自动跳转就涉及到了浏览器的默认事件,在移动端,浏览器的默认事件需要记住的有:

    a标签 内置了click事件,在移动端有300ms延迟

    解决事件点透: 阻止浏览器默认行为

    document.addEventListener('touchstart', function(e) {
    	e.preventDefault();
    });
    
    • 阻止默认行为的好处:
    1. 阻止图片被选中,导致拖拽卡顿
    2. 阻止事件点透
    3. 解决ios10之后,ios下的safari不在支持viewport的禁止缩放
    4. 解决ios10之后, body的overflow无效的问题
    • 阻止默认行为的坏处:
    1. 滚动条不能滑动
    2. 阻止a标签跳转
    3. 阻止所有的鼠标事件(获取页面焦点,失去焦点)
    4. 阻止所有的系统菜单 (右键上下文菜单)
    5. 阻止所有的输入框输入
    6. 在移动端阻止鼠标事件执行
    7. 阻止页面被缩放
    8. 阻止页面的回弹效果
    9. 阻止a标签或者Input标签获得焦点
    10. 阻止系统默认滚动条

    什么时候阻止默认行为呢?

    当页面有滑屏或者拖拽时,就要阻止浏览器的默认行为

    在某个元素上不想浏览器清除默认样式呢?

    可以在当前元素的事件中,阻止冒泡

    e.stopPropagation();
    
    

    这样document就不会获得该事件,也就不会执行e.preventDefault()了

    小结:

    如果页面上有需要大面积滑屏的地方,最好还是清除默认行为,但是当前的这个页面上的滚动条,就需要我们自己去实现,另外页面上的a标签需要我们自己加js跳转,如果页面上有输入框,或者长按出现系统菜单的区域,建议写在另外一个页面中.

  • 相关阅读:
    达到XML简单的动态配置
    初步swift语言学习笔记9(OC与Swift杂)
    【COCOS2DX-对28游戏开发】 Cocos2d-x-3c 道路设计 CocosBase CocosNet CocosWidget
    无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    IIS6.0服务器搭建网站无法访问解决方法
    IIS7授权错误:“无法验证对路径的访问”的解决方法
    如何在IIS6,7中部署ASP.NET网站
    IIS的安装与配置
    VS2010如何生成release文件
    发布网站
  • 原文地址:https://www.cnblogs.com/learning-/p/7409972.html
Copyright © 2011-2022 走看看