作为一个前端,而且作为一个做移动端开发的前端,那意味着你要有三头六臂,跟iOS开发哥哥一起打酱油,跟Android开发哥哥一起修bug...

Android vs Ios

我在webkit内核的chrome中进行开发的页面,拿着iPhone和安卓机来进行测试,传说中它们的浏览器内核也是WebKit,那么问题来了,同样的页面为什么在ios中和安卓中表现不同,出现了各种稀奇古怪的bug...

我尝试找下两者的根本区别:

- iOS

随着2007年6月29日iPhone的上市,WebKit进入iPhone OS平台,经过Apple的定制,成为iPhone OS平台独一无二的排版引擎;

- Android

在旧版本的安卓中:

熟悉Android系统和HTML编程的人可能都听说过Android提供的一个重要类android.webkit.WebView,它继承于View类,这是它同其它很多控件的相似之处。不同之处在于,它能够用来渲染网页。当前,WebView的实现是基于现有的缺省WebKit内核(Android缺省浏览器是基于WebView构建),它不同于chromium所使用的WebKit内核,虽然它们都叫WebKit.

但是,在最新的Android 4.4 Kitkat版本中,原本基于Android WebKit的WebView实现被换成基于Chromium的WebView实现.

- 结论

由此可见,虽然它们都叫WebKit,但是WebKit和WebKit也是不同的:

读了这篇文章:[开发者需要了解的WebKit] 你就会了解到了,同是WebKit它也有不同的Port,它们专注于不同的部分,每个WebKit port中有共享的部分,但是也有很大一部分功能是不会共享的,其中就包括JS引擎。

所以我停止了说:「为什么ios都行了安卓怎么就不行呢?」,而是埋头开始修bug...虽然有时候这些bug不是那么好修...

什么是WebView

作为一个前端儿,你肯定听过WebView这个词儿。我也听过,也好奇过,把我的网页放到手机上看就叫WebView啦?WebView到底是什么呢?

其实WebView是类名或者说它是一个API(在我看来):

- 在Android中,这是个继承于View类的类android.webkit.WebView,用来布局和渲染网页;
- 在iOS中,这个类叫UIWebView,同样是应用程序的UI接口。

我们前端怎么就会对客户端的类名这么熟悉了呢?

如果你是个有见识的前端那么你肯定听过Hybrid App(混合模式移动应用).这是指介于web-app、native-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。
在我看来,这就是前端跟iOS开发和安卓开发一起做的事情嘛。它的实现就离不开WebView了,因为客户端需要渲染我提供的H5页面,那具体怎么实现呢?我也不知道了...去问客户端开发吧...

Touch事件

现在我们知道了手机跟手机不同,WebKit与WebKit的不同,先知道着,我先从头看一下touch事件,再看看他会有什么问题。

Touch事件:

 touchstart:当一个手指放在屏幕上时触发;
touchend:当一个手指从屏幕上移走的时候触发;
touchmove:当一个手指已经在屏幕上并且在屏幕上移动时触发;
touchcancel:如果太多个手指在屏幕上或一个其他动作发生时触发。

Touch事件中事件对象的属性:

 touches: 它包含了每个手指当前touch屏幕的一系列信息;
targetTouches: 像touches一样,但是提供当前手指的touch信息;
changedTouches: 包含每一个手指的touch改变的信息。

怎么理解呢:
  1. 当你放下一个手指的时候,上面三个属性会提供相同的信息;
  2. 当你放下第二个手指的时候,touches对象会包含两条信息,每个手指都有一个;targetTouches只有在第二根手指放在了同第一根手指相同的节点上的时候会包含两条信息(否则的话它只包含第二根手指的信息);changedTouches只会包含跟第二根手指相关的信息.
  3. 如果几乎同是两个手指触碰屏幕,在changedTouches中会有两个手指的信息。
  4. 如果我们在屏幕上移动手指,唯一会改变的对象是changedTouches,它会包含我们移动的一个或两个手指的信息;
  5. 如果抬起一个手指,它的信息会从touches和targetTouches对象中移除,但是在changedTouches会找到它的信息;
  6. 当我们把最后一个手指从屏幕上移走,touches和targetTouches对象会为空了,但是changedTouches将会保留最后这跟手指的信息。

touches对象中包含的每个手指的信息列表中也有下面这些我们在鼠标事件中熟悉的属性:

 identifier - 一个标识符,对于每个touch点(手指)是独一无二的;
target -当前手指touch的dom节点;
clientX/clientY -touch事件发生时相对视口(viewport)的坐标(包含滚动)
screenX/screenY -相对于屏幕的坐标
pageX/pageY -相对于整个文档的坐标

[简单的touch事件实现的拖拽小demo]

Touch事件相关tip

1.检测设备是否为触摸屏设备:
通常我们检测设备是否为触摸屏有两个方法,一个是通过UA还有一个就是特征检测:

var isTouch = !!ua.match(/AppleWebkit.*Mobile.*/) || 'ontouchstart' in document.documentElement;

但是我前两天读了一篇非常好的文章。这样进行判断已经不再准确了。当笔记本为触摸屏的笔记本时,上面的判断方法还是会认为他是触摸设备。

文章中给出了方案:我们可以通过W3C Interaction Media Features给出的方案来判断。

W3C在Media Query Levle 4中增加了pointer类别的特征查询,pointer有三个条件选项:none、fine 和 coarse:

 None,当前设备没有任何除键盘或触控板之外的输入方式
Fine,当前设备使用了鼠标来操作
Coarse, 表示当前设备至少支持触屏操作,也可能同时支持鼠标

通过一些组合,我们就可以进行判断了:

// 既有触屏也有鼠标
matchMedia("(pointer:coarse)").matches && matchMedia("(pointer:fine)").matches
// 只是触屏
matchMedia("(pointer:coarse)").matches && !matchMedia("(pointer:fine)").matches
// 只是鼠标
!matchMedia("(pointer:coarse)").matches && matchMedia("(pointer:fine)").matches
// 没有任何一种
matchMedia("(pointer:none)").matches

所以,比较稳妥的判断触摸屏的方法应该是这样的:

function isTouchScreen(){
if(window.matchMedia){
// W3C way
if(!matchMedia("(pointer:coarse)").matches && matchMedia("(pointer:fine)").matches){
return false
}
// Firefox way: https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Media_queries#-moz-touch-enabled
if(matchMedia("-moz-touch-enabled: 0").matches){
return false
}
}
if(window.ontouchstart != null){
return true
}
}

2.zepto中的tap事件

[zepto touch事件源码]

地球人都知道zepto封装的Touch事件都绑在了document上。于是问题接踵而至。

tap点击穿透发生的条件:
1.两个DOM节点一个在上一个在下;
2.两个节点是父与子的关系;
3.同时绑定了tap事件;
4.如果下层元素是input元素的话,会触发input元素获得焦点(这时阻止冒泡,阻止浏览器的默认行为也有可能不同)。

解决办法:
1.使用github上有一个叫做fastclick的库;

2.监听touchend事件,并在事件中使用preventDefault()阻止冒泡;

3.使用css3的pointer-events=true,pointer-events=none切换来实现;

4.延迟一定的时间来处理事件。

5.合理的改善dom结构,下层是否可以用a标签作为链接处理,同是尝试改善父子层的关系,合理的避免点击穿透;

6.如果还不奏效,那么就用click提代tap吧;

参考资料

[开发者需要了解的WebKit]

[理解Webkit和Chromium:基于Chromium内核的Android WebView]

[理解WebKit和Chromium:Android 4.4 上的Chromium WebView]

[webkit百度百科]

[Chrom for Android 你必须知道的N件事]

[指尖下的JS(1)]

[指尖下的JS (2)]

[指尖下的JS (3)]

[android vs iPhone-touch Events]

[Touching and Gesturing on iPhone,Android and more]

[关于交互模式的媒体查询]

