2010-09-16 23:32:55 +08:00
|
|
|
/*
|
|
|
|
* L.Draggable allows you to add dragging capabilities to any element. Supports mobile devices too.
|
|
|
|
*/
|
|
|
|
|
2010-09-16 21:05:55 +08:00
|
|
|
L.Draggable = L.Class.extend({
|
|
|
|
includes: L.Mixin.Events,
|
|
|
|
|
|
|
|
statics: {
|
|
|
|
START: L.Browser.mobileWebkit ? 'touchstart' : 'mousedown',
|
|
|
|
END: L.Browser.mobileWebkit ? 'touchend' : 'mouseup',
|
|
|
|
MOVE: L.Browser.mobileWebkit ? 'touchmove' : 'mousemove'
|
|
|
|
},
|
|
|
|
|
|
|
|
initialize: function(element, dragStartTarget) {
|
|
|
|
this._element = element;
|
|
|
|
this._dragStartTarget = dragStartTarget || element;
|
|
|
|
},
|
|
|
|
|
|
|
|
enable: function() {
|
|
|
|
if (this._enabled) { return; }
|
|
|
|
L.DomEvent.addListener(this._dragStartTarget, L.Draggable.START, this._onDown, this);
|
|
|
|
this._enabled = true;
|
|
|
|
},
|
|
|
|
|
|
|
|
disable: function() {
|
|
|
|
if (!this._enabled) { return; }
|
|
|
|
L.DomEvent.removeListener(this._dragStartTarget, L.Draggable.START, this._onDown);
|
|
|
|
this._enabled = false;
|
|
|
|
},
|
2011-03-22 01:09:43 +08:00
|
|
|
|
2010-09-16 21:05:55 +08:00
|
|
|
_onDown: function(e) {
|
2010-09-21 21:10:31 +08:00
|
|
|
if (e.shiftKey || ((e.which != 1) && (e.button != 1) && !e.touches)) { return; }
|
2010-09-16 21:05:55 +08:00
|
|
|
|
2010-09-16 23:32:55 +08:00
|
|
|
if (e.touches && e.touches.length > 1) { return; }
|
|
|
|
if (e.touches && e.touches.length == 1) { e = e.touches[0]; }
|
2010-09-16 21:05:55 +08:00
|
|
|
|
2010-12-16 01:55:57 +08:00
|
|
|
this._moved = false;
|
|
|
|
|
2011-03-22 01:09:43 +08:00
|
|
|
L.DomUtil.disableTextSelection();
|
2010-09-16 21:05:55 +08:00
|
|
|
this._setMovingCursor();
|
|
|
|
|
2011-06-16 23:52:37 +08:00
|
|
|
this._startPos = L.DomUtil.getPosition(this._element);
|
|
|
|
this._startPoint = new L.Point(e.clientX, e.clientY);
|
|
|
|
|
2010-09-16 21:05:55 +08:00
|
|
|
L.DomEvent.addListener(document, L.Draggable.MOVE, this._onMove, this);
|
|
|
|
L.DomEvent.addListener(document, L.Draggable.END, this._onUp, this);
|
2011-06-16 23:52:37 +08:00
|
|
|
|
|
|
|
if (!L.Browser.mobileWebkit || L.Browser.android) {
|
|
|
|
L.DomEvent.preventDefault(e);
|
|
|
|
}
|
|
|
|
if (L.Browser.android) {
|
|
|
|
this._simulateEvent(e);
|
|
|
|
}
|
2010-09-16 21:05:55 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
_onMove: function(e) {
|
2010-09-16 23:32:55 +08:00
|
|
|
if (e.touches && e.touches.length > 1) { return; }
|
|
|
|
if (e.touches && e.touches.length == 1) { e = e.touches[0]; }
|
2010-09-16 21:05:55 +08:00
|
|
|
|
2010-09-21 20:48:31 +08:00
|
|
|
if (!this._moved) {
|
2010-09-16 21:05:55 +08:00
|
|
|
this.fire('dragstart');
|
2010-09-21 20:48:31 +08:00
|
|
|
this._moved = true;
|
2010-09-16 21:05:55 +08:00
|
|
|
}
|
2011-06-16 23:52:37 +08:00
|
|
|
|
|
|
|
var newPoint = new L.Point(e.clientX, e.clientY);
|
|
|
|
this._newPos = this._startPos.add(newPoint).subtract(this._startPoint);
|
2011-06-17 05:24:13 +08:00
|
|
|
|
|
|
|
L.Util.requestAnimFrame(this._updatePosition, this);
|
2010-09-16 21:05:55 +08:00
|
|
|
|
|
|
|
this.fire('drag');
|
2011-06-16 23:52:37 +08:00
|
|
|
|
|
|
|
L.DomEvent.preventDefault(e);
|
|
|
|
|
|
|
|
if (L.Browser.android) {
|
|
|
|
this._simulateEvent(e);
|
|
|
|
}
|
2010-09-16 21:05:55 +08:00
|
|
|
},
|
|
|
|
|
2010-09-21 23:36:00 +08:00
|
|
|
_updatePosition: function() {
|
|
|
|
L.DomUtil.setPosition(this._element, this._newPos);
|
|
|
|
},
|
|
|
|
|
2011-06-16 23:52:37 +08:00
|
|
|
_onUp: function() {
|
2011-03-22 01:09:43 +08:00
|
|
|
L.DomUtil.enableTextSelection();
|
2010-09-16 21:05:55 +08:00
|
|
|
|
|
|
|
this._restoreCursor();
|
|
|
|
|
|
|
|
L.DomEvent.removeListener(document, L.Draggable.MOVE, this._onMove);
|
|
|
|
L.DomEvent.removeListener(document, L.Draggable.END, this._onUp);
|
|
|
|
|
2010-09-21 21:10:31 +08:00
|
|
|
if (this._moved) {
|
|
|
|
this.fire('dragend');
|
|
|
|
}
|
2011-06-16 23:52:37 +08:00
|
|
|
if (L.Browser.android) {
|
|
|
|
this._simulateEvent(e);
|
|
|
|
}
|
2010-09-16 21:05:55 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
_setMovingCursor: function() {
|
|
|
|
this._bodyCursor = document.body.style.cursor;
|
|
|
|
document.body.style.cursor = 'move';
|
|
|
|
},
|
|
|
|
|
|
|
|
_restoreCursor: function() {
|
|
|
|
document.body.style.cursor = this._bodyCursor;
|
2011-06-16 23:52:37 +08:00
|
|
|
},
|
|
|
|
|
|
|
|
_simulateEvent: function(e) {
|
|
|
|
var type;
|
|
|
|
|
|
|
|
switch(e.type) {
|
|
|
|
case 'touchstart': type = 'mousedown'; break;
|
|
|
|
case 'touchmove': type = 'mousemove'; break;
|
|
|
|
case 'touchend': type = 'mouseup';
|
|
|
|
}
|
|
|
|
|
|
|
|
var simulatedEvent = document.createEvent('MouseEvent');
|
|
|
|
simulatedEvent.initMouseEvent(type, true, true, window, 1,
|
|
|
|
e.screenX, e.screenY,
|
|
|
|
e.clientX, e.clientY, false,
|
|
|
|
false, false, false, 0, null);
|
|
|
|
|
|
|
|
e.target.dispatchEvent(simulatedEvent);
|
2010-09-16 21:05:55 +08:00
|
|
|
}
|
2011-05-31 02:30:18 +08:00
|
|
|
});
|