10行代码搞定移动web端自定义tap事件

发发牢骚

移动web端里摸爬滚打这么久踩了不少坑,有一定移动web端经验的同学一定被click困扰过。我也不列外。一路走来被虐的不行,fastclick、touchend、iscroll什么的都用过,各有优劣,都不能一步到位。最后实在是被逼无奈,翻阅了不少资料,自定义了一个tap。

效果预览

废话不多说先上效果 移动端预览

一探真假

真的只有10行

插件是基于jQuery的,上代码。

//自定义tap
$(document).on("touchstart", function(e) {
    if(!$(e.target).hasClass("disable")) $(e.target).data("isMoved", 0);
});
$(document).on("touchmove", function(e) {
    if(!$(e.target).hasClass("disable")) $(e.target).data("isMoved", 1);
});
$(document).on("touchend", function(e) {
    if(!$(e.target).hasClass("disable") && $(e.target).data("isMoved") == 0) $(e.target).trigger("tap");
});

既然说是10行代码搞定,那么就一定是10行。

实现原理

基于touchstart、touchmove、touchend这三个事件,通过事件委托的方式来实现tap事件。

e.target是事件源的触发节点,$(e.target)是该节点的jQuery封装对象。

第一步:监听touchstart事件,事件触发后通过jQuery的data方法设置该对象的isMoved状态为0。

第二步:监听touchmove事件,事件触发后通过jQuery的data方法设置该对象的isMoved状态为1。

第三步:监听touchend事件,事件触发后判断该对象是否touchend过,没有则触发tap事件。

使用方法

把上面的10行代码放在jQuery或者zepto的最后面,用法和一般事件一样

其他

目前还没有做PC端的兼容,移动web端的机型测试做的不够多,后续会慢慢补上。如果在使用中遇到了什么问题可以留言。

    <!doctype html>
<html lang="zh-cn">
<head>
    <meta name="viewport" content="initial-scale=1, user-scalable=0, minimal-ui" charset="UTF-8">
    <title>tap</title>
    <script id="jquery_180" type="text/javascript" class="library" src="/js/sandbox/jquery/jquery-1.8.0.min.js"></script>
</head>
<body>

<div class="layer1">
    <div class="layer2">
        <div class="layer3">
        </div>
    </div>
</div>

<div class="window">

</div>
</body>
</html>
        <style>.layer1 {
        width: 100%;
        height: 200px;
        background-color: #888;
    }
    .layer2 {
        width: 67%;
        height: 67%;
        background-color: #aaa;
    }
    .layer3 {
        width: 67%;
        height: 67%;
        background-color: #ccc;
    }
    .window {
        position: fixed;
        top: 50px;
        left: 10%;
        width: 80%;
        height: 200px;
        background-color: #099;
    }</style>
                <script>$(function () {
        //自定义tap
        $(document).on("touchstart", function(e) {
            var $target = $(e.target);
            if(!$target.hasClass("disable")) $target.data("isMoved", 0);
        });
        $(document).on("touchmove", function(e) {
            var $target = $(e.target);
            if(!$target.hasClass("disable")) $target.data("isMoved", 1);
        });
        $(document).on("touchend", function(e) {
            var $target = $(e.target);
            if(!$target.hasClass("disable") && $target.data("isMoved") == 0) $target.trigger("tap");
        });

        $(".layer1").on("tap", function(e) {
            alert("layer1");
        });

        $(".layer2").on("tap", function(e) {
            alert("layer2");
            e.stopPropagation();
        });

        $(".layer3").on("tap", function(e) {
            alert("layer3");
            e.stopPropagation();
        });

        $(".window").on("tap", function(e) {
            alert("window");
        });

    });</script>

<!-- Generated by RunJS (Thu Sep 01 11:54:18 CST 2016) 0ms -->
时间: 2024-12-25 11:14:51

10行代码搞定移动web端自定义tap事件的相关文章

如何用Python统计《论语》中每个字的出现次数?10行代码搞定--用计算机学国学

编者按: 上学时听过山师王志民先生一场讲座,说每个人不论干什么,都应该学习国学(原谅我学了计算机专业)!王先生讲得很是吸引我这个工科男,可能比我的后来的那些同学听课还要认真些,当然一方面是兴趣.一方面是跨了学科听课,内容引人入胜,主要还是我懂得太少了,哈!我记得当时讲座的主题是有关孔子与齐鲁大地的关系,也正是那场讲座让我下决心跨学院选修了<中国古代思想文化史研究>,才让我对于诸子百家思想有了更深的认识,教授们轮番上阵,让我们学习到我们中华民族先贤智慧.也认识了历史学和中国哲学专业的同学,其中还

