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

📄 dragdrop.js

📁 RubyonRailsC.zip ruby on rails的源码
💻 JS
📖 第 1 页 / 共 2 页
字号:
      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) {    if(!event.keyCode==Event.KEY_ESC) return;    this.finishDrag(event, false);    Event.stop(event);  },    endDrag: function(event) {    if(!this.dragging) return;    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];        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  }}/*--------------------------------------------------------------------------*/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,      format:      null,      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,      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);  },  serialize: function(element) {    element = $(element);    var sortableOptions = this.options(element);    var options = Object.extend({      tag:  sortableOptions.tag,      only: sortableOptions.only,      name: element.id,      format: sortableOptions.format || /^[^_]*_(.*)$/    }, arguments[1] || {});    return $(this.findElements(element, options) || []).map( function(item) {      return (encodeURIComponent(options.name) + "[]=" +               encodeURIComponent(item.id.match(options.format) ? item.id.match(options.format)[1] : ''));    }).join("&");  }}

⌨️ 快捷键说明

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