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

📄 dragdrop.js

📁 这是linux下ssl vpn的实现程序
💻 JS
📖 第 1 页 / 共 2 页
字号:
    }



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

    if(event.keyCode!=Event.KEY_ESC) return;

    this.finishDrag(event, false);

    Event.stop(event);

  },

  

  endDrag: function(event) {

    if(!this.dragging) return;

    this.stopScrolling();

    this.finishDrag(event, true);

    Event.stop(event);

  },

  

  draw: function(point) {

    var pos = Position.cumulativeOffset(this.element);

    var d = this.currentDelta();

    pos[0] -= d[0]; pos[1] -= d[1];

    

    if(this.options.scroll) {

      pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;

      pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;

    }

    

    var p = [0,1].map(function(i){ 

      return (point[i]-pos[i]-this.offset[i]) 

    }.bind(this));

    

    if(this.options.snap) {

      if(typeof this.options.snap == 'function') {

        p = this.options.snap(p[0],p[1]);

      } else {

      if(this.options.snap instanceof Array) {

        p = p.map( function(v, i) {

          return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))

      } else {

        p = p.map( function(v) {

          return Math.round(v/this.options.snap)*this.options.snap }.bind(this))

      }

    }}

    

    var style = this.element.style;

    if((!this.options.constraint) || (this.options.constraint=='horizontal'))

      style.left = p[0] + "px";

    if((!this.options.constraint) || (this.options.constraint=='vertical'))

      style.top  = p[1] + "px";

    if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering

  },

  

  stopScrolling: function() {

    if(this.scrollInterval) {

      clearInterval(this.scrollInterval);

      this.scrollInterval = null;

    }

  },

  

  startScrolling: function(speed) {

    this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];

    this.lastScrolled = new Date();

    this.scrollInterval = setInterval(this.scroll.bind(this), 10);

  },

  

  scroll: function() {

    var current = new Date();

    var delta = current - this.lastScrolled;

    this.lastScrolled = current;

    this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;

    this.options.scroll.scrollTop  += this.scrollSpeed[1] * delta / 1000;

    

    Position.prepare();

    Droppables.show(Draggables._lastPointer, this.element);

    Draggables.notify('onDrag', this);

    this.draw(Draggables._lastPointer);    

    

    if(this.options.change) this.options.change(this);

  }

}



/*--------------------------------------------------------------------------*/



var SortableObserver = Class.create();

SortableObserver.prototype = {

  initialize: function(element, observer) {

    this.element   = $(element);

    this.observer  = observer;

    this.lastValue = Sortable.serialize(this.element);

  },

  

  onStart: function() {

    this.lastValue = Sortable.serialize(this.element);

  },

  

  onEnd: function() {

    Sortable.unmark();

    if(this.lastValue != Sortable.serialize(this.element))

      this.observer(this.element)

  }

}