史上最牛逼的javascript俄罗斯方块,63行代码搞定啊

<!doctype html><html><head></head><body> <div id="box" style="width:252px;font:25px/25px 宋体;background:#000;color:#9f9;border:#999 20px ridge;text-shadow:2px 3px 1px #0f0;"></div> <script>

Tensorflow快餐教程(1) - 30行代码搞定手写识别

去年买了几本讲tensorflow的书,结果今年看的时候发现有些样例代码所用的API已经过时了.看来自己维护一个保持更新的Tensorflow的教程还是有意义的.这是写这一系列的初心. 快餐教程系列希望能够尽可能降低门槛,少讲,讲透. 为了让大家在一开始就看到一个美好的场景,而不是停留在漫长的基础知识积累上,参考网上的一些教程,我们直接一开始就直接展示用tensorflow实现MNIST手写识别的例子.然后基础知识我们再慢慢讲. Tensorflow安装速成教程 由于Python是跨平台的语言,

python入门机器学习,3行代码搞定线性回归

本文着重是重新梳理一下线性回归的概念,至于几行代码实现,那个不重要,概念明确了,代码自然水到渠成. "机器学习"对于普通大众来说可能会比较陌生,但是"人工智能"这个词简直是太火了,即便是风云变化的股市中,只要是与人工智能.大数据.云计算相关的概念股票都会有很好的表现.机器学习是实现人工智能的基础,今天早上看了美国著名演员威尔斯密斯和世界最顶级的机器人进行对话的视频,视频中的机器人不论从语言还是表情都表达的非常到位,深感人工智能真的离我们越来越近了,所以学习人工智能前

GJM : AlloyTouch实战--60行代码搞定QQ看点资料卡

原文链接:https://github.com/AlloyTeam/AlloyTouch/wiki/kandian 先验货 访问DEMO你也可以点击这里 源代码可以点击这里 如你体验所见,流程的滚动的同时还能支持头部的动画?不断地加载新数据还能做到流畅的滑动!怎么做得的?使用AlloyTouch CSS 0.2.0及以上版本便可! 头部动画 加载更多 实现代码 var infoList = document.getElementById("infoList"), mockHTML =

几行代码搞定java生成解析二维码功能

最近公司要求扫描二维码和生成二维码的功能.而群里部分网友也提到了.我这里就写了一个demo,和大家分享.代码很简介,希望大家能够喜欢. 网友表示在网上搜索了很多,发现不是代码不全,就是jar不匹配. 我这里共享了一个zxing的2.2版本的例子,也提供了下载地址.实现代码如下: package com.herman.test; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundExcep

Python 5行代码 搞定加减法计算

五行代码实现加减法的计算 数据类型 首先简单普及一下代码中涉及到的两种数据类型 整型:可以理解为整数类型 字符串:带引号的都是字符串类型(这么说不严谨,为了方便理解) 上代码: num1 = input("请输入第一个数字") num2 = input("请输入第二个数字") new_num1 = int(num1) new_num2 = int(num2) print(new_num1 + new_num2) 1.前两条代码的意思就是每次输入一个数,input的功

七行代码搞定 任意数据库中的数据迁移

var et = new EntityTransform(); et.SrcConn = "YuanKu"; et.DesConn = "mubiaoku"; et.AllowInsertIdentity = true; foreach (var item in EntityFactory.LoadEntities(et.SrcConn, true)) { var eop = EntityFactory.CreateOperate(item); et.Transfo

JavaScript的8行代码搞定js文件引入问题

单页面的操作,免不了会有各种jsp的嵌套问题,一个操作页面里面可能涉及到几十甚至上百个jsp页面. 平常我们对用到的js文件的引入,都会放到index的header里面.如图: 但是,让我们思考三个问题: 1.当业务需要,用到iframe的时候,那么iframe页面将不能再直接调用index引入的js文件 2.假如我这个项目有100个jsp页面,有一个js文件只有其中一个jsp要使用,我将这个js放到index的header区,每次一加载项目都会加载它,是不是延长了项目加载时间. 3.针对问题二