⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dragdrop.js

📁 SugarCRM5.1 开源PHP客户关系管理系统
💻 JS
📖 第 1 页 / 共 5 页
字号:
            if (! this.dragCurrent) {                return;            }            clearTimeout(this.clickTimeout);            if (this.dragThreshMet) {                this.fireEvents(e, true);            } else {            }            this.stopDrag(e);            this.stopEvent(e);        },        /**         * Utility to stop event propagation and event default, if these          * features are turned on.         * @method stopEvent         * @param {Event} e the event as returned by this.getEvent()         * @static         */        stopEvent: function(e) {            if (this.stopPropagation) {                YAHOO.util.Event.stopPropagation(e);            }            if (this.preventDefault) {                YAHOO.util.Event.preventDefault(e);            }        },        /**          * Internal function to clean up event handlers after the drag          * operation is complete         * @method stopDrag         * @param {Event} e the event         * @private         * @static         */        stopDrag: function(e) {            // Fire the drag end event for the item that was dragged            if (this.dragCurrent) {                if (this.dragThreshMet) {                    this.dragCurrent.b4EndDrag(e);                    this.dragCurrent.endDrag(e);                }                this.dragCurrent.onMouseUp(e);            }            this.dragCurrent = null;            this.dragOvers = {};        },        /**          * Internal function to handle the mousemove event.  Will be invoked          * from the context of the html element.         *         * @TODO figure out what we can do about mouse events lost when the          * user drags objects beyond the window boundary.  Currently we can          * detect this in internet explorer by verifying that the mouse is          * down during the mousemove event.  Firefox doesn't give us the          * button state on the mousemove event.         * @method handleMouseMove         * @param {Event} e the event         * @private         * @static         */        handleMouseMove: function(e) {            if (! this.dragCurrent) {                return true;            }            // var button = e.which || e.button;            // check for IE mouseup outside of page boundary            if (YAHOO.util.Event.isIE && !e.button) {                this.stopEvent(e);                return this.handleMouseUp(e);            }            if (!this.dragThreshMet) {                var diffX = Math.abs(this.startX - YAHOO.util.Event.getPageX(e));                var diffY = Math.abs(this.startY - YAHOO.util.Event.getPageY(e));                if (diffX > this.clickPixelThresh ||                             diffY > this.clickPixelThresh) {                    this.startDrag(this.startX, this.startY);                }            }            if (this.dragThreshMet) {                this.dragCurrent.b4Drag(e);                this.dragCurrent.onDrag(e);                this.fireEvents(e, false);            }            this.stopEvent(e);            return true;        },        /**         * Iterates over all of the DragDrop elements to find ones we are          * hovering over or dropping on         * @method fireEvents         * @param {Event} e the event         * @param {boolean} isDrop is this a drop op or a mouseover op?         * @private         * @static         */        fireEvents: function(e, isDrop) {            var dc = this.dragCurrent;            // If the user did the mouse up outside of the window, we could             // get here even though we have ended the drag.            if (!dc || dc.isLocked()) {                return;            }            var x = YAHOO.util.Event.getPageX(e);            var y = YAHOO.util.Event.getPageY(e);            var pt = new YAHOO.util.Point(x,y);            // cache the previous dragOver array            var oldOvers = [];            var outEvts   = [];            var overEvts  = [];            var dropEvts  = [];            var enterEvts = [];            // Check to see if the object(s) we were hovering over is no longer             // being hovered over so we can fire the onDragOut event            for (var i in this.dragOvers) {                var ddo = this.dragOvers[i];                if (! this.isTypeOfDD(ddo)) {                    continue;                }                if (! this.isOverTarget(pt, ddo, this.mode)) {                    outEvts.push( ddo );                }                oldOvers[i] = true;                delete this.dragOvers[i];            }            for (var sGroup in dc.groups) {                                if ("string" != typeof sGroup) {                    continue;                }                for (i in this.ids[sGroup]) {                    var oDD = this.ids[sGroup][i];                    if (! this.isTypeOfDD(oDD)) {                        continue;                    }                    if (oDD.isTarget && !oDD.isLocked() && oDD != dc) {                        if (this.isOverTarget(pt, oDD, this.mode)) {                            // look for drop interactions                            if (isDrop) {                                dropEvts.push( oDD );                            // look for drag enter and drag over interactions                            } else {                                // initial drag over: dragEnter fires                                if (!oldOvers[oDD.id]) {                                    enterEvts.push( oDD );                                // subsequent drag overs: dragOver fires                                } else {                                    overEvts.push( oDD );                                }                                this.dragOvers[oDD.id] = oDD;                            }                        }                    }                }            }            if (this.mode) {                if (outEvts.length) {                    dc.b4DragOut(e, outEvts);                    dc.onDragOut(e, outEvts);                }                if (enterEvts.length) {                    dc.onDragEnter(e, enterEvts);                }                if (overEvts.length) {                    dc.b4DragOver(e, overEvts);                    dc.onDragOver(e, overEvts);                }                if (dropEvts.length) {                    dc.b4DragDrop(e, dropEvts);                    dc.onDragDrop(e, dropEvts);                }            } else {                // fire dragout events                var len = 0;                for (i=0, len=outEvts.length; i<len; ++i) {                    dc.b4DragOut(e, outEvts[i].id);                    dc.onDragOut(e, outEvts[i].id);                }                                 // fire enter events                for (i=0,len=enterEvts.length; i<len; ++i) {                    // dc.b4DragEnter(e, oDD.id);                    dc.onDragEnter(e, enterEvts[i].id);                }                         // fire over events                for (i=0,len=overEvts.length; i<len; ++i) {                    dc.b4DragOver(e, overEvts[i].id);                    dc.onDragOver(e, overEvts[i].id);                }                // fire drop events                for (i=0, len=dropEvts.length; i<len; ++i) {                    dc.b4DragDrop(e, dropEvts[i].id);                    dc.onDragDrop(e, dropEvts[i].id);                }            }            // notify about a drop that did not find a target            if (isDrop && !dropEvts.length) {                dc.onInvalidDrop(e);            }        },        /**         * Helper function for getting the best match from the list of drag          * and drop objects returned by the drag and drop events when we are          * in INTERSECT mode.  It returns either the first object that the          * cursor is over, or the object that has the greatest overlap with          * the dragged element.         * @method getBestMatch         * @param  {DragDrop[]} dds The array of drag and drop objects          * targeted         * @return {DragDrop}       The best single match         * @static         */        getBestMatch: function(dds) {            var winner = null;            var len = dds.length;            if (len == 1) {                winner = dds[0];            } else {                // Loop through the targeted items                for (var i=0; i<len; ++i) {                    var dd = dds[i];                    // If the cursor is over the object, it wins.  If the                     // cursor is over multiple matches, the first one we come                    // to wins.                    if (this.mode == this.INTERSECT && dd.cursorIsOver) {                        winner = dd;                        break;                    // Otherwise the object with the most overlap wins                    } else {                        if (!winner || !winner.overlap || (dd.overlap &&                            winner.overlap.getArea() < dd.overlap.getArea())) {                            winner = dd;                        }                    }                }            }            return winner;        },        /**         * Refreshes the cache of the top-left and bottom-right points of the          * drag and drop objects in the specified group(s).  This is in the         * format that is stored in the drag and drop instance, so typical          * usage is:         * <code>         * YAHOO.util.DragDropMgr.refreshCache(ddinstance.groups);         * </code>         * Alternatively:         * <code>         * YAHOO.util.DragDropMgr.refreshCache({group1:true, group2:true});         * </code>         * @TODO this really should be an indexed array.  Alternatively this         * method could accept both.         * @method refreshCache         * @param {Object} groups an associative array of groups to refresh         * @static         */        refreshCache: function(groups) {            for (var sGroup in groups) {                if ("string" != typeof sGroup) {                    continue;                }                for (var i in this.ids[sGroup]) {                    var oDD = this.ids[sGroup][i];                    if (this.isTypeOfDD(oDD)) {                    // if (this.isTypeOfDD(oDD) && oDD.isTarget) {                        var loc = this.getLocation(oDD);                        if (loc) {                            this.locationCache[oDD.id] = loc;                        } else {                            delete this.locationCache[oDD.id];                            // this will unregister the drag and drop object if                            // the element is not in a usable state                            // oDD.unreg();                        }                    }                }            }        },        /**         * This checks to make sure an element exists and is in the DOM.  The         * main purpose is to handle cases where innerHTML is used to remove         * drag and drop objects from the DOM.  IE provides an 'unspecified         * error' when trying to access the offsetParent of such an element         * @method verifyEl         * @param {HTMLElement} el the element to check         * @return {boolean} true if the element looks usable         * @static         */        verifyEl: function(el) {            try {                if (el) {                    var parent = el.offsetParent;                    if (parent) {                        return true;                    }                }            } catch(e) {            }            return false;        },                /**         * Returns a Region object containing the drag and drop element's position         * and size, including the padding configured for it         * @method getLocation         * @param {DragDrop} oDD the drag and drop object to get the          *                       location for         * @return {YAHOO.util.Region} a Region object representing the total area         *                             the element occupies, including any padding         *                             the instance is configured for.         * @static         */        getLocation: function(oDD) {            if (! this.isTypeOfDD(oDD)) {                return null;            }            var el = oDD.getEl(), pos, x1, x2, y1, y2, t, r, b, l;            try {                pos= YAHOO.util.Dom.getXY(el);            } catch (e) { }            if (!pos) {                return null;            }            x1 = pos[0];            x2 = x1 + el.offsetWidth;            y1 = pos[1];            y2 = y1 + el.offsetHeight;            t = y1 - oDD.padding[0];            r = x2 + oDD.padding[1];            b = y2 + oDD.padding[2];            l = x1 - oDD.padding[3];            return new YAHOO.util.Region( t, r, b, l );        },        /**         * Checks the cursor location to see if it over the target         * @method isOverTarget         * @param {YAHOO.util.Point} pt The point to evaluate         * @param {DragDrop} oTarget the DragDrop object we are inspecting         * @return {boolean} true if the mouse is over the target         * @private         * @static         */        isOverTarget: function(pt, oTarget, intersect) {            // use cache if available            var loc = this.locationCache[oTarget.id];            if (!loc || !this.useCache) {                loc = this.getLocation(oTarget);                this.locationCache[oTarget.id] = loc;            }            if (!loc) {                return false;            }            oTarget.cursorIsOver = loc.contains( pt );           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -