关于 Touchjs 手势识别事件库 this 关键字与选择器不对称情况
Touchjs 版本 v0.2.14
废话不多,直接看代码,一个拖动实例
<div id="touch-drag"></div> <script type="text/javascript">
var dx, dy;
touch.on('#touch-drag', 'drag', function(ev){
dx = dx || 0;
dy = dy || 0;
var offx = dx + ev.x + "px";
var offy = dy + ev.y + "px";
this.style.webkitTransform = "translate3d(" + offx + "," + offy + ",0)";
console.log(this); //-> <div id="touch-drag"></div>
}); touch.on('#target', 'dragend', function(ev){
dx += ev.x;
dy += ev.y;
});
</script>
拖动正常,demo 完成,自信满满的去交工,30分钟后。。。 什么,报错? 怎么可能,我来看看 ↓
<div id="touch-drag">
<h2>小火箭</h2>
<img src="..." />
<span>∧∪∧</span>
</div> <script type="text/javascript">
var dx, dy;
touch.on('#touch-drag', 'drag', function(ev){
dx = dx || 0;
dy = dy || 0;
var offx = dx + ev.x + "px";
var offy = dy + ev.y + "px";
this.style.webkitTransform = "translate3d(" + offx + "," + offy + ",0)";
console.log(this); //-> <img src="..." />
console.log(this); //-> <h2>小火箭</h2>
console.log(this); //-> <span>∧∪∧</span>
}); touch.on('#target', 'dragend', function(ev){
dx += ev.x;
dy += ev.y;
});
</script>
xxxx ,怎么加了两个子节点就拖得乱七八糟,this 怎么不是选择器 "#touch-drag" ,杯具。。。
尝试方法一:console.log(ev); //-> 找找看 #touch-drag,失败
尝试方法二:应急处理,递归回 #touch-drag
var _this = (function(){
var stack_max = 100; //防止堆栈溢出
var f = function(target){
var id = target.getAttribute("id");
if(!!stack_max--) return false;
if( !!id && id ==="#touch-drag" ) return target;
return f( target.parentNode );
};
return f(arguments[0]) || console.error("Did not find the "#touch-drag" node");
})(this);
看看官方的 API 说明
事件代理
touch.on( delegateElement, types, selector, callback );
功能描述:
事件代理方法。
参数描述:
| 参数 | 类型 | 描述 |
|---|---|---|
| delegateElement | element或string | 事件代理元素或选择器 |
| types | string | 手势事件的类型, 可接受多个事件以空格分开;支持原生事件的透传。目前支持的具体事件类型,详见《手势事件类型》。 |
| selector | string | 代理子元素选择器, |
| callback | function | 事件处理函数,如需了解手势库支持的新属性,详见《事件对象》 |
经过测试,即使添加了第三个参数 selector ,this 依然不是我们想要的,那只能看看源码了。
仔细想想,touchjs 绑定很像 jQuery 的事件委托,this -> e.target,找找 touchjs 源码
var E = {};
return E.on = E.bind = E.live = B,
E.off = E.unbind = E.die = C,
E.config = d,
E.trigger = D,
E
源码最后一块,原来绑定事件的方法就是一个呀,为了支持常用习惯,多写了几个同名的,再找找
bind: function(a, c, d) {
a.listeners = a.listeners || {},
a.listeners[c] ? a.listeners[c].push(d) : a.listeners[c] = [d];
var e = function(a) {
b.env.ios7 && b.forceReflow(),
a.originEvent = a;
for (var c in a.detail)"type" !== c && (a[c] = a.detail[c]);
a.startRotate = function() {
t = !0
};
var e = d.call(/*a.target*/this, a);
"undefined" == typeof e || e || (a.stopPropagation(), a.preventDefault())
};
d.proxy = d.proxy || {},
d.proxy[c] ? d.proxy[c].push(this.proxyid++) : d.proxy[c] = [this.proxyid++],
this.proxies.push(e),
a.addEventListener && a.addEventListener(c, e, !1)
}
终于找到了, 看代码
var e = d.call(/*a.target*/this, a);
经过测试,OK
注:以上纯属个人看法,如有不当之处,请多多指教
关于 Touchjs 手势识别事件库 this 关键字与选择器不对称情况的更多相关文章
- touch.js - 移动设备上的手势识别与事件库
Touch.js 是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具.Touch.js手势库专为移动设备设计.Touch.js对于网页设计师来说,是一款不 ...
- 利用epoll写一个"迷你"的网络事件库
epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...
- ktouch移动端事件库
最近闲来无事,写了个移动端的事件库,代码贴在下面,大家勿拍. /** @version 1.0.0 @author gangli @deprecated 移动端触摸事件库 */ (function ( ...
- Yarn的服务库和事件库使用方法
事件类型定义: package org.apache.hadoop.event; public enum JobEventType { JOB_KILL, JOB_INIT, JOB_START } ...
- Threejs 的场景查看 - 几个交互事件库助你方便查看场景
Threejs 的场景查看 - 几个交互事件库助你方便查看场景 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&q ...
- [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- Hadoop服务库与事件库的使用及其工作流程
Hadoop服务库与事件库的使用及其工作流程 Hadoop服务库: YARN采用了基于服务的对象管理模型,主要特点有: 被服务化的对象分4个状态:NOTINITED,INITED,STARTED, ...
- Hadoop2源码分析-YARN 的服务库和事件库
1.概述 在<Hadoop2源码分析-YARN RPC 示例介绍>一文当中,给大家介绍了YARN 的 RPC 机制,以及相关代码的演示,今天我们继续去学习 YARN 的服务库和事件库,分享 ...
- Redis事件库源码分析
由于老大在新项目中使用redis的事件库代替了libevent,我也趁着机会读了一遍redis的事件库代码,第一次读到“优美,让人愉快”的代码,加之用xmind制作的类图非常帅,所以留文纪念. Red ...
随机推荐
- UVA 10534最长上升子序列运用
在给定序列中寻找一个1~n+1递增,n~2n+1递减的序列,我的想法是直接对原序列和原序列的反序列用nlgn算法求递增序列,例如序列a[]={1,2,4,1,2,6},它的反序列为b[]={6,2,1 ...
- 【BZOJ1095】 Hide 捉迷藏
Time Limit: 4000 ms Memory Limit: 256 MB Description 捉迷藏 Jiajia和Wind是一对恩爱的夫妻,并且他们有很多孩子.某天,Jiajia.W ...
- Subsequence Count (线段树)
Time Limit: 1000 ms Memory Limit: 256 MB Description 给定一个01串 $S_{1 \cdots n}$ 和 $Q$ 个操作. 操作有两种类型: ...
- DM6446 uboot分析
1. 顶层目录下的Makefile 按照配置顺序: davinci_config : unconfig @./mkconfig $(@:_config=) arm arm926ejs davin ...
- JAVA的helloworld
java环境设置------------- 在环境变量中设置以下三个变量:JAVA_HOME=C:\j2sdk1.4.1 //可以改为相应的目录CLASSPATH=%JAVA_HOME%\lib\to ...
- Java并发 线程池
线程池技术就是事先创建一批线程,这批线程被放入到一个池子里,在没有请求到达服务端时候,这些线程都是处于待命状态,当请求到达时候,程序会从线程池里取出一个线程,这个线程处理到达的请求,请求处理完毕,该线 ...
- 关于ios手机游览器针对overflow:hidden设置无效的解决办法
Ordinarily, overflow: hidden; on the body tag is sufficient to prevent scrolling a web page, if for ...
- Mac 常用快捷键
可以按下组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作. 要使用键盘快捷键,需按住一个或多个修饰键,同时按快捷键的最后一个键.例如,要使用快捷键 Command-C(拷贝),请按住 Co ...
- iOS - Mac 常用设置
1.Finder 中显示资源库 方法一: 在 "终端" 中输入下面的命令: 显示: $ chflags nohidden ~/Library/ 隐藏: $ chflags hidd ...
- httpclient的主要业务代码逻辑(图解)
一,主要代码逻辑(图解) 二,两个案例的对比(图解) 三,详细案例 3.1,博文一 httppost的用法(NameValuePair(简单名称值对节点类型)核心对象) 3.2,博文二 httpcli ...