首先,解释一下我个人对前端无伤迁移的理解,即移动端和PC端使用同一套代码,或者说原本在PC端运行得很完美的代码,只要修改少许,就可以在移动端完美运行。

当然,大部分的公司会专门为移动端设计了一套,同时,有为PC端设计了一套,这是最完美的结果。但某些情况下,PC和移动端同时用一套时,就要想办法解决了。

最近刚做完一个项目,项目组要求前端同时支持PC端和平板电脑,UI不太复杂,所以布局问题不大,但交互就有点麻烦了。

众所周知,移动端的click事件有300ms的延迟,所以首要的问题要解决这个。由于之前阅读过Zepto的源码,所以第一时间把要模拟tap事件的想法去掉了,这个实在是太可怕了,我除了要绑定click事件外,我还要另外绑定个tap事件,除此之外,我还要另外绑定个touchstart||touchmove||touchend事件,把click事件禁用掉,或者是判断是否为移动设备,再根据这个来绑定tap或click事件,修改的成本实在太大了。想到某个前端技术群里面有人推荐了fastclick,打开源码看了一下,狂喜。我根本无须修改任何代码,只需要引入然后再添加FastCLick.attach就行了,至此,click事件在移动端300ms的延迟完美解决。

注:其实fastclick的实现原理跟zepto的tap模拟差不多,都是基于touchstart,touchmove还有touchend实现的,但fastclick最终会手动出发click事件,即dispathEvent,而zepto则是触发tap事件,同时fastclick会在touchstart时调用e.preventDefault(),以防止click事件的二次触发。

紧接着,就要面临第二个问题了。在PC端,有鼠标事件,例如,mousedown,mousemove,mouseup,相对应地,移动端有touchstart,touchmove和touchend事件,如何将这两个映射起来呢?如何做到在PC端就绑定mouse事件,在移动端就绑定touch事件呢?由于这个页面是基于jQuery搭建起来的,所以,必须研究一下jQuery的实现。果不其然,我在jQuery.event.add看到了如下代码:

即使不看源码,从注释中我们也可以得知,当special[type]存在时,如果selector存在,即取special.delegateType,否则取special.bindType;若special[type]不存在,取原type,根据这个,我们可以做一些映射了。

var ua = navigator.userAgent;
var isMobileDevice = /Windows Phone|Android|iP(?:ad|hone|od)|BB10/.test(ua); if (isMobileDevice) {
special = jQuery.event.special;
special.mousedown = {'delegateType': 'touchstart', 'bindType': 'touchstart'};
special.mouseup = {'delegateType': 'touchend', 'bindType': 'touchend'};
special.mousemove = {'delegateType': 'touchmove', 'bindType': 'touchmove'};
}

这样的话,当代码是如下时:

$(document).on('mousedown', function() {
console.log('a');
});

其在PC端,绑定的是mousedown事件,在移动端,绑定的是toushstart事件了。

最后,还有一个非常关键的问题,就是坐标的获取。当你在PC端的时候,你可以使用e.pageX来获取,但移动端,你却要使用e.originalEvent.changedTouches[0].pageX来获取,这个必须得解决。

从上面的代码可以得知,事件在jQuery.event.dispath中触发,而在这个方法中

jQuery对调用jQuery.event.fix()来对原生的event做一些兼容性的修改,那么我们可以在jQuery.event.dispath做一些文章。

  var ua = navigator.userAgent, isMobileDevice,
oldDispath, special; oldDispath = jQuery.event.dispatch;
isMobileDevice = /Windows Phone|Android|iP(?:ad|hone|od)|BB10/.test(ua); if (isMobileDevice) {
special = jQuery.event.special;
special.mousedown = {'delegateType': 'touchstart', 'bindType': 'touchstart'};
special.mouseup = {'delegateType': 'touchend', 'bindType': 'touchend'};
special.mousemove = {'delegateType': 'touchmove', 'bindType': 'touchmove'}; jQuery.event.dispatch = function(event) {
var args = Array.prototype.slice.call(arguments, 1), touch; event = jQuery.event.fix(event); //修复touch事件
if (event.originalEvent && event.originalEvent.changedTouches) {
touch = event.originalEvent.changedTouches[0];
event.pageX = touch.pageX;
event.pageY = touch.pageY;
} args.unshift(event); oldDispath.apply(this, args);
} }

至此,你无须再修改其他代码,只需要添加这些补丁,就可以做到无伤迁移了。

