When having useDelegation=false getTarget() only returns a target if the event handler was registered on exactly the same element as event.target. That means that you can't register an event handler on a div and still allow clicking on elements within that div (e.g., in our case we have a div and a canvas within that div). Instead of looking at event.target it would be better to use the element that bind() was called on.
I'm in the middle of those changes right now, so this is not yet finished, but I'm thinking of something like this:
--- jquery.touchy-orig.js Tue Aug 21 15:45:55 2012
+++ jquery.touchy.js Tue Aug 21 15:44:24 2012
@@ -94,9 +94,8 @@
var proxyHandlers = {
handleTouchStart: function (e) {
-
var eventType = this.context,
- $target = getTarget(e, eventType);
+ $target = getTarget(e, eventType, this.target);
if ($target) {
var event = e.originalEvent,
@@ -192,7 +191,7 @@
handleTouchMove: function (e) {
var eventType = this.context,
- $target = getTarget(e, eventType);
+ $target = getTarget(e, eventType, this.target);
if ($target) {
var event = e.originalEvent,
@@ -336,7 +335,7 @@
handleGestureChange: function (e) {
var eventType = this.context,
- $target = getTarget(e, eventType);
+ $target = getTarget(e, eventType, this.target);
if ($target) {
var $target = $(e.target),
@@ -393,7 +392,7 @@
handleTouchEnd: function (e) {
var eventType = this.context,
- $target = getTarget(e, eventType);
+ $target = getTarget(e, eventType, this.target);
if ($target) {
var event = e.originalEvent,
@@ -507,7 +506,7 @@
*
handleTouchCancel: function (e) {
var eventType = this.context,
- $target = getTarget(e, eventType);
+ $target = getTarget(e, eventType, this.target);
if ($target) {
var target = e.target,
@@ -652,11 +651,11 @@
return points;
},
- getTarget = function(e, eventType){
+ getTarget = function(e, eventType, origTarget){
var $delegate,
$target = false,
i = 0,
- len = boundElems[eventType].length
+ len = boundElems[eventType].length;
if ($.touchyOptions.useDelegation) {
for (; i < len; i += 1) {
$delegate = $(boundElems[eventType][i]).has(e.target);
@@ -666,8 +665,8 @@
}
}
}
- else if (boundElems[eventType] && boundElems[eventType].index(e.target) != -1) {
- $target = $(e.target)
+ else {
+ $target = origTarget;
}
return $target;
},
@@ -775,9 +774,11 @@
$(this).data('touchy' + capitalizedKey, $.extend({}, $.touchyOptions[key].data));
$(this).data('touchy' + capitalizedKey).settings = $.extend({}, $.touchyOptions[key]);
delete $(this).data('touchy' + capitalizedKey).settings.data;
- if ( boundElems[key].length === 1 ) {
+ var handler = $.touchyOptions.useDelegation ? $(document) : $(this);
+ var context = $.extend({target: handler}, contexts[key]);
+ if ( boundElems[key].length === 1 || !$.touchyOptions.useDelegation) {
$.each($.touchyOptions[key].proxyEvents, function(i, proxyEvent){
- $(document).bind(proxyEvent.toLowerCase() + '.touchy.' + key, $.proxy(proxyHandlers['handle' + proxyEvent], contexts[key]
));
+ handler.bind(proxyEvent.toLowerCase() + '.touchy.' + key, $.proxy(proxyHandlers['handle' + proxyEvent], context));
});
}
@@ -785,9 +786,10 @@
teardown: function (namespaces) {
boundElems[key] = boundElems[key].not( this );
$(this).removeData('touchy' + capitalizedKey);
- if ( boundElems[key].length === 0 ) {
+ var handler = $.touchyOptions.useDelegation ? $(document) : $(this);
+ if ( boundElems[key].length === 0 || !$.touchyOptions.useDelegation) {
$.each($.touchyOptions[key].proxyEvents, function(i, proxyEvent){
- $(document).unbind(proxyEvent.toLowerCase() + '.touchy.' + key);
+ handler.unbind(proxyEvent.toLowerCase() + '.touchy.' + key);
});
}
},
When having useDelegation=false getTarget() only returns a target if the event handler was registered on exactly the same element as event.target. That means that you can't register an event handler on a div and still allow clicking on elements within that div (e.g., in our case we have a div and a canvas within that div). Instead of looking at event.target it would be better to use the element that bind() was called on.
I'm in the middle of those changes right now, so this is not yet finished, but I'm thinking of something like this: