-
-
Save attenzione/7098476 to your computer and use it in GitHub Desktop.
/* | |
* jQuery Double Tap | |
* Developer: Sergey Margaritov (github.com/attenzione) | |
* License: MIT | |
* Date: 22.10.2013 | |
* Based on jquery documentation http://learn.jquery.com/events/event-extensions/ | |
*/ | |
(function($){ | |
$.event.special.doubletap = { | |
bindType: 'touchend', | |
delegateType: 'touchend', | |
handle: function(event) { | |
var handleObj = event.handleObj, | |
targetData = jQuery.data(event.target), | |
now = new Date().getTime(), | |
delta = targetData.lastTouch ? now - targetData.lastTouch : 0, | |
delay = delay == null ? 300 : delay; | |
if (delta < delay && delta > 30) { | |
targetData.lastTouch = null; | |
event.type = handleObj.origType; | |
['clientX', 'clientY', 'pageX', 'pageY'].forEach(function(property) { | |
event[property] = event.originalEvent.changedTouches[0][property]; | |
}) | |
// let jQuery handle the triggering of "doubletap" event handlers | |
handleObj.handler.apply(this, arguments); | |
} else { | |
targetData.lastTouch = now; | |
} | |
} | |
}; | |
})(jQuery); |
[See Final EDIT below....]
Hello, when I attempted to integrate this js, the code that assigns the event handler to a canvas element throws this error: TypeError: 'undefined' is not a function (evaluating '$(placedItemObj.itemCanv).on('doubletap',function(event){
alert('doubletap');
})')
any thoughts on what I am doing wrong? [EDIT] In changing '.on' to '.bind' the error is no longer thrown but the event also does not bind to the selector. I should note that even when I backed up and attempted to implement the multi-click sample event here http://learn.jquery.com/events/event-extensions/ (upon which this extension is said to be modeled), I got the same error. I should also note that I verified that the custom event handler code is definitely being included, after the main jQuery js and before this code is called.
[Final EDIT] My apologies - the error I was getting was caused by an outdated local version of jQuery. Updating jQuery to http://code.jquery.com/jquery-1.11.0.min.js totally removed the error and allowed the event to fire as expected.
@Enesbil to detect that event isn't multitouch
if (e.touches && e.touches.length > 1) {
return;
}
thanks!!! :) 👍
There doesn't appear to be a way to pass a delay value, but it's a great plugin nonetheless 👍
I've made a tiny custom event which is superior - https://github.com/yairEO/touchy
@yairEO, how does that different than this one?
@yairEO You have used tabs AND spaces, and have left debugging code in there...
Hello, It need a filter for two finger multitouch usage !
The filter must discard two different location taps !
Hello, It need a filter for two finger multitouch usage !
The filter must discard two different location taps !
You need to parse event params:
if (e.touches && e.touches.length === 2) {
// two finger multitouch event
}
This is a part of the work yes, now the filter must discard two different location taps
This is a part of the work yes, now the filter must discard two different location taps
Nice, I can't give you an answer with one row of code, you need to implement some logic with event touches coordinates
Sorry for my english I'm French:) Yes it's mandatory because when we slide with two fingers there is a lot bad taps received and this frequently make a false double tap.
just store the last tap coordinate and make a difference with the new one to get the delta. If delta > tolerance; return.
There is no need for touches.length check.
Awesome !!!
Sorry for double-post, I want to make a little suggestion/addition.
To seperate multitouch (e.g. zoom) from doubletap, you can change the minimum delta in die if-clause. Like this:
if (delta < delay && delta > 50)
instead of:
if (delta < delay && delta > 0)
Kind regards