安卓webview下使用zepto的swipe遇到的坑
众所周知,安卓手机上touch事件一直有各种各样莫名其妙的问题。
比如,我想要用swipeLeft/swipeRight监听向左向右滑动事件,如果只是单纯为元素增加swipeLeft/swipeRight事件的话在webview下是不生效的。google了下,还是有解决方法的。如果这个页面不需要上下滑动的话,完全可以用
$('body').bind("touchmove", function(e) { e.PReventDefault();});
解决。即取消body的touchmove默认行为即可。(为什么取消body的touchmove默认行为就能让swipe生效呢?) 但这种做法太绝对太暴力了,如果页面需要上下滑动的话,那就会出问题。这里有两种情况,第一种是页面内的某个元素需要上下滑动,另一种是页面需要上下滑动。第一种情况,只是页面内某个元素需要上下滑动的话,可为这个元素监听touchmove事件,阻止冒泡。比如:
$(id).bind("touchmove", function(e) { e.stopPropagation()});
这样这个元素就可以实现上下滑动了。 那如果是整个页面需要上下滑动呢?这就比较棘手了。 我一开始的方案是这样的。不监听swipe事件,全部用touch(touchStart/touchmove/touchEnd)实现,在touchStart事件里获取点击时的坐标位置(startX, startY),在touchEnd事件里获取手指离开时的坐标位置(endX,endY)。得到手指滑动的距离(distanceX,distanceY); distanceX = startX - endX; distanceY = startY - endY; absoluteX = Math.abs(distanceX);//横向距离绝对值 absoluteY = Math.abs(distanceY);//纵向距离绝对值 比较absoluteX和absoluteY的大小, absoluteY大则为上下滑动,不采取任何处理, absoluteX大则为左右滑动,此时再比较startX - endX为正还是为负,正的话则则向左滑动,负的话为向右滑动。大概代码为这样
var startX, startY;var endX, endY;var distanceX, distanceY;$('body').bind('touchstart', function(event) { startX = event.targetTouches[0].clientX; startY = event.targetTouches[0].clientY;}).bind('touchend', function(event) { endX = event.changedTouches[0].clientX; endY = event.changedTouches[0].clientY; distanceX = Math.abs(startX - endX); distanceY = Math.abs(startY - endY); if (distanceX > distanceY) { startX - endX > 0 ? swipeLeft() : swipeRight(); }});
本以为这样应该没什么问题了,结果··· 在安卓webview下我模拟的swipe手势并不会触发touchend事件,我想这应该也是zepto自己封装的swipe事件失效的原因。 比如,我只点击了一下屏幕,其实就相当于执行了touchStart,紧接着执行了touchEnd。但如果我的手指在页面上进行了滑动操作,他就相当于执行了touchStart,紧接着执行了touchmove,然而手指离开时并不会执行touchEnd事件。那什么情况下它才会执行touchEnd事件呢? 答案是——把touchmove事件的默认行为取消的时候。(为什么执行了touchmove就不会执行touchend了呢?) 所以,还要对body的touchmove事件进行处理。思路是在用户刚开始滑动的时候,判断用户是想上下滑动还是左右滑动,上下滑动的话不做处理,左右滑动的话,对touchmove事件进行preventDefault()操作。如何判断用户刚开始滑动时是想左右还是想上下呢,可通过用户一开始滑动时X轴和Y轴方向的绝对距离进行判断。具体代码如下:
var count = 0; //判断用户是否第一次进行touchmove操作var startX, startY;var endX, endY;var distanceX, distanceY;$('body').bind('touchstart', function(event) { count = 0; //每次开始点击时清零 startX = event.targetTouches[0].clientX; startY = event.targetTouches[0].clientY;}).bind('touchmove', function(event) { if (count === 0) { //如果是第一次滑动 endX = event.changedTouches[0].clientX; endY = event.changedTouches[0].clientY; distanceX = Math.abs(startX - endX); distanceY = Math.abs(startY - endY); if (distanceX > distanceY) { //如果X绝对距离大于Y绝对距离 event.preventDefault(); } } count++; }).bind('touchend', function(event) { endX = event.changedTouches[0].clientX; endY = event.changedTouches[0].clientY; distanceX = Math.abs(startX - endX); distanceY = Math.abs(startY - endY); if (distanceX > distanceY) { startX - endX > 0 ? swipeLeft() : swipeRight(); }});
问题完美解决。现在页面既可上下滑动也可左右滑动。补充: 之后google时无意间发现一篇文章(http://www.cnblogs.com/zldream1106/p/mobile_scroll_end.html)里面有说到swipe的问题IOS当"swipe"时,依次产生如下事件:touchstart -> touchmove * 多次 -> touchend -> scrollAndroid当"swipe"时,swipe虽然不会触发touchend事件,但是会在scroll事件之前触发一次touchcancel事件,即:touchstart -> touchmove ->touchcancel->scroll*多次Android端的话亲测确实如此,touchmove触发一次,touchcancel触发一次。IOS端的目前暂时还没自测过。所以,刚那个问题在安卓端的话方法二是可行的,只要把touchend改为touchcancel,但为了兼容起见,还是用方法三比较稳妥。但我还没明白为什么在安卓webview下swipe没有触发touchend事件,这个有待研究。
安卓webview下使用zepto的swipe失效的更多相关文章
-
安卓WebView中接口隐患与手机挂马利用(远程命令执行)
安卓应用存在安全漏洞,浏览网站打开链接即可中招.目前有白帽子提交漏洞表明目前安卓平台上的应用普遍存在一个安全漏洞,用户打开一个链接就可导致远程安装恶意应用甚至完全控制用户手机,目前微信,手机QQ,QV ...
-
zepto.js swipe实现触屏tab菜单
今天我们来说下zepto.js,有兴趣的朋友可以先进这个网站“http://zeptojs.com/” ,这个可以说是手机里的jquery,但是它取消了hover,加上了swipe及tap这两个触屏功 ...
-
cordova/webapp/html5 app 用corsswalk替换内核,优化安卓webview
Crosswalk与WebView的不同 为什么要用corsswalk?由于cordova应用在安卓上运行的时候,都是调用的手机webview,而在不同的安卓机.不同版本的系统上,webview的性能 ...
-
hybird app项目实例:安卓webview中HTML5拍照图片上传
应用的平台环境:安卓webview: 涉及的技术点: (1) <input type="file" > :在开发中,安卓webview默认点击无法调用文件选择与相机拍照 ...
-
QQ浏览器、搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie、Session失效问题
原文:QQ浏览器.搜狗浏览器等兼容模式下,Asp.NetCore下,Cookie.Session失效问题 这些狗日的浏览器在兼容模式下,保存Cookie会失败,是因为SameSiteMode默认为La ...
-
Spring Cloud实战 | 最终篇:Spring Cloud Gateway+Spring Security OAuth2集成统一认证授权平台下实现注销使JWT失效方案
一. 前言 在上一篇文章介绍 youlai-mall 项目中,通过整合Spring Cloud Gateway.Spring Security OAuth2.JWT等技术实现了微服务下统一认证授权平台 ...
-
痞子衡嵌入式:在IAR开发环境下RT-Thread工程函数重定向失效分析
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下RT-Thread工程函数重定向失效分析. 痞子衡旧文 <在IAR下将关键函数重定向到RAM中执行的方法> ...
-
ios webview下footer部分fixed失效问题
场景: 如下图所示,一个很正常的页面需求,footer固定在底部,中间为滚动内容区 然后footer的css一般是这样的 footer{ position:fixed; bottom:; left:; ...
-
真正可用的安卓webview html图片上传限制突破处理(拍照+相册都可以用)
两篇起步使用webview参考文章,第一篇解除限制,但会调用外部浏览器打开链接,第二篇 覆盖shouldOverrideUrlLoading return true https://www.jb51. ...
随机推荐
-
win7系统下 自带的定时关机
进入cmd下,输入shutdown -s -t 600 以上例子代表的是10分钟后自动关机 -s代表定时关机 -t代表着定时,时间以秒为单位一分钟60s 输入完后按enter 定时关机设置完成 当想取 ...
-
浅谈JAVA设计模式
没有万行的代码量,就不要想搞清楚设计模式.目前本人代码量大约在六千五百行,2016年需要继续努力,尽快完成万行之约. 工作之余需要,下面提前简单讨论一下设计模式. 创建型模式,共五种:工厂模式.抽象工 ...
-
Android热身:通过网络获取资源并更新UI组件
Android热身:通过网络获取资源并更新UI组件 目标 点击"发送请求"按钮,下载某网页的html源码,并显示在TextView控件上:点击"清空",清除Te ...
-
数论 UVA 10943
这是一道关于组合数和隔板法的数论题目.题目说的是选出k个不同且不大于N的数字进行相加,要求这些数字之和等于N,结果要求输出这样的数有多少组.这里可以将问题利用隔板法来转换,那么题目的叙述可以转换成:这 ...
-
Apache 2.2 到 2.4的不同
1.权限设定方式变更 2.2使用Order Deny / Allow的方式,2.4改用Require apache2.2: Order deny,allowDeny from allapache2.4 ...
-
JQ trigger函数无法触发a标签的两种解决方法
起因:点击icon图标后要触发a标签的链接转跳动作,但是用 JQ 的 $('#a').trigger('click') 居然不起作用,遂百度之,总结两种方法如下: (原因:JQ 的 trigger() ...
-
exp和imp的使用场合
1.检测冲突 使用exp工具,在数据库中预先检测到物理或逻辑冲突. 导出的同时,将全扫描数据库中的每张表,读出所有行.如果某处表中有个损坏的块,必然能找到它. 2.可以用来快速恢复数据库. 使用exp ...
-
SparkStreaming
Spark Streaming用于流式数据的处理.Spark Streaming支持的数据输入源很多,例如:Kafka.Flume.Twitter.ZeroMQ和简单的TCP套接字等等.数据输入后可以 ...
-
Incorrect key file for table错误解决方法
问题现象: alter table portal_app_xxxx_xxx add devno varchar(64) NOT NULL DEFAULT '' COMMENT '设备机编',add s ...
-
[USACO3.2]Sweet Butter
题目大意: 给定一张$k$个结点,$m$条边的无向图,其中有$n$个点被标记,在这$k$个点中找出一个点使得这个点到那$n$个点的最短距离之和最小,求出这个距离和. 思路: 对于每个标记结点跑最短路, ...