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 关键字与选择器不对称情况的更多相关文章

  1. touch.js - 移动设备上的手势识别与事件库

    Touch.js 是移动设备上的手势识别与事件库, 由百度云Clouda团队维护,也是在百度内部广泛使用的开发工具.Touch.js手势库专为移动设备设计.Touch.js对于网页设计师来说,是一款不 ...

  2. 利用epoll写一个"迷你"的网络事件库

    epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取 ...

  3. ktouch移动端事件库

    最近闲来无事,写了个移动端的事件库,代码贴在下面,大家勿拍. /** @version 1.0.0 @author gangli @deprecated 移动端触摸事件库 */ (function ( ...

  4. Yarn的服务库和事件库使用方法

    事件类型定义: package org.apache.hadoop.event; public enum JobEventType { JOB_KILL, JOB_INIT, JOB_START } ...

  5. Threejs 的场景查看 - 几个交互事件库助你方便查看场景

    Threejs 的场景查看 - 几个交互事件库助你方便查看场景 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致&q ...

  6. [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)

    原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...

  7. Hadoop服务库与事件库的使用及其工作流程

    Hadoop服务库与事件库的使用及其工作流程   Hadoop服务库: YARN采用了基于服务的对象管理模型,主要特点有: 被服务化的对象分4个状态:NOTINITED,INITED,STARTED, ...

  8. Hadoop2源码分析-YARN 的服务库和事件库

    1.概述 在<Hadoop2源码分析-YARN RPC 示例介绍>一文当中,给大家介绍了YARN 的 RPC 机制,以及相关代码的演示,今天我们继续去学习 YARN 的服务库和事件库,分享 ...

  9. Redis事件库源码分析

    由于老大在新项目中使用redis的事件库代替了libevent,我也趁着机会读了一遍redis的事件库代码,第一次读到“优美,让人愉快”的代码,加之用xmind制作的类图非常帅,所以留文纪念. Red ...

随机推荐

  1. HDU - 2181 dfs [kuangbin带你飞]专题二

    保存每个节点的下一个节点一直往下面走就行了,不能重复经过某个点,当经过的点达到20个而且当前节点的下一个节点是起点就打印答案. AC代码 #include<cstdio> #include ...

  2. Minikube之Win10单机部署

    Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作.如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes ...

  3. 在SpringBoot中配置aop

    前言 aop作为spring的一个强大的功能经常被使用,aop的应用场景有很多,但是实际的应用还是需要根据实际的业务来进行实现.这里就以打印日志作为例子,在SpringBoot中配置aop 已经加入我 ...

  4. (转载)SVM-基础(二)

    支持向量机: Support Vector  by pluskid, on 2010-09-10, in Machine Learning     52 comments 本文是"支持向量机 ...

  5. 用线性单元(LinearUnit)实现工资预测的Python3代码

    功能:通过样本进行训练,让线性单元自己找到(这就是所谓机器学习)工资计算的规律,然后用两组数据进行测试机器是否真的get到了其中的规律. 原文链接在文尾,文章中的代码为了演示起见,仅根据工作年限来预测 ...

  6. 关于adb is down 的两个解决方案

    在Android开发过程中经常遇到这样的一个问题,The connection to adb is down, and a severe error has occured. 解决方案一: 1.为了以 ...

  7. Flex弹出窗口请求Action函数

    Flex弹出窗口请求Action函数 private function askQuestion(event:MouseEvent):void { var askQuestions:AskWindow ...

  8. Excel 2010高级应用-条状图(五)

    Excel 2010高级应用-条状图(五) 基本操作如下: 1.新建一个Excel空白文档,并命名条状图 2.单击"插入",找到条状图的样图 3.选择其中一种类型的条状图样图,在空 ...

  9. 2016弱校联盟十一专场10.3 We don't wanna work!

    能把 not working now 写成 not working hard now 还查一晚上也是没谁了 我的做法是维护两个set 分别是前20% 和后80% #include<iostrea ...

  10. Mysql简单笔记

    对oracle还是比较熟悉的,对mysql也是零散的有些了解,今天看了下,简单总结: 1.查看mysql版本:mysqladmin --version2.查看mysql进程:ps -ef|grep m ...