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

📄 dragdrop.js

📁 这是linux下ssl vpn的实现程序
💻 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)[0];  

    if(!this.handle) this.handle = $(options.handle);

    if(!this.handle) this.handle = this.element;

    

    if(options.scroll) 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) {

      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) {

      //if(this.scrollInterval) this.scroll();

      this.stopScrolling();

      var 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;

⌨️ 快捷键说明

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