📄 dragdrop.js
字号:
if (!tickMap[i]) {
this.xTicks[this.xTicks.length] = i;
tickMap[i] = true;
}
}
this.xTicks.sort(this.DDM.numericSort) ;
},
/**
* Create the array of vertical tick marks if an interval was specified in
* setYConstraint().
*
* @private
*/
setYTicks: function(iStartY, iTickSize) {
this.yTicks = [];
this.yTickSize = iTickSize;
var tickMap = {};
for (var i = this.initPageY; i >= this.minY; i = i - iTickSize) {
if (!tickMap[i]) {
this.yTicks[this.yTicks.length] = i;
tickMap[i] = true;
}
}
for (i = this.initPageY; i <= this.maxY; i = i + iTickSize) {
if (!tickMap[i]) {
this.yTicks[this.yTicks.length] = i;
tickMap[i] = true;
}
}
this.yTicks.sort(this.DDM.numericSort) ;
},
/**
* By default, the element can be dragged any place on the screen. Use
* this method to limit the horizontal travel of the element. Pass in
* 0,0 for the parameters if you want to lock the drag to the y axis.
*
* @param {int} iLeft the number of pixels the element can move to the left
* @param {int} iRight the number of pixels the element can move to the
* right
* @param {int} iTickSize optional parameter for specifying that the
* element
* should move iTickSize pixels at a time.
*/
setXConstraint: function(iLeft, iRight, iTickSize) {
this.leftConstraint = iLeft;
this.rightConstraint = iRight;
this.minX = this.initPageX - iLeft;
this.maxX = this.initPageX + iRight;
if (iTickSize) { this.setXTicks(this.initPageX, iTickSize); }
this.constrainX = true;
},
/**
* Clears any constraints applied to this instance. Also clears ticks
* since they can't exist independent of a constraint at this time.
*/
clearConstraints: function() {
this.constrainX = false;
this.constrainY = false;
this.clearTicks();
},
/**
* Clears any tick interval defined for this instance
*/
clearTicks: function() {
this.xTicks = null;
this.yTicks = null;
this.xTickSize = 0;
this.yTickSize = 0;
},
/**
* By default, the element can be dragged any place on the screen. Set
* this to limit the vertical travel of the element. Pass in 0,0 for the
* parameters if you want to lock the drag to the x axis.
*
* @param {int} iUp the number of pixels the element can move up
* @param {int} iDown the number of pixels the element can move down
* @param {int} iTickSize optional parameter for specifying that the
* element should move iTickSize pixels at a time.
*/
setYConstraint: function(iUp, iDown, iTickSize) {
this.topConstraint = iUp;
this.bottomConstraint = iDown;
this.minY = this.initPageY - iUp;
this.maxY = this.initPageY + iDown;
if (iTickSize) { this.setYTicks(this.initPageY, iTickSize); }
this.constrainY = true;
},
/**
* resetConstraints must be called if you manually reposition a dd element.
* @param {boolean} maintainOffset
*/
resetConstraints: function() {
// Maintain offsets if necessary
if (this.initPageX || this.initPageX === 0) {
// figure out how much this thing has moved
var dx = (this.maintainOffset) ? this.lastPageX - this.initPageX : 0;
var dy = (this.maintainOffset) ? this.lastPageY - this.initPageY : 0;
this.setInitPosition(dx, dy);
// This is the first time we have detected the element's position
} else {
this.setInitPosition();
}
if (this.constrainX) {
this.setXConstraint( this.leftConstraint,
this.rightConstraint,
this.xTickSize );
}
if (this.constrainY) {
this.setYConstraint( this.topConstraint,
this.bottomConstraint,
this.yTickSize );
}
},
/**
* Normally the drag element is moved pixel by pixel, but we can specify
* that it move a number of pixels at a time. This method resolves the
* location when we have it set up like this.
*
* @param {int} val where we want to place the object
* @param {int[]} tickArray sorted array of valid points
* @return {int} the closest tick
* @private
*/
getTick: function(val, tickArray) {
if (!tickArray) {
// If tick interval is not defined, it is effectively 1 pixel,
// so we return the value passed to us.
return val;
} else if (tickArray[0] >= val) {
// The value is lower than the first tick, so we return the first
// tick.
return tickArray[0];
} else {
for (var i=0, len=tickArray.length; i<len; ++i) {
var next = i + 1;
if (tickArray[next] && tickArray[next] >= val) {
var diff1 = val - tickArray[i];
var diff2 = tickArray[next] - val;
return (diff2 > diff1) ? tickArray[i] : tickArray[next];
}
}
// The value is larger than the last tick, so we return the last
// tick.
return tickArray[tickArray.length - 1];
}
},
/**
* toString method
* @return {string} string representation of the dd obj
*/
toString: function() {
return ("DragDrop " + this.id);
}
};
// Only load the library once. Rewriting the manager class would orphan
// existing drag and drop instances.
if (!YAHOO.util.DragDropMgr) {
/**
* Handles the element interaction for all DragDrop items in the
* window. Generally, you will not call this class directly, but it does
* have helper methods that could be useful in your DragDrop
* implementations. This class should not be instantiated; all methods
* are are static.
*
* @constructor
*/
YAHOO.util.DragDropMgr = new function() {
/**
* Two dimensional Array of registered DragDrop objects. The first
* dimension is the DragDrop item group, the second the DragDrop
* object.
*
* @type {string: string}
* @private
*/
this.ids = {};
/**
* Array of element ids defined as drag handles. Used to determine
* if the element that generated the mousedown event is actually the
* handle and not the html element itself.
*
* @type {string: string}
* @private
*/
this.handleIds = {};
/**
* the DragDrop object that is currently being dragged
*
* @type DragDrop
* @private
**/
this.dragCurrent = null;
/**
* the DragDrop object(s) that are being hovered over
*
* @type Array
* @private
*/
this.dragOvers = {};
/**
* @private
*/
/**
* the X distance between the cursor and the object being dragged
*
* @type int
* @private
*/
this.deltaX = 0;
/**
* the Y distance between the cursor and the object being dragged
*
* @type int
* @private
*/
this.deltaY = 0;
/**
* Flag to determine if we should prevent the default behavior of the
* events we define. By default this is true, but this can be set to
* false if you need the default behavior (not recommended)
*
* @type boolean
*/
this.preventDefault = true;
/**
* Flag to determine if we should stop the propagation of the events
* we generate. This is true by default but you may want to set it to
* false if the html element contains other features that require the
* mouse click.
*
* @type boolean
*/
this.stopPropagation = true;
/**
* @private
*/
this.initalized = false;
/**
* All drag and drop can be disabled.
*
* @private
*/
this.locked = false;
/**
* Called the first time an element is registered.
*
* @private
*/
this.init = function() {
this.initialized = true;
};
/**
* In point mode, drag and drop interaction is defined by the
* location of the cursor during the drag/drop
* @type int
*/
this.POINT = 0;
/**
* In intersect mode, drag and drop interactio nis defined by the
* overlap of two or more drag and drop objects.
* @type int
*/
this.INTERSECT = 1;
/**
* The current drag and drop mode. Default it point mode
* @type int
*/
this.mode = this.POINT;
/**
* Runs method on all drag and drop objects
* @private
*/
this._execOnAll = function(sMethod, args) {
for (var i in this.ids) {
for (var j in this.ids[i]) {
var oDD = this.ids[i][j];
if (! this.isTypeOfDD(oDD)) {
continue;
}
oDD[sMethod].apply(oDD, args);
}
}
};
/**
* Drag and drop initialization. Sets up the global event handlers
* @private
*/
this._onLoad = function() {
this.init();
var EU = YAHOO.util.Event;
EU.on(document, "mouseup", this.handleMouseUp, this, true);
EU.on(document, "mousemove", this.handleMouseMove, this, true);
EU.on(window, "unload", this._onUnload, this, true);
EU.on(window, "resize", this._onResize, this, true);
// EU.on(window, "mouseout", this._test);
};
/**
* Reset constraints on all drag and drop objs
* @private
*/
this._onResize = function(e) {
this._execOnAll("resetConstraints", []);
};
/**
* Lock all drag and drop functionality
*/
this.lock = function() { this.locked = true; };
/**
* Unlock all drag and drop functionality
*/
this.unlock = function() { this.locked = false; };
/**
* Is drag and drop locked?
*
* @return {boolean} True if drag and drop is locked, false otherwise.
*/
this.isLocked = function() { return this.locked; };
/**
* Location cache that is set for all drag drop objects when a drag is
* initiated, cleared when the drag is finished.
*
* @private
*/
this.locationCache = {};
/**
* Set useCache to false if you want to force object the lookup of each
* drag and drop linked element constantly during a drag.
* @type boolean
*/
this.useCache = true;
/**
* The number of pixels that the mouse needs to move after the
* mousedown before the drag is initiated. Default=3;
* @type int
*/
this.clickPixelThresh = 3;
/**
* The number of milliseconds after the mousedown event to initiate the
* drag if we don't get a mouseup event. Default=1000
* @type int
*/
this.clickTimeThresh = 1000;
/**
* Flag that indicates that either the drag pixel threshold or the
* mousdown time threshold has been met
* @type boolean
* @private
*/
this.dragThreshMet = false;
/**
* Timeout used for the click time threshold
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -