`
mutongwu
  • 浏览: 447477 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

移动端的“点透”问题

阅读更多

移动端的“点透”问题,这篇博文有较好的说明:
http://www.cnblogs.com/zldream1106/p/3670988.html




移动端的事件触发顺序: touchstart -> touchend  -> click

通常的情况是:
1. A区域是一个浮层,绑定touchstart/touchend事件,事件函数将A区域隐藏。
2. 点击发生的位置在B区域上方,而B区域恰好能够捕捉click事件(例如原生的a标签),从而被触发。
3. 这种 在A区域点击,却“透过”A区域,导致B区域也触发 click 事件的情况,我们称之为“点透”。

所以,避免“点透”的处理方法是:
1. 在A区域的touchstart/touchend事件,调用 e.preventDefault()方法,阻止click事件的继续触发。

2.A区域使用 click事件,而不是 touchstart/touchend事件,从而click事件在这个时候已经被生成处理。

3. 使用fastclick(https://github.com/ftlabs/fastclick/blob/master/lib/fastclick.js)来统一处理。
其实 fastclick的原理同1。它主要是在 body上绑定监听事件,然后做出判断,是否需要调用 preventDefault()来处理。

=================================================

以下则是我的实验测试。


<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0" />
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<meta content="telephone=no" name="format-detection" />
  <title>移动端点透问题</title>
  <script type="text/javascript" src="js/zepto.min.js"></script>
  <script type="text/javascript" src="js/fastclick.js"></script>
  <style>
    *{
      margin: 0px;
      padding:0px;
    }
    #div3,#div1{ /*灰色半透明遮盖层A*/
      width: 300px;
      height: 300px;
      background-color: rgba(0,0,0,0.25);		
    }
    #div2{ /*黄色内容层B*/
      width: 240px;
      height: 240px;
      background-color: yellow;
      position: absolute;
      left: 30px;
      top: 30px;
      z-index: -1;
    }
    #div3{
    	background-color: rgba(255,0,0,0.25);		
    }
    #console{ /*绿色状态输出框*/
      border: 1px solid green;
      position: absolute;
      top: 300px;
      width: 100%;
    }
  </style>
</head>
<body>
  <div id="div1" ></div>
  <div id="div2" style="display:none">
     <a href="javascript:alert(99)">www.baidu.com</a>
  </div>
  <div id="console"></div>
  <script>
  document.addEventListener('DOMContentLoaded', function() {
      //fastclick的解决方式:
      // FastClick.attach(document.body);
  }, false);
  
  var div1 = document.getElementById("div1");
  var div2 = document.getElementById('div2');
  var con = document.getElementById('console');
  
  function createDiv3(){
	  var div3 = document.getElementById("div3");
	  if(!div3){
		  $(document.body).append($('<div id="div3"></div>'));  
	  }
	  
  }
  function handle(e){
	var tar = e.target,eve = e.type;
    var ele = document.createElement("p");
    ele.innerHTML = "target:"+ tar.id + " event:" + eve ;
    con.appendChild(ele);
    if(tar.id === "div1"){ 
      div1.style.display = "none";
    }
    div2.style.display = "block";
    
   // createDiv3(); 搞一个层再次遮盖DIV2,也可以“阻止”问题的发生。
   
   //阻止生成 click事件。 
   //e.preventDefault();
  }
  div1.addEventListener("touchend",handle);
  //div1.addEventListener("touchstart",handle);

  //这是事件不会被
  div2.addEventListener("touchend",handle);

  //click事件才是【点透】的原因
  div2.addEventListener("click",handle);

  //貌似最新的 zeptojs V1.6也没有处理该问题哦。 
  //$(document.body).on('tap',handle);
  </script>
  </body>
</html>


fastclick的核心代码截图:





  • 大小: 83 KB
  • 大小: 48.6 KB
分享到:
评论

相关推荐

    解决移动端滚动穿透问题

    在移动Web开发中,"移动端滚动穿透问题"是一个常见的用户体验问题。当用户在页面上触发一个弹出层(如模态对话框、下拉菜单或加载遮罩层)时,通常希望页面主体部分在此期间不可滚动,以防止意外的滚动行为影响交互...

    移动端开发常见问题总结

    ### 移动端开发常见问题总结 随着移动互联网的飞速发展,移动端开发变得尤为重要。在实际项目中,开发者会遇到各种各样的技术难题。本文将根据提供的内容,深入探讨移动端开发过程中常见的问题及其解决方案。 ####...

    移动端兼容问题

    在移动端Web开发中,兼容性问题是一个至关重要的挑战。开发者需要确保网页在各种不同设备、操作系统和浏览器上都能正常工作并提供一致的用户体验。本文主要围绕移动端常见的Web兼容性问题展开,包括元标签的使用、...

    移动端常用样式以及特效

    本篇文章将深入探讨这些关键知识点,帮助开发者构建美观且高效的移动端界面。 一、布局 1. Flexbox(弹性盒布局):移动端最常用的布局方式,能轻松实现响应式设计,支持动态调整元素顺序和大小。 2. Grid(网格...

    vue实现移动端input上传视频、音频

    在本文中,我们将探讨如何在移动端使用Vue.js框架实现视频和音频文件的上传功能。文章首先介绍了基本的HTML结构,通过隐藏的input元素配合label标签实现用户上传文件的操作。接着详细解析了JavaScript代码部分,包括...

    HTML实现移动端固定悬浮半透明搜索框

    从提供的信息来看,为了实现这样的效果,我们需要关注以下几个关键点: 1. HTML结构设置 在HTML中需要定义一个`header`标签作为搜索框的容器,并在此容器内放置`form`元素,包含`input`元素用于用户输入搜索内容。...

    移动端图片放大功能

    在移动端开发中,图片放大功能是一项常见的需求,尤其在用户需要查看细节时。本文将详细介绍如何利用JavaScript、CSS和HTML来实现这一功能,同时结合ASP.NET的后台支持,为移动端应用提供更好的用户体验。 首先,...

    移动端海水实现

    在移动端游戏开发中,"海水实现"通常是指在移动设备上创建逼真的海洋表面效果的技术。这涉及到图形学、物理模拟以及性能优化等多个方面。以下是对这个主题的详细阐述: 1. **图形学原理**:在3D环境中,海水的表现...

    高职院校Illustrator课程信息化教学的探索与实践——以移动端APP常用元素——透明图标制作为例.pdf

    高职院校Illustrator课程信息化教学的探索与实践——以移动端APP常用元素——透明图标制作为例.pdf

    手机移动端网页模拟真书翻页

    在移动互联网飞速发展的今天,手机移动端网页设计已经成为不可或缺的一部分,尤其在阅读领域,电子书逐渐取代了传统纸质书籍,而“真书翻页”效果则为这种转变增添了更多的趣味性和交互性。本文将深入探讨如何在手机...

    JS移动端点击弹出遮罩层

    下面将详细介绍如何使用JavaScript来实现这一功能,以及在移动端适配方面需要注意的关键点。 首先,我们来构建HTML结构。在这个例子中,我们需要一个按钮触发遮罩层的显示,并且需要一个遮罩层元素本身: ```html ...

    jQuery手机移动端弹出确认对话框插件

    本文将深入探讨使用jQuery库在手机移动端创建弹出确认对话框的插件技术。 首先,jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理和动画效果。在手机移动端,由于屏幕尺寸较小,用户交互需要更加...

    七彩绚丽背景透明css3模板_七彩 透明 css3 html layout 简单_html网站模板_网页源码移动端前端.rar

    从标题和描述中我们可以提取出几个关键知识点,它们是CSS3、透明背景、HTML布局以及移动端优化。接下来,我们将详细探讨这些主题。 1. CSS3:CSS(层叠样式表)是用于控制网页外观和样式的语言,而CSS3是其最新的...

    透视C#核心技术:系统架构及移动端开发源码

    《透视C#核心技术:系统架构及移动端开发源码》是一份深入探讨C#在系统架构和移动端应用开发中的核心知识的资源包。这份资源包含了书中的实际代码示例,为学习者提供了直观的理解和实践平台。 C#是一种由微软开发的...

    移动端图片上传,带php后台处理代码,完完整整,拿来既用

    总结起来,这个项目涵盖了以下知识点: 1. HTML5 File API和FormData对象的使用 2. AJAX异步上传 3. PHP处理文件上传,包括文件验证和移动 4. JSON格式的前后端数据交换 5. 前后端交互逻辑,如图片的显示和删除 这...

    Bootstrap响应式手机移动端图片切换特效.zip

    它使得编写JavaScript代码更加简洁和高效,减少了跨浏览器兼容性问题的困扰。在本例中,jQuery被用来实现图片轮播的动态效果,如图片的平滑过渡、手势识别等。 这款图片切换特效的核心功能包括: 1. 手指滑动切换...

    透视c#核心技术:系统架构及移动端开发 视频教学文件

    《透视C#核心技术:系统架构及移动端开发》视频教学文件涵盖了C#编程语言的核心概念、系统架构设计以及移动应用开发的全面知识...同时,通过实践项目和案例分析,提升解决实际问题的能力,从而在IT行业中获得竞争优势。

    透明导航条网上花店商城模板_透明 导航 花店 商城 企业 花 灰色 二栏 网店_html网站模板_网页源码移动端前端_.rar

    在这个案例中,模板尤其强调了移动端前端,意味着它是针对手机和平板电脑等移动设备优化的,可能包含了响应式设计,确保在不同屏幕尺寸下都能正常显示。 再者,我们不能忽视"js"和"css"这两个标签。JavaScript是一...

    移动端遮罩层js

    "移动端遮罩层js"是一个专门针对移动设备设计的JavaScript解决方案,其主要目标是解决用户在等待数据加载或进行后台操作时,可能频繁点击导致的重复提交问题。为了提高用户体验,开发者通常会使用加载圈圈和遮罩层来...

    lighterbox相册照片浏览插件,支持移动端浏览器,点击图片可以放大观看。兼容主流浏览器.rar

    它使得在网页上展示照片变得更为优雅,尤其适用于移动端浏览器。Lighterbox的主要功能是让用户在点击图片后,能够在一个弹出的轻量级窗口中查看图片,而不会离开当前页面,从而提供了更加沉浸式的浏览体验。 ...

Global site tag (gtag.js) - Google Analytics