This repository has been archived by the owner on May 12, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
/
tap-listener.js
113 lines (96 loc) · 2.58 KB
/
tap-listener.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/*!
* Tap listener v2.0.0
* listens to taps
* MIT license
*/
/*jshint browser: true, unused: true, undef: true, strict: true */
( function( window, factory ) {
// universal module definition
/*jshint strict: false*/ /*globals define, module, require */
if ( typeof define == 'function' && define.amd ) {
// AMD
define( [
'unipointer/unipointer'
], function( Unipointer ) {
return factory( window, Unipointer );
});
} else if ( typeof module == 'object' && module.exports ) {
// CommonJS
module.exports = factory(
window,
require('unipointer')
);
} else {
// browser global
window.TapListener = factory(
window,
window.Unipointer
);
}
}( window, function factory( window, Unipointer ) {
'use strict';
// -------------------------- TapListener -------------------------- //
function TapListener( elem ) {
this.bindTap( elem );
}
// inherit Unipointer & EventEmitter
var proto = TapListener.prototype = Object.create( Unipointer.prototype );
/**
* bind tap event to element
* @param {Element} elem
*/
proto.bindTap = function( elem ) {
if ( !elem ) {
return;
}
this.unbindTap();
this.tapElement = elem;
this._bindStartEvent( elem, true );
};
proto.unbindTap = function() {
if ( !this.tapElement ) {
return;
}
this._bindStartEvent( this.tapElement, false );
delete this.tapElement;
};
/**
* pointer up
* @param {Event} event
* @param {Event or Touch} pointer
*/
proto.pointerUp = function( event, pointer ) {
// ignore emulated mouse up clicks
if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {
return;
}
var pointerPoint = Unipointer.getPointerPoint( pointer );
var boundingRect = this.tapElement.getBoundingClientRect();
var scrollX = window.pageXOffset;
var scrollY = window.pageYOffset;
// calculate if pointer is inside tapElement
var isInside = pointerPoint.x >= boundingRect.left + scrollX &&
pointerPoint.x <= boundingRect.right + scrollX &&
pointerPoint.y >= boundingRect.top + scrollY &&
pointerPoint.y <= boundingRect.bottom + scrollY;
// trigger callback if pointer is inside element
if ( isInside ) {
this.emitEvent( 'tap', [ event, pointer ] );
}
// set flag for emulated clicks 300ms after touchend
if ( event.type != 'mouseup' ) {
this.isIgnoringMouseUp = true;
// reset flag after 300ms
var _this = this;
setTimeout( function() {
delete _this.isIgnoringMouseUp;
}, 400 );
}
};
proto.destroy = function() {
this.pointerDone();
this.unbindTap();
};
// ----- ----- //
return TapListener;
}));