var Sortable = {

  sortables: new Array(),

  

  options: function(element){

    element = $(element);

    return this.sortables.detect(function(s) { return s.element == element });

  },

  

  destroy: function(element){

    element = $(element);

    this.sortables.findAll(function(s) { return s.element == element }).each(function(s){

      Draggables.removeObserver(s.element);

      s.droppables.each(function(d){ Droppables.remove(d) });

      s.draggables.invoke('destroy');

    });

    this.sortables = this.sortables.reject(function(s) { return s.element == element });

  },

  

  create: function(element) {

    element = $(element);

    var options = Object.extend({ 

      element:     element,

      tag:         'li',       // assumes li children, override with tag: 'tagname'

      dropOnEmpty: false,

      tree:        false,      // fixme: unimplemented

      overlap:     'vertical', // one of 'vertical', 'horizontal'

      constraint:  'vertical', // one of 'vertical', 'horizontal', false

      containment: element,    // also takes array of elements (or id's); or false

      handle:      false,      // or a CSS class

      only:        false,

      hoverclass:  null,

      ghosting:    false,

      scroll:      false,

      format:      /^[^_]*_(.*)$/,

      onChange:    Prototype.emptyFunction,

      onUpdate:    Prototype.emptyFunction

    }, arguments[1] || {});



    // clear any old sortable with same element

    this.destroy(element);



    // build options for the draggables

    var options_for_draggable = {

      revert:      true,

      scroll:      options.scroll,

      ghosting:    options.ghosting,

      constraint:  options.constraint,

      handle:      options.handle };



    if(options.starteffect)

      options_for_draggable.starteffect = options.starteffect;



    if(options.reverteffect)

      options_for_draggable.reverteffect = options.reverteffect;

    else

      if(options.ghosting) options_for_draggable.reverteffect = function(element) {

        element.style.top  = 0;

        element.style.left = 0;

      };



    if(options.endeffect)

      options_for_draggable.endeffect = options.endeffect;



    if(options.zindex)

      options_for_draggable.zindex = options.zindex;



    // build options for the droppables  

    var options_for_droppable = {

      overlap:     options.overlap,

      containment: options.containment,

      hoverclass:  options.hoverclass,

      onHover:     Sortable.onHover,

      greedy:      !options.dropOnEmpty

    }



    // fix for gecko engine

    Element.cleanWhitespace(element); 



    options.draggables = [];

    options.droppables = [];



    // make it so



    // drop on empty handling

    if(options.dropOnEmpty) {

      Droppables.add(element,

        {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false});

      options.droppables.push(element);

    }



    (this.findElements(element, options) || []).each( function(e) {

      // handles are per-draggable

      var handle = options.handle ? 

        Element.childrenWithClassName(e, options.handle)[0] : e;    

      options.draggables.push(

        new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));

      Droppables.add(e, options_for_droppable);

      options.droppables.push(e);      

    });



    // keep reference

    this.sortables.push(options);



    // for onupdate

    Draggables.addObserver(new SortableObserver(element, options.onUpdate));



  },



  // return all suitable-for-sortable elements in a guaranteed order

  findElements: function(element, options) {

    if(!element.hasChildNodes()) return null;

    var elements = [];

    $A(element.childNodes).each( function(e) {

      if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() &&

        (!options.only || (Element.hasClassName(e, options.only))))

          elements.push(e);

      if(options.tree) {

        var grandchildren = this.findElements(e, options);

        if(grandchildren) elements.push(grandchildren);

      }

    });



    return (elements.length>0 ? elements.flatten() : null);

  },



  onHover: function(element, dropon, overlap) {

    if(overlap>0.5) {

      Sortable.mark(dropon, 'before');

      if(dropon.previousSibling != element) {

        var oldParentNode = element.parentNode;

        element.style.visibility = "hidden"; // fix gecko rendering

        dropon.parentNode.insertBefore(element, dropon);

        if(dropon.parentNode!=oldParentNode) 

          Sortable.options(oldParentNode).onChange(element);

        Sortable.options(dropon.parentNode).onChange(element);

      }

    } else {

      Sortable.mark(dropon, 'after');

      var nextElement = dropon.nextSibling || null;

      if(nextElement != element) {

        var oldParentNode = element.parentNode;

        element.style.visibility = "hidden"; // fix gecko rendering

        dropon.parentNode.insertBefore(element, nextElement);

        if(dropon.parentNode!=oldParentNode) 

          Sortable.options(oldParentNode).onChange(element);

        Sortable.options(dropon.parentNode).onChange(element);

      }

    }

  },



  onEmptyHover: function(element, dropon) {

    if(element.parentNode!=dropon) {

      var oldParentNode = element.parentNode;

      dropon.appendChild(element);

      Sortable.options(oldParentNode).onChange(element);

      Sortable.options(dropon).onChange(element);

    }

  },



  unmark: function() {

    if(Sortable._marker) Element.hide(Sortable._marker);

  },



  mark: function(dropon, position) {

    // mark on ghosting only

    var sortable = Sortable.options(dropon.parentNode);

    if(sortable && !sortable.ghosting) return; 



    if(!Sortable._marker) {

      Sortable._marker = $('dropmarker') || document.createElement('DIV');

      Element.hide(Sortable._marker);

      Element.addClassName(Sortable._marker, 'dropmarker');

      Sortable._marker.style.position = 'absolute';

      document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);

    }    

    var offsets = Position.cumulativeOffset(dropon);

    Sortable._marker.style.left = offsets[0] + 'px';

    Sortable._marker.style.top = offsets[1] + 'px';

    

    if(position=='after')

      if(sortable.overlap == 'horizontal') 

        Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';

      else

        Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';

    

    Element.show(Sortable._marker);

  },



  sequence: function(element) {

    element = $(element);

    var options = Object.extend(this.options(element), arguments[1] || {});

    

    return $(this.findElements(element, options) || []).map( function(item) {

      return item.id.match(options.format) ? item.id.match(options.format)[1] : '';

    });

  },



  setSequence: function(element, new_sequence) {

    element = $(element);

    var options = Object.extend(this.options(element), arguments[2] || {});

    

    var nodeMap = {};

    this.findElements(element, options).each( function(n) {

        if (n.id.match(options.format))

            nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];

        n.parentNode.removeChild(n);

    });

   

    new_sequence.each(function(ident) {

        var n = nodeMap[ident];

        if (n) {

            n[1].appendChild(n[0]);

            delete nodeMap[ident];

        }

    });

  },



  serialize: function(element) {

    element = $(element);

    var name = encodeURIComponent(

      (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);

    return Sortable.sequence(element, arguments[1]).map( function(item) {

      return name + "[]=" + encodeURIComponent(item);

    }).join('&');

  }

}

⌨️ 快捷键说明

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