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

📄 dragdrop.js

📁 RubyonRailsC.zip ruby on rails的源码
💻 JS
📖 第 1 页 / 共 2 页
字号:
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)// // See scriptaculous.js for full license./*--------------------------------------------------------------------------*/var Droppables = {  drops: [],  remove: function(element) {    this.drops = this.drops.reject(function(d) { return d.element==$(element) });  },  add: function(element) {    element = $(element);    var options = Object.extend({      greedy:     true,      hoverclass: null      }, arguments[1] || {});    // cache containers    if(options.containment) {      options._containers = [];      var containment = options.containment;      if((typeof containment == 'object') &&         (containment.constructor == Array)) {        containment.each( function(c) { options._containers.push($(c)) });      } else {        options._containers.push($(containment));      }    }        if(options.accept) options.accept = [options.accept].flatten();    Element.makePositioned(element); // fix IE    options.element = element;    this.drops.push(options);  },  isContained: function(element, drop) {    var parentNode = element.parentNode;    return drop._containers.detect(function(c) { return parentNode == c });  },  isAffected: function(point, element, drop) {    return (      (drop.element!=element) &&      ((!drop._containers) ||        this.isContained(element, drop)) &&      ((!drop.accept) ||        (Element.classNames(element).detect(           function(v) { return drop.accept.include(v) } ) )) &&      Position.within(drop.element, point[0], point[1]) );  },  deactivate: function(drop) {    if(drop.hoverclass)      Element.removeClassName(drop.element, drop.hoverclass);    this.last_active = null;  },  activate: function(drop) {    if(drop.hoverclass)      Element.addClassName(drop.element, drop.hoverclass);    this.last_active = drop;  },  show: function(point, element) {    if(!this.drops.length) return;        if(this.last_active) this.deactivate(this.last_active);    this.drops.each( function(drop) {      if(Droppables.isAffected(point, element, drop)) {        if(drop.onHover)           drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));        if(drop.greedy) {           Droppables.activate(drop);          throw $break;        }      }    });  },  fire: function(event, element) {    if(!this.last_active) return;    Position.prepare();    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))      if (this.last_active.onDrop)         this.last_active.onDrop(element, this.last_active.element, event);  },  reset: function() {    if(this.last_active)      this.deactivate(this.last_active);  }}var Draggables = {  drags: [],  observers: [],    register: function(draggable) {    if(this.drags.length == 0) {      this.eventMouseUp   = this.endDrag.bindAsEventListener(this);      this.eventMouseMove = this.updateDrag.bindAsEventListener(this);      this.eventKeypress  = this.keyPress.bindAsEventListener(this);            Event.observe(document, "mouseup", this.eventMouseUp);      Event.observe(document, "mousemove", this.eventMouseMove);      Event.observe(document, "keypress", this.eventKeypress);    }    this.drags.push(draggable);  },    unregister: function(draggable) {    this.drags = this.drags.reject(function(d) { return d==draggable });    if(this.drags.length == 0) {      Event.stopObserving(document, "mouseup", this.eventMouseUp);      Event.stopObserving(document, "mousemove", this.eventMouseMove);      Event.stopObserving(document, "keypress", this.eventKeypress);    }  },    activate: function(draggable) {    window.focus(); // allows keypress events if window isn't currently focused, fails for Safari    this.activeDraggable = draggable;  },    deactivate: function() {    this.activeDraggable = null;  },    updateDrag: function(event) {    if(!this.activeDraggable) return;    var pointer = [Event.pointerX(event), Event.pointerY(event)];    // Mozilla-based browsers fire successive mousemove events with    // the same coordinates, prevent needless redrawing (moz bug?)    if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;    this._lastPointer = pointer;    this.activeDraggable.updateDrag(event, pointer);  },    endDrag: function(event) {    if(!this.activeDraggable) return;    this._lastPointer = null;    this.activeDraggable.endDrag(event);    this.activeDraggable = null;  },    keyPress: function(event) {    if(this.activeDraggable)      this.activeDraggable.keyPress(event);  },    addObserver: function(observer) {    this.observers.push(observer);    this._cacheObserverCallbacks();  },    removeObserver: function(element) {  // element instead of observer fixes mem leaks    this.observers = this.observers.reject( function(o) { return o.element==element });    this._cacheObserverCallbacks();  },    notify: function(eventName, draggable, event) {  // 'onStart', 'onEnd', 'onDrag'    if(this[eventName+'Count'] > 0)      this.observers.each( function(o) {        if(o[eventName]) o[eventName](eventName, draggable, event);      });  },    _cacheObserverCallbacks: function() {    ['onStart','onEnd','onDrag'].each( function(eventName) {      Draggables[eventName+'Count'] = Draggables.observers.select(        function(o) { return o[eventName]; }      ).length;    });  }}/*--------------------------------------------------------------------------*/var Draggable = Class.create();Draggable.prototype = {  initialize: function(element) {    var options = Object.extend({      handle: false,      starteffect: function(element) {         new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7});       },      reverteffect: function(element, top_offset, left_offset) {        var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;        element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});      },      endeffect: function(element) {         new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0});       },      zindex: 1000,      revert: false,      scroll: false,      scrollSensitivity: 20,      scrollSpeed: 15,      snap: false   // false, or xy or [x,y] or function(x,y){ return [x,y] }    }, arguments[1] || {});    this.element = $(element);        if(options.handle && (typeof options.handle == 'string'))      this.handle = Element.childrenWithClassName(this.element, options.handle, true)[0];      if(!this.handle) this.handle = $(options.handle);    if(!this.handle) this.handle = this.element;        if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML)      options.scroll = $(options.scroll);    Element.makePositioned(this.element); // fix IE        this.delta    = this.currentDelta();    this.options  = options;    this.dragging = false;       this.eventMouseDown = this.initDrag.bindAsEventListener(this);    Event.observe(this.handle, "mousedown", this.eventMouseDown);        Draggables.register(this);  },    destroy: function() {    Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);    Draggables.unregister(this);  },    currentDelta: function() {    return([      parseInt(Element.getStyle(this.element,'left') || '0'),      parseInt(Element.getStyle(this.element,'top') || '0')]);  },    initDrag: function(event) {    if(Event.isLeftClick(event)) {          // abort on form elements, fixes a Firefox issue      var src = Event.element(event);      if(src.tagName && (        src.tagName=='INPUT' ||        src.tagName=='SELECT' ||        src.tagName=='OPTION' ||        src.tagName=='BUTTON' ||        src.tagName=='TEXTAREA')) return;              if(this.element._revert) {        this.element._revert.cancel();        this.element._revert = null;      }            var pointer = [Event.pointerX(event), Event.pointerY(event)];      var pos     = Position.cumulativeOffset(this.element);      this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });            Draggables.activate(this);      Event.stop(event);    }  },    startDrag: function(event) {    this.dragging = true;        if(this.options.zindex) {      this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);      this.element.style.zIndex = this.options.zindex;    }        if(this.options.ghosting) {      this._clone = this.element.cloneNode(true);      Position.absolutize(this.element);      this.element.parentNode.insertBefore(this._clone, this.element);    }        if(this.options.scroll) {      if (this.options.scroll == window) {        var where = this._getWindowScroll(this.options.scroll);        this.originalScrollLeft = where.left;        this.originalScrollTop = where.top;      } else {        this.originalScrollLeft = this.options.scroll.scrollLeft;        this.originalScrollTop = this.options.scroll.scrollTop;      }    }        Draggables.notify('onStart', this, event);    if(this.options.starteffect) this.options.starteffect(this.element);  },    updateDrag: function(event, pointer) {    if(!this.dragging) this.startDrag(event);    Position.prepare();    Droppables.show(pointer, this.element);    Draggables.notify('onDrag', this, event);    this.draw(pointer);    if(this.options.change) this.options.change(this);        if(this.options.scroll) {      this.stopScrolling();            var p;      if (this.options.scroll == window) {        with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }      } else {        p = Position.page(this.options.scroll);        p[0] += this.options.scroll.scrollLeft;        p[1] += this.options.scroll.scrollTop;        p.push(p[0]+this.options.scroll.offsetWidth);        p.push(p[1]+this.options.scroll.offsetHeight);      }      var speed = [0,0];      if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);      if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);      if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);      if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);      this.startScrolling(speed);    }        // fix AppleWebKit rendering    if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);        Event.stop(event);  },    finishDrag: function(event, success) {    this.dragging = false;    if(this.options.ghosting) {      Position.relativize(this.element);      Element.remove(this._clone);      this._clone = null;    }    if(success) Droppables.fire(event, this.element);    Draggables.notify('onEnd', this, event);    var revert = this.options.revert;    if(revert && typeof revert == 'function') revert = revert(this.element);        var d = this.currentDelta();    if(revert && this.options.reverteffect) {      this.options.reverteffect(this.element,         d[1]-this.delta[1], d[0]-this.delta[0]);    } else {      this.delta = d;    }    if(this.options.zindex)      this.element.style.zIndex = this.originalZ;    if(this.options.endeffect)       this.options.endeffect(this.element);    Draggables.deactivate(this);    Droppables.reset();  },    keyPress: function(event) {

⌨️ 快捷键说明

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