基于jQuery的前端如何做到无伤迁移的更多相关文章

  1. 基于JQuery的前端form表单操作

    Jquery的前端表单操作:     jquery提供了良好的方法封装,在一些基本的操作的时候,能节省很多的麻烦,其中,在具体使用时,form表单的数据提交是最频繁也最常见的前后数据交换方式,所以在前 ...

  2. 前端关于 superSlide.js 使用,一款基于jquery的前端控件

    1引用jQuery.js 和 jquery.SuperSlide.js 2 编写HTML ** 以下是默认的HTMl结构,分别是 ".hd" 里面包含ul, ".bd&q ...

  3. 前端基于jquery的UI框架

    正在做的一个项目选择jquery作为前端js核心库.然后就想选一个基于jquery的ui库,然后悲催的事情发生了. 至于为什么使用jquery,一是因为不想为授权费用,而又不想引起可能法律纠纷:另一方 ...

  4. 10款基于jquery的web前端特效及源码下载

    1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...

  5. 8款基于Jquery的WEB前端动画特效

    1.超炫酷的30个jQuery按钮悬停动画 按钮插件是最常见的jQuery插件之一,因为它用途广泛,而且配置起来最为方便.今天我们要分享的是30个超炫酷的jQuery悬停按钮动画,当我们将鼠标滑过按钮 ...

  6. 10款基于jquery的web前端动画特效

    1.jQuery横向手风琴图片切换动画 之前我们为大家分享过很多款基于jQuery和CSS3的手风琴菜单和手风琴焦点图插件,比如CSS3响应式垂直手风琴菜单和jQuery横向手风琴图片展示插件.今天要 ...

  7. 基于jquery的ui选择之路

    选定: 主框架:jqueryUi tree:ztree grid:jqGrid layout:jquery.layout 原由: 还有其他demo,ajax实现等参看连接: 正在做的一个项目选择jqu ...

  8. 构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

    通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 ja ...

  9. 基于jQuery的Validate表单验证

    表单验证可以说在前端开发工作中是无处不在的~ 有数据,有登录,有表单, 都需要前端验证~~  而我工作中用到最多的就是基于基于jQuery的Validate表单验证~  就向下面这样~ 因为今天有个朋 ...

随机推荐

  1. oracle 数据库学习

    1.更改数据库用户名密码: alter user '用户名' identified by ’password'. 2.查看数据库有哪些用户:sqlplus system/password ;selec ...

  2. 封装一些数据库SQLCipher的方法(增、删、改、查)

    上一篇随笔只是简单的说了一下使用SQLCipher框架,介绍的比较笼统,可能看一遍之后更加蒙圈了,为了更好的使用这个数据库,整理了我在公司项目的需要用的方法,包括创建表,插入数据,更新数据,搜索查询数 ...

  3. ASP.NET和PHP全面对比

    谁是速度之王? 刚刚在9月编程语言排行榜上取得历史性突破的PHP在Web开发领域最到的对手可能就是基于微软.NET技术的ASP.NET.近日,微软的 Joe Stagner在博客上发表了一系列文章比较 ...

  4. OpenGL教程之碰撞检测与模型运动

    下面我们要讨论的是如何快速有效的检测物体的碰撞和合乎物理法则的物体运动,先看一下我们要学的: 1)碰撞检测 ·移动的范围 — 平面 ·移动的范围 — 圆柱 ·移动的范围 — 运动的物体 2)符合物理规 ...

  5. 利用ajax做的柱状图,线性统计图,饼状图

    柱状图,两个不同类型的数据 以下是html页面代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  6. codeforces 519A. A and B and Chess,

    A. A and B and Chess time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Nginx 变量漫谈(二)

    关于 Nginx 变量的另一个常见误区是认为变量容器的生命期,是与 location 配置块绑定的.其实不然.我们来看一个涉及“内部跳转”的例子:     server {        listen ...

  8. 几种MEMS陀螺仪(gyroscope)的设计和性能比较

    现在市场上的MEMS陀螺仪主要有SYSTRON.BOSCH和INVENSENSE设计和生产.前两者设计的陀螺仪属高端产品,主要用于汽车.后者的属低端产品,主要用于消费类电子,象任天堂的Wii.ADI2 ...

  9. (四)boost库之正则表达式regex

    (四)boost库之正则表达式regex 正则表达式可以为我们带来极大的方便,有了它,再也不用为此烦恼 头文件: #include <boost/regex.hpp> 1.完全匹配 std ...

  10. C语言的本质(19)——预处理之一:宏定义

    我们在写代码时已多次使用过以"#"号开头的预处理命令.如包含命令#include,宏定义命令#define等.在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为 ...