$.fn.tap = function(fn){
var collection = this,
isTouch = "ontouchend" in document.createElement("div"),
tstart = isTouch ? "touchstart" : "mousedown",
tmove = isTouch ? "touchmove" : "mousemove",
tend = isTouch ? "touchend" : "mouseup",
tcancel = isTouch ? "touchcancel" : "mouseout";
collection.each(function(){
var i = {};
i.target = this;
$(i.target).on(tstart,function(e){
var p = "touches" in e ? e.touches[0] : (isTouch ? window.event.touches[0] : window.event);
i.startX = p.clientX;
i.startY = p.clientY;
i.endX = p.clientX;
i.endY = p.clientY;
i.startTime = + new Date;
});
$(i.target).on(tmove,function(e){
var p = "touches" in e ? e.touches[0] : (isTouch ? window.event.touches[0] : window.event);
i.endX = p.clientX;
i.endY = p.clientY;
});
$(i.target).on(tend,function(e){
if((+ new Date)-i.startTime<300){
if(Math.abs(i.endX-i.startX)+Math.abs(i.endY-i.startY)<20){
var e = e || window.event;
e.preventDefault();
fn.call(i.target);
}
}
i.startTime = undefined;
i.startX = undefined;
i.startY = undefined;
i.endX = undefined;
i.endY = undefined;
});
});
return collection;
}