移动端开发概览【webview和touch事件】的更多相关文章

  1. Xamarin开发笔记—WebView双项事件调用

    1.Xamarin调用WebView: 原理:Xamarin.Forms WebView内置方法xx.Eval(..)可以调用到页面里面的js函数. WebView展示的代码如下: var htmlS ...

  2. ios-cocos2d游戏开发基础-CCLayer和Touch事件-开发笔记

    有时候在同一个场景里你需要多个CCLayer.你可以参照以下代码生成这样的场景 +(id) scene { CCScene* scene = [CCScene node]; CCLayer* back ...

  3. 移动端touch事件实现页面弹动--小插件

    动手之前的打盹 说实话真的是好久没有更新博客了,最近一直赶项目,身心疲惫:最关键的是晚上还要回去上一波王者,实在是忙啊! 这周下来,清闲了些许,或许是因为要到国庆的缘故吧,大家都显得无精打采.俗话说的 ...

  4. 移动端开发用touch事件还是click事件

    前端开发现在包含了跨浏览器,跨平台(不同操作系统)和跨设备(不同尺寸的设备)开发. 在移动开发的过程中,到底选取touch事件还是click事件?对了,请不要鄙视click,click在移动端开发用着 ...

  5. Touch事件在移动端web开发中的详解

    一.pc端事件回顾 HTML事件.DOM0事件.DOM2事件 事件对象. 如果上述概念不清楚,请先去了解. 二.移动端事件简介 2.1 pc端事件在移动端的问题 ​ 移动设备主要特点是不配备鼠标,键盘 ...

  6. 移动端 js touch事件

    随着智能手机和平板电脑的普及, 越来越多的人用移动设备浏览网页,我们平时在pc浏览器上用的鼠标事件,比如:click, mouseover等, 已经无法满足移动设备触摸屏的特点,触摸时代的到来,离不开 ...

  7. 移动端touch事件 || 上拉加载更多

    前言: 说多了都是泪,在进行项目开发时,在上拉加载更多实现分页效果的问题上,由于当时开发任务紧急,所以就百度找了各种移动端的上拉下拉 实现加载更多的插件.然后就留下了个坑:上拉加载的时候会由于用户错误 ...

  8. 从零开始学 Web 之 移动Web(五)touch事件的缺陷,移动端常用插件

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  9. 移动端click时间、touch事件、tap事件

    一.click 和 tap 比较 两者都会在点击时触发,但是在手机WEB端,click会有 200~300 ms,所以请用tap代替click作为点击事件. singleTap和doubleTap 分 ...

随机推荐

  1. Hadoop技巧(02):时间同步

    阅读目录 序 时间同步 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 在实际部署 ...

  2. 《Note --- Unreal 4 --- B project --- Second UV issue》

    Second uv 可以通过editor来生成: 这部分内容都是在staticMeshEditor这个文件夹下面的代码里: 关于UI的相应机制,有个文件UICommandList.cpp例如我点击st ...

  3. 项目游戏开发日记 No.0x000005

    14软二杨近星(2014551622) 还有一周就要交项目了, 看着周围的人也都忙碌了起来, 看着大部分人的项目都已经初具容貌, 我们团队里面也搞得人心惶惶, 一来是, 时间不多了, 还有很多事情要做 ...

  4. 最短路径算法-Dijkstra

    Dijkstra是解决单源最短路径的一般方法,属于一种贪婪算法. 所谓单源最短路径是指在一个赋权有向图中,从某一点出发,到另一点的最短路径. 以python代码为例,实现Dijkstra算法 1.数据 ...

  5. 【repost】JavaScript完美运动框架的进阶之旅

    运动框架的实现思路 运动,其实就是在一段时间内改变left.right.width.height.opactiy的值,到达目的地之后停止. 现在按照以下步骤来进行我们的运动框架的封装: 匀速运动. 缓 ...

  6. jpa+springmvc+springdata(一)

    学习尚硅谷笔记: 首先配置application.xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  7. MariaDB学习

    社区:http://www.mariadbpub.com/forum.php

  8. TCP进制转换

    /// <summary> /// 将十六进制字符串转化为字节数组 /// </summary> /// <param name="src">& ...

  9. html你可能还不知道的一些知识点

    一.标签语义化 html标签语义化是让大家直观的认识标签和属性的用途和作用,好处最主要的是对搜索引擎友好. Eg: 1.如果你想在页面中突出"奥巴马"这三个字,让搜索引擎重视它,如 ...

  10. 版本管理工具svn简介

    svn简介 SVN是一种C/S架构的版本管理软件 , 能够帮助我们保存开发过程中各个文件的所有历史版本, 你因此可以方便的找回软件的任何一个历史状态., 日常开发中经常用到. 安装使用 1.  在 u ...