移动web app开发必备 - zepto事件问题
问题描述:
项目在祖先元素上绑定了 touchstart,touchmove,touchend事件,用来处理全局性的事件,比如滑动翻页
正常状态下:
- 用户在子元素上有交互动作时,默认状态下都是会冒泡到祖先元素响应
特定情况下:
- 子元素单独绑定了事件
- 特性情况下需要阻止全局事件
常规的做法就是stopPropagation阻止即可
但如果子元素绑定的是 click,touchmove,touchend这类事件的话,问题就来了
全局的touchstart事件也会被冒泡触发
发一段项目图:
/**
* ppt事件接口
*
* 允许用户自定义其行为
* 1 支持14种操作行为
* 2 默认对象都具有滑动翻页的特性
* 3 翻页的特性在遇到特性的情况可以被覆盖
* 比如
* 行为1:用户定义该名字可以支持 click 点击行为, 那么该元素左右滑动能过翻页
* 行为2:用户如果定义swipeLeft 行为,该元素左右滑动将不会翻页,因为默认翻页已经被覆盖
*
* 此接口函数有作用域隔离
*/
Xut.define('Xut.PPTevent', { //数据库预定义14个事件接口
defauleEventType: ['null', 'auto', 'tap', 'drag', 'dragTag',
'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap',
'longTap', 'mTouchMagnify', 'mTouchNarrow', 'mTouchRotate'
], //绑定事件
bind: function(element, evtName, fn) {
element.on(Xut.START_EV, function(e) { //阻止 mousedown事件冒泡
e.stopPropagation();
});
element.on(evtName, fn); //绑定真正事件
},
on绑定的事件替换成硬编码容易理解
bind: function(element, evtName, fn) {
element.on('mousedown', function(e) { //阻止 mousedown事件冒泡
e.stopPropagation();
});
element.on('swipeLeft', fn); //绑定真正事件
},
给元素绑定'swipeLeft'滑动事件,同时阻止'mousedown'冒泡到祖先元素,此时理论上就可行了
这样处理之后zepto移动事件确失效了
Zepto事件绑定
$(document.body)
.bind('touchstart', function(e){
now = Date.now()
delta = now - (touch.last || now)
touch.el = $(parentIfText(e.touches[0].target))
touchTimeout && clearTimeout(touchTimeout)
touch.x1 = e.touches[0].pageX
touch.y1 = e.touches[0].pageY
if (delta > 0 && delta <= 250) touch.isDoubleTap = true
touch.last = now
longTapTimeout = setTimeout(longTap, longTapDelay)
})
.bind('touchmove', function(e){
cancelLongTap()
touch.x2 = e.touches[0].pageX
touch.y2 = e.touches[0].pageY
if (Math.abs(touch.x1 - touch.x2) > 10)
e.preventDefault()
})
.bind('touchend', function(e){
cancelLongTap()
zepto移动事件失效的根源找到了,不能阻止事件冒泡了,不能拦截了
偏偏Zepto不让你这么安逸,学jquery的live()方法一样,把事件给绑到body元素上了, jquery1.7后就去掉了,zepto你也要跟上呀
处理的办法:
子元素上增加一个hack标记, 控制器冒泡过滤排除
onTouchStart: function (e) {
var point = Xut.hasTouch ? e.touches[0] : e;
if (!point) return;
this.bindDefaultEventId = null;
var children = point.target.offsetParent.children[0];
//处理默认特性
if (children.getAttribute('bindDefaultEvent')) {
this.bindDefaultEventId = children.id;
} else {
var className = point.target.className;
if (className && className === 'triggerAction') {
//Actoin热点,通过冒泡捕获到
} else {
if (className !== 'widgetwapper') {
this.start = void 0;
return;
}
}
}
移动web app开发必备 - zepto事件问题的更多相关文章
- 移动web app开发必备 - Deferred 源码分析
姊妹篇 移动web app开发必备 - 异步队列 Deferred 在分析Deferred之前我觉得还是有必要把老套的设计模式给搬出来,便于理解源码! 观察者模式 观察者模式( 又叫发布者-订阅者模 ...
- 移动web app开发必备 - 异步队列 Deferred
背景 移动web app开发,异步代码是时常的事,比如有常见的异步操作: Ajax(XMLHttpRequest) Image Tag,Script Tag,iframe(原理类似) setTimeo ...
- web app 开发必不可少的滑动插件 Flipsnap
flipsnap.js一个轻量级的滑动效果JS开发库,仅有8k大小(压缩版),包含了10种滑动方式,是web app开发必备的js库,除了兼容主流的智能手机浏览器(iossafari,android, ...
- 微信公众平台开发:Web App开发入门
WebApp与Native App有何区别呢?Native App:1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C.2.更新体验较差.同时也比较麻烦.每一次发布新的版 ...
- 前端读者 | Web App开发入门
本文来自互联网 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词 - Web App(意为基于WEB形式的应用程序).业界关于Web App与Nativ ...
- App.js – 用于移动 Web App 开发的 JS 界面库
App.js 是一个轻量级的 JavaScript UI 库,用于创建像本地应用程序的移动 Web 应用而不牺牲性能和体验.它是跨平台的,特定的UI设计,配置类似原生的过渡效果.App.js 的目的是 ...
- 移动端web app开发学习笔记
移动web和pc端web以及web app 移动web开发跟web前端开发差别很小,使用的技术都是html+css+js.手机网页可以理解成pc网页的缩小版加一些触摸特性.在浏览器中进行的网页开发,最 ...
- Native App开发 与Web App开发(原生与web开发优缺点)
Native App开发 Native App开发即我们所称的传统APP开发模式(原生APP开发模式),该开发针对IOS.Android等不同的手机操作系统要采用不同的语言和框架进行开发,该模式通常是 ...
- WEB APP 开发标签
第一个meta标签表示:强制让文档的宽度与设备的宽度保持1:1,并且文档最大的宽度比例是1.0,且不允许用户点击屏幕放大浏览: 第二个meta标签是iphone设备中的safari私有meta标签,它 ...
随机推荐
- 用Barcode生成条形码图片
使用第三方类库:BarcodeLib.dll private BitmapImage GenerateBarcodeBitmap(string visitId) { BarcodeLib.Barcod ...
- C++: Virtual Table and Shared Memory
See at: 补充栏3: C++对象和共享内存 (叙述内容和Link1的内容基本一致) <C++网络编程 卷1:运用ACE和模式消除复杂性> <C++ Network Progra ...
- 前端性能优化--为什么DOM操作慢?
作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩(css.js.图片皆可压缩) 样式表放头部 ...
- 浅谈ajax
Ajax 回顾 最本质的 ajax 其实是这样的: function Ajax(){ var xmlHttpReq = null; if (window.ActiveXObject){//IE5 IE ...
- 弱省互测#0 t2
题意 给定两个字符串 A 和 B,求下面四个问题的答案: 1.在 A 的子串中,不是 B 的子串的字符串的数量. 2.在 A 的子串中,不是 B 的子序列的字符串的数量. 3.在 A 的子序列中,不是 ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- JS区分移动端和PC
var ua = navigator.userAgent.toLowerCase(); if (ua.match(/MicroMessenger/i) == "micromessenger& ...
- 【PostgreSQL】PostgreSQL的安装
到了新公司,新公司的数据库是使用PostgreSQL,第一次学习,第一次安装. 开始安装:
- idea 根据数据库表自动创建持久化类
一.点击最右边的Database: 二.点击,再点DataSource选择数据库类型,配置数据库信息: 三.打开项目结构,选择,找到你的项目,点击,添加hibernate: 四.如果有现成的cfg.x ...
- CSS3动画快速实现
在工作或者平时做demo中,经常会遇到做一些简单的动画.初级前端同学可能就会有些棘手了. 在这里我发现了一个网上笔记实用且简单易上手的动画库.与大家共享一下: 更多请查看:http://anicoll ...