unidragger
Advanced tools
Comparing version 0.1.0 to 0.2.0
{ | ||
"name": "unidragger", | ||
"main": "unidragger.js", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"dependencies": { | ||
"eventie": "~1.0.6" | ||
"unipointer": "~0.1.0" | ||
}, | ||
@@ -8,0 +8,0 @@ "authors": [ |
{ | ||
"name": "unidragger", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "Base draggable class", | ||
"main": "unidragger.js", | ||
"dependencies": { | ||
"eventie": "^1.0.6" | ||
"unipointer": "~0.1.0" | ||
}, | ||
@@ -9,0 +9,0 @@ "scripts": { |
@@ -14,2 +14,8 @@ # Unidragger | ||
## Install | ||
Bower: `bower install unidragger --save` | ||
npm: `npm install unidragger --save` | ||
## Demo code | ||
@@ -47,1 +53,7 @@ | ||
``` | ||
--- | ||
MIT license | ||
By [Metafizzy](http://metafizzy.co) |
/*! | ||
* Unidragger v0.1.0 | ||
* Unidragger v0.2.0 | ||
* Draggable base class | ||
@@ -17,5 +17,6 @@ * MIT license | ||
define( [ | ||
'eventie/eventie' | ||
], function( eventie ) { | ||
return factory( window, eventie ); | ||
'eventie/eventie', | ||
'unipointer/unipointer' | ||
], function( eventie, Unipointer ) { | ||
return factory( window, eventie, Unipointer ); | ||
}); | ||
@@ -26,3 +27,4 @@ } else if ( typeof exports == 'object' ) { | ||
window, | ||
require('eventie') | ||
require('eventie'), | ||
require('unipointer') | ||
); | ||
@@ -33,7 +35,8 @@ } else { | ||
window, | ||
window.eventie | ||
window.eventie, | ||
window.Unipointer | ||
); | ||
} | ||
}( window, function factory( window, eventie ) { | ||
}( window, function factory( window, eventie, Unipointer ) { | ||
@@ -59,20 +62,5 @@ 'use strict'; | ||
// trigger handler methods for events | ||
Unidragger.prototype.handleEvent = function( event ) { | ||
var method = 'on' + event.type; | ||
if ( this[ method ] ) { | ||
this[ method ]( event ); | ||
} | ||
}; | ||
// inherit Unipointer & EventEmitter | ||
Unidragger.prototype = new Unipointer(); | ||
// returns the touch that we're keeping track of | ||
Unidragger.prototype.getTouch = function( touches ) { | ||
for ( var i=0, len = touches.length; i < len; i++ ) { | ||
var touch = touches[i]; | ||
if ( touch.identifier == this.pointerIdentifier ) { | ||
return touch; | ||
} | ||
} | ||
}; | ||
// ----- bind start ----- // | ||
@@ -88,2 +76,3 @@ | ||
var navigator = window.navigator; | ||
/** | ||
@@ -94,46 +83,34 @@ * works as unbinder, as you can .bindHandles( false ) to unbind | ||
Unidragger.prototype._bindHandles = function( isBind ) { | ||
var binder; | ||
if ( window.navigator.pointerEnabled ) { | ||
binder = this.bindPointer; | ||
} else if ( window.navigator.msPointerEnabled ) { | ||
binder = this.bindMSPointer; | ||
// munge isBind, default to true | ||
isBind = isBind === undefined ? true : !!isBind; | ||
// extra bind logic | ||
var binderExtra; | ||
if ( navigator.pointerEnabled ) { | ||
binderExtra = function( handle ) { | ||
// disable scrolling on the element | ||
handle.style.touchAction = isBind ? 'none' : ''; | ||
}; | ||
} else if ( navigator.msPointerEnabled ) { | ||
binderExtra = function( handle ) { | ||
// disable scrolling on the element | ||
handle.style.msTouchAction = isBind ? 'none' : ''; | ||
}; | ||
} else { | ||
binder = this.bindMouseTouch; | ||
binderExtra = function() { | ||
// TODO re-enable img.ondragstart when unbinding | ||
if ( isBind ) { | ||
disableImgOndragstart( handle ); | ||
} | ||
}; | ||
} | ||
// munge isBind, default to true | ||
isBind = isBind === undefined ? true : !!isBind; | ||
// bind each handle | ||
var bindMethod = isBind ? 'bind' : 'unbind'; | ||
for ( var i=0, len = this.handles.length; i < len; i++ ) { | ||
var handle = this.handles[i]; | ||
binder.call( this, handle, isBind ); | ||
this._bindStartEvent( handle, isBind ); | ||
binderExtra( handle ); | ||
eventie[ bindMethod ]( handle, 'click', this ); | ||
} | ||
}; | ||
Unidragger.prototype.bindPointer = function( handle, isBind ) { | ||
// W3C Pointer Events, IE11. See https://coderwall.com/p/mfreca | ||
var bindMethod = isBind ? 'bind' : 'unbind'; | ||
eventie[ bindMethod ]( handle, 'pointerdown', this ); | ||
// disable scrolling on the element | ||
handle.style.touchAction = isBind ? 'none' : ''; | ||
}; | ||
Unidragger.prototype.bindMSPointer = function( handle, isBind ) { | ||
// IE10 Pointer Events | ||
var bindMethod = isBind ? 'bind' : 'unbind'; | ||
eventie[ bindMethod ]( handle, 'MSPointerDown', this ); | ||
// disable scrolling on the element | ||
handle.style.msTouchAction = isBind ? 'none' : ''; | ||
}; | ||
Unidragger.prototype.bindMouseTouch = function( handle, isBind ) { | ||
// listen for both, for devices like Chrome Pixel | ||
// which has touch and mouse events | ||
var bindMethod = isBind ? 'bind' : 'unbind'; | ||
eventie[ bindMethod ]( handle, 'mousedown', this ); | ||
eventie[ bindMethod ]( handle, 'touchstart', this ); | ||
// TODO re-enable img.ondragstart when unbinding | ||
if ( isBind ) { | ||
disableImgOndragstart( handle ); | ||
} | ||
}; | ||
// remove default dragging interaction on all images in IE8 | ||
@@ -165,32 +142,7 @@ // IE8 does its own drag thing on images, which messes stuff up | ||
Unidragger.prototype.onmousedown = function( event ) { | ||
// dismiss clicks from right or middle buttons | ||
var button = event.button; | ||
if ( button && ( button !== 0 && button !== 1 ) ) { | ||
return; | ||
} | ||
this._pointerDown( event, event ); | ||
}; | ||
Unidragger.prototype.ontouchstart = function( event ) { | ||
this._pointerDown( event, event.changedTouches[0] ); | ||
}; | ||
Unidragger.prototype.onMSPointerDown = | ||
Unidragger.prototype.onpointerdown = function( event ) { | ||
this._pointerDown( event, event ); | ||
}; | ||
// hash of events to be bound after start event | ||
var postStartEvents = { | ||
mousedown: [ 'mousemove', 'mouseup' ], | ||
touchstart: [ 'touchmove', 'touchend', 'touchcancel' ], | ||
pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ], | ||
MSPointerDown: [ 'MSPointerMove', 'MSPointerUp', 'MSPointerCancel' ] | ||
}; | ||
var allowTouchstartNodes = { | ||
var allowTouchstartNodes = Unidragger.allowTouchstartNodes = { | ||
INPUT: true, | ||
A: true, | ||
BUTTON: true | ||
BUTTON: true, | ||
SELECT: true | ||
}; | ||
@@ -203,97 +155,30 @@ | ||
*/ | ||
Unidragger.prototype._pointerDown = function( event, pointer ) { | ||
// dismiss other pointers | ||
if ( this.isPointerDown ) { | ||
return; | ||
} | ||
this.isPointerDown = true; | ||
// save pointer identifier to match up touch events | ||
this.pointerIdentifier = pointer.pointerId !== undefined ? | ||
// pointerId for pointer events, touch.indentifier for touch events | ||
pointer.pointerId : pointer.identifier; | ||
// track to see when dragging starts | ||
this.pointerDownPoint = Unidragger.getPointerPoint( pointer ); | ||
var targetNodeName = event.target.nodeName; | ||
// HACK iOS, allow clicks on buttons, inputs, and links | ||
var isTouchstart = event.type == 'touchstart'; | ||
var isTouchstartNode = allowTouchstartNodes[ targetNodeName ]; | ||
if ( !isTouchstart || ( isTouchstart && !isTouchstartNode ) ) { | ||
preventDefaultEvent( event ); | ||
} | ||
Unidragger.prototype.pointerDown = function( event, pointer ) { | ||
this._dragPointerDown( event, pointer ); | ||
// kludge to blur focused inputs in dragger | ||
var focused = document.activeElement; | ||
if ( focused && focused.blur && focused != this.element ) { | ||
if ( focused && focused.blur ) { | ||
focused.blur(); | ||
} | ||
// focus element, if its not an input | ||
if ( this.options.accessibility && targetNodeName != 'INPUT' ) { | ||
this.element.focus(); | ||
} | ||
// bind move and end events | ||
this._bindPostStartEvents({ | ||
// get proper events to match start event | ||
events: postStartEvents[ event.type ], | ||
// IE8 needs to be bound to document | ||
node: event.preventDefault ? window : document | ||
}); | ||
this.pointerDown( event, pointer ); | ||
}; | ||
Unidragger.prototype.pointerDown = function( event, pointer ) { | ||
this._bindPostStartEvents( event ); | ||
this.emitEvent( 'pointerDown', [ this, event, pointer ] ); | ||
}; | ||
// ----- bind/unbind ----- // | ||
// base pointer down logic | ||
Unidragger.prototype._dragPointerDown = function( event, pointer ) { | ||
// track to see when dragging starts | ||
this.pointerDownPoint = Unipointer.getPointerPoint( pointer ); | ||
Unidragger.prototype._bindPostStartEvents = function( args ) { | ||
for ( var i=0, len = args.events.length; i < len; i++ ) { | ||
var event = args.events[i]; | ||
eventie.bind( args.node, event, this ); | ||
var targetNodeName = event.target.nodeName; | ||
// HACK iOS, allow clicks on buttons, inputs, and links | ||
var isTouchstartNode = event.type == 'touchstart' && allowTouchstartNodes[ targetNodeName ]; | ||
// do not prevent default on touchstart nodes or <select> | ||
if ( !isTouchstartNode && targetNodeName != 'SELECT' ) { | ||
preventDefaultEvent( event ); | ||
} | ||
// save these arguments | ||
this._boundPointerEvents = args; | ||
}; | ||
Unidragger.prototype._unbindPostStartEvents = function() { | ||
var args = this._boundPointerEvents; | ||
// IE8 can trigger dragEnd twice, check for _boundEvents | ||
if ( !args || !args.events ) { | ||
return; | ||
} | ||
for ( var i=0, len = args.events.length; i < len; i++ ) { | ||
var event = args.events[i]; | ||
eventie.unbind( args.node, event, this ); | ||
} | ||
delete this._boundPointerEvents; | ||
}; | ||
// ----- move event ----- // | ||
Unidragger.prototype.onmousemove = function( event ) { | ||
this._pointerMove( event, event ); | ||
}; | ||
Unidragger.prototype.onMSPointerMove = | ||
Unidragger.prototype.onpointermove = function( event ) { | ||
if ( event.pointerId == this.pointerIdentifier ) { | ||
this._pointerMove( event, event ); | ||
} | ||
}; | ||
Unidragger.prototype.ontouchmove = function( event ) { | ||
var touch = this.getTouch( event.changedTouches ); | ||
if ( touch ) { | ||
this._pointerMove( event, touch ); | ||
} | ||
}; | ||
var hasDragStartedDefault = Unidragger.hasDragStartedDefault = function( moveVector ) { | ||
return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3; | ||
}; | ||
/** | ||
@@ -304,4 +189,11 @@ * drag move | ||
*/ | ||
Unidragger.prototype._pointerMove = function( event, pointer ) { | ||
var movePoint = Unidragger.getPointerPoint( pointer ); | ||
Unidragger.prototype.pointerMove = function( event, pointer ) { | ||
var moveVector = this._dragPointerMove( event, pointer ); | ||
this.emitEvent( 'pointerMove', [ this, event, pointer, moveVector ] ); | ||
this._dragMove( event, pointer, moveVector ); | ||
}; | ||
// base pointer move logic | ||
Unidragger.prototype._dragPointerMove = function( event, pointer ) { | ||
var movePoint = Unipointer.getPointerPoint( pointer ); | ||
var moveVector = { | ||
@@ -311,50 +203,28 @@ x: movePoint.x - this.pointerDownPoint.x, | ||
}; | ||
// function to check if pointer has moved far enough to start drag | ||
var hasDragStarted = this.hasDragStarted || hasDragStartedDefault; | ||
// start drag | ||
if ( !this.isDragging && hasDragStarted( moveVector ) ) { | ||
// start drag if pointer has moved far enough to start drag | ||
if ( !this.isDragging && this.hasDragStarted( moveVector ) ) { | ||
this._dragStart( event, pointer ); | ||
} | ||
this.pointerMove( event, pointer, moveVector ); | ||
this._dragMove( event, pointer, moveVector ); | ||
return moveVector; | ||
}; | ||
Unidragger.prototype.pointerMove = function( event, pointer, moveVector ) { | ||
this.emitEvent( 'pointerMove', [ this, event, pointer, moveVector ] ); | ||
// condition if pointer has moved far enough to start drag | ||
Unidragger.prototype.hasDragStarted = function( moveVector ) { | ||
return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3; | ||
}; | ||
// ----- end event ----- // | ||
Unidragger.prototype.onmouseup = function( event ) { | ||
this._pointerUp( event, event ); | ||
}; | ||
Unidragger.prototype.onMSPointerUp = | ||
Unidragger.prototype.onpointerup = function( event ) { | ||
if ( event.pointerId == this.pointerIdentifier ) { | ||
this._pointerUp( event, event ); | ||
} | ||
}; | ||
Unidragger.prototype.ontouchend = function( event ) { | ||
var touch = this.getTouch( event.changedTouches ); | ||
if ( touch ) { | ||
this._pointerUp( event, touch ); | ||
} | ||
}; | ||
/** | ||
* drag end | ||
* pointer up | ||
* @param {Event} event | ||
* @param {Event or Touch} pointer | ||
*/ | ||
Unidragger.prototype._pointerUp = function( event, pointer ) { | ||
this.isPointerDown = false; | ||
Unidragger.prototype.pointerUp = function( event, pointer ) { | ||
this.emitEvent( 'pointerUp', [ this, event, pointer ] ); | ||
this._dragPointerUp( event, pointer ); | ||
}; | ||
delete this.pointerIdentifier; | ||
// remove events | ||
this._unbindPostStartEvents(); | ||
Unidragger.prototype._dragPointerUp = function( event, pointer ) { | ||
if ( this.isDragging ) { | ||
@@ -366,26 +236,4 @@ this._dragEnd( event, pointer ); | ||
} | ||
this.pointerUp( event, pointer ); | ||
}; | ||
Unidragger.prototype.pointerUp = function( event, pointer ) { | ||
this.emitEvent( 'pointerUp', [ this, event, pointer ] ); | ||
}; | ||
// ----- cancel event ----- // | ||
// coerce to end event | ||
Unidragger.prototype.onMSPointerCancel = | ||
Unidragger.prototype.onpointercancel = function( event ) { | ||
if ( event.pointerId == this.pointerIdentifier ) { | ||
this._pointerUp( event, event ); | ||
} | ||
}; | ||
Unidragger.prototype.ontouchcancel = function( event ) { | ||
var touch = this.getTouch( event.changedTouches ); | ||
this._pointerUp( event, touch ); | ||
}; | ||
// -------------------------- drag -------------------------- // | ||
@@ -473,4 +321,6 @@ | ||
Unidragger.getPointerPoint = Unipointer.getPointerPoint; | ||
return Unidragger; | ||
})); |
58
10625
290
+ Addedunipointer@~0.1.0
+ Addedunipointer@0.1.0(transitive)
+ Addedwolfy87-eventemitter@4.2.11(transitive)
- Removedeventie@^1.0.6