威尼斯www.9778.com-威尼斯正版官方网站

jquery实现的鼠标拖动排序Li或Table-Web前端之家

日期:2020-01-15编辑作者:编程人生

想要完结的效果和职能如下:

1、前端页面 复制代码 代码如下:

图片 1

广告管理

首先用 CSS 禁止使用第意气风发项的提升按键、最终豆蔻梢头项的下移按钮。

2、CSS样式 [css] view plaincopy在CODE上查看代码片派生到本身的代码片 body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,田野先生set,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;} table{border-collapse:collapse;border-spacing:0;} ol,ul{list-style:none;} a{color:#333;text-decoration:none;} a:hover{color:#f30;text-decoration:underline} body{font-family:"宋体",Arail,verdana;font-size:12px;line-height:1.5em;color:#222;background:#fff ;} .clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden;} .clearfix{display:block;} * html .clearfix{height:1%;} .clear{clear:both;} /*文件对齐*/ .tr{text-align:right} .tl{text-align:left;} .tc{text-align:center;} /*浮动*/ .fn-fl{float:left;} .fn-fr{float:right;} .m5{margin:5px;} .m10{margin:10px;} .mt5 { margin-top:5px;}.mr5 { margin-right:5px;}.mb5 { margin-bottom:5px;}.ml5 { margin-left:5px;} .mt10 { margin-top:10px;}.mr10 { margin-right:10px;}.mb10 { margin-bottom:10px;}.ml10 { margin-left:10px;} .p5{padding:5px;} .p10{padding:10px;} .pt5 { padding-top:5px;}.pr5 { padding-right:5px;}.pb5 { padding-bottom:5px;}.pl5 { padding-left:5px;} .pt10 { padding-top:10px;}.pr10 { padding-right:10px;}.pb10 { padding-bottom:10px;}.pl10 { padding-left:10px;} .mt30{margin-top:30px;}.mb30{margin-bottom:30px;} .pt30{padding-top:30px;}.pb30{padding-bottom:30px;} /*不行状态*/ input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] {background-color: #eee;cursor: not-allowed;box-shadow:none;opacity:0.5} /*下拉列表*/ select{border:1px solid #ccc;border-radius:3px;padding:1px 2px;} /*输入框*/ input:-moz-placeholder,textarea:-moz-placeholder {color: #999999;} input:-ms-input-placeholder,textarea:-ms-input-placeholder {color: #999999;} input::-webkit-input-placeholder,textarea::-webkit-input-placeholder {color: #999999;} .txt,textarea,input[type="text"], input[type="password"] {border: 1px solid #ccc;box-shadow: 0 1px 1px rgba inset;transition: border 0.2s linear 0s, box-shadow 0.2s linear 0s;border-radius:3px;padding:2px 3px;} .txt:focus,textarea:focus,input[type="text"]:focus, input[type="password"]:focus {border: 1px solid #2C5193;box-shadow: 0 1px 1px rgba inset, 0 0 8px rgba;} .txta{font-size:12px;line-height:18px;} .txt20{width:20px;} .txt30{width:30px;} .txt50{width:50px;} .txt75{width:75px;} .txt85{width:85px;} .txt100{width:100px;} .txt125{width:125px;} .txt150{width:150px;} .txt175{width:175px;} .txt200{width:200px;} .txt250{width:250px;} .txt280{width:280px;} .txt300{width:300px;} .txt350{width:350px;} .txt400{width:400px;} /*正式表格*/ .fn-table{width:100%;} .fn-table>tbody>tr>td{padding:3px;background:#fff;border:1px solid #CEDCED;} .fn-table>tbody>tr>th{background:#E3F5FF;padding:2px;border:1px solid #CEDCED;font-weight:bold;} .fn-table-space>tbody>tr:nth-child>td{background:#efefef;} /*细线表格*/ .fn-table-line>tbody>tr>td{} /*鼠标hover表格*/ .fn-table-mouse>tbody>tr:nth-child>td{background:#efefef;} .fn-table tr.on>tbody>tr>td,.fn-table-mouse>tbody>tr:hover>td{background:#FCF8E3;} /*功能表格*/ .fn-table-function>tbody>tr>td:nth-child{background:#E3F5FF;text-align:right;font-weight:bold;} .fn-table-function>tbody>tr>td:first-child{background:#E3F5FF;text-align:right;font-weight:bold;} /*干净表格*/ .fn-table-clear{} .fn-table-clear>tbody>tr>td{padding:3px;background:#fff;border:none;} .fn-table-clear>tbody>tr>th{background:#E3F5FF;padding:3px;border:none;} /*iframe 头部样式,仅后台部分案例*/ .fn-iframe-hd{padding:2px 5px;background:#2C5193;margin-bottom:30px;line-height:22px;height:22px;color:#fff;position:fixed;left:0;top:0;width:100%;} .fn-iframe-hd .close{background:url(/Manager/Themes/images/icons/closed.png) no-repeat center center;float:right;width:14px;height:13px;cursor:pointer;padding:4px 5px;margin-right:10px;} .fn-iframe-hd .close:hover{opacity:0.8;} .fn-iframe-hd .tt{float:left;font-weight:bold;} /*标准Tab选项卡*/ .fn-tab .hd li{float:left;margin-right:2px;padding:2px 5px;border:1px solid #2C5193;border-radius:5px 5px 0 0;cursor:pointer;background:#2C5193;color:#fff;} .fn-tab .hd li.on{background:#4B8AF9;color:#fff;border:1px solid #4B8AF9;border-bottom:0;} .fn-tab .bd{border:1px solid #ddd;padding:3px;margin-top:-1px;} .fn-tab .bd div.item{display:none;} .fn-tab .bd div.on{display:block;} /*搜索框*/ .fn-searchbar{border:1px solid #CEDCED;padding:2px;border-radius:3px;} .fn-searchbar input,.fn-searchbar select{vertical-align:middle;} /*分页*/ .fn-pager{background:#E3F5FF;border:1px solid #CEDCED;margin:0 0 5px;border-top:0;} .fn-pager div{line-height:26px;white-space:nowrap;word-break:break-all;} .fn-pager input{margin-left:5px;} .fn-pager a{border:1px solid #E3F5FF;padding:3px 5px;} .fn-pager span.on{background:#2C5193;border:1px solid #2C5193;color:#fff;padding:3px 5px;font-weight:bold;} .fn-pager a:hover{background:#2C5193;border:1px solid #2C5193;color:#fff;} .fn-pager input,.fn-pager select,.fn-pager a,.fn-pager span{vertical-align:middle;} .fn-pagerExt{float:right;margin-top:-22px;} .fn-pagerExt input{vertical-align:middle;} /*按钮*/ .btn,.fn-pager input[type='submit']{border-radius:3px;padding:1px 2px;border:1px solid #B3B3B3;cursor:pointer;background-image: linear-gradient(to bottom, #fff, #e6e6e6); box-shadow: 0 1px 0 rgba inset, 0 1px 2px rgba;color:#666;line-height:20px;vertical-align:middle;text-decoration:none;padding:1px 3px;} a.btn{padding:3px 6px;} .btn:hover{background:#eee;text-decoration:none;} .btn-on,.fn-pager input[type='submit']{background-image:linear-gradient(to bottom,#4b8af9,#2C5193);color:#fff;border-color:rgba rgba rgba;background-color:#2C5193;border:1px solid #2C5193;} .btn-on:hover,.fn-pager input[type='submit']:hover{background:#4b8af9;color:#fff;} .btn-gray{background:linear-gradient(to bottom,#ccc,#efefef);color:#fff;border-color:rgba rgba rgba;cursor:not-allowed;} .btn-gray:hover{background:#eee;text-decoration:none;} .btn:active{box-shadow:inset 0 1px 2px rgba,inset 0 1px 3px rgba;} #tooltip{position: absolute;border: 1px solid #333;background: #f7f5d1;padding: 2px 5px;color: #333;display: none;width: 500px;} #tooltip{position:absolute;color:#333;display:block;background-color:#fff;border:1px solid #555;box-shadow:0 0 10px rgba;border-radius:5px;padding:3px;min-width:160px;min-height:80px;} #tooltip img{border-radius:5px;} /*文字大小*/ .font12{font-size:12px;} .font13{font-size:13px;} .font14{font-size:14px;} .font15{font-size:15px;} .font16{font-size:16px;} .font17{font-size:17px;} .font18{font-size:18px;} /*文字颜色*/ .font-red{color:Red;} .font-green{color:Green;} .font-white{color:White;} .font-gray{color:Gray;} /*鼠标标志*/ .hand{cursor:pointer;} 3、主要js jquery.js ui.core.js [javascript] view plaincopy在CODE上查看代码片派生到作者的代码片 /* * jQuery UI 1.7.1 * * Copyright 2009 AUTHORS.txt () * Dual licensed under the MIT * and GPL licenses. * * */ ;jQuery.ui || { var _remove = $.fn.remove, isFF2 = $.browser.mozilla && (parseFloat < 1.9); //Helper functions and ui object $.ui = { version: "1.7.1", // $.ui.plugin is deprecated. Use the proxy pattern instead. plugin: { add: function { var proto = $.ui[module].prototype; for { proto.plugins[i] = proto.plugins[i] || []; proto.plugins[i].push; } }, call: function { var set = instance.plugins[name]; if(!set || !instance.element[0].parentNode) { return; } for (var i = 0; i < set.length; i++) { if (instance.options[set[i][0]]) { set[i][1].apply(instance.element, args); } } } }, contains: function { return document.compareDocumentPosition ? a.compareDocumentPosition & 16 : a !== b && a.contains; }, hasScroll: function { //If overflow is hidden, the element might have extra content, but the user wants to hide it if == 'hidden') { return false; } var scroll = ? 'scrollLeft' : 'scrollTop', has = false; if { return true; } // TODO: determine which cases actually cause this to happen // if the element doesn't have the scroll set, see if it's possible to // set the scroll el[scroll] = 1; has = ; el[scroll] = 0; return has; }, isOverAxis: function { //Determines when x coordinate is over "b" element axis return && (x < ; }, isOver: function(y, x, top, left, height, width) { //Determines when x, y coordinates is over "b" element return $.ui.isOverAxis && $.ui.isOverAxis; }, keyCode: { BACKSPACE: 8, CAPS_LOCK: 20, COMMA: 188, CONTROL: 17, DELETE: 46, DOWN: 40, END: 35, ENTER: 13, ESCAPE: 27, HOME: 36, INSERT: 45, LEFT: 37, NUMPAD_ADD: 107, NUMPAD_DECIMAL: 110, NUMPAD_DIVIDE: 111, NUMPAD_ENTER: 108, NUMPAD_MULTIPLY: 106, NUMPAD_SUBTRACT: 109, PAGE_DOWN: 34, PAGE_UP: 33, PERIOD: 190, RIGHT: 39, SHIFT: 16, SPACE: 32, TAB: 9, UP: 38 } }; // WAI-ARIA normalization if { var attr = $.attr, removeAttr = $.fn.removeAttr, ariaNS = "", ariaState = /^aria-/, ariaRole = /^wairole:/; $.attr = function { var set = value !== undefined; return (name == 'role' ? (set ? attr.call(this, elem, name, "wairole:" + value) : (attr.apply || "").replace : ? (set ? elem.setAttributeNS(ariaNS, name.replace, value) : attr.call(this, elem, name.replace : attr.apply; }; $.fn.removeAttr = function { return ? this.each { this.removeAttributeNS(ariaNS, name.replace : removeAttr.call; }; } //jQuery plugins $.fn.extend { // Safari has a native remove event which actually removes DOM elements, // so we have to use triggerHandler instead of trigger .add { $.triggerHandler; return _remove.apply; }, enableSelection: function() { return this .attr('unselectable', 'off') .css .unbind; }, disableSelection: function() { return this .attr .css('MozUserSelect', 'none') .bind('selectstart.ui', function; }, scrollParent: function() { var scrollParent; if(($.browser.msie && .test) || .test) { scrollParent = this.parents { return (/(relative|absolute|fixed)/).test($.curCSS && .test($.curCSS+$.curCSS+$.curCSS; }).eq; } else { scrollParent = this.parents { return .test($.curCSS+$.curCSS+$.curCSS; }).eq; } return .test || !scrollParent.length ? $ : scrollParent; } }); //Additional selectors $.extend($.expr[':'], { data: function { return !!$.data; }, focusable: function { var nodeName = element.nodeName.toLowerCase(), tabIndex = $.attr; return (/input|select|textarea|button|object/.test ? !element.disabled : 'a' == nodeName || 'area' == nodeName ? element.href || !isNaN : !isNaN // the element and all of its ancestors must be visible // the browser may report that the area is hidden && !$['area' == nodeName ? 'parents' : 'closest'].length; }, tabbable: function { var tabIndex = $.attr; return || tabIndex >= 0) && $.is; // $.widget is a factory to create jQuery plugins // taking some boilerplate code out of the plugin code function getter(namespace, plugin, method, args) { function getMethods { var methods = $[namespace][plugin][type] || []; return (typeof methods == 'string' ? methods.split; } var methods = getMethods; if (args.length == 1 && typeof args[0] == 'string') { methods = methods.concat(getMethods; } return ($.inArray != -1); } $.widget = function { var namespace = name.split[0]; name = name.split[1]; // create plugin method $.fn[name] = function { var isMethodCall = (typeof options == 'string'), args = Array.prototype.slice.call; // prevent calls to internal methods if (isMethodCall && options.substring { return this; } // handle getter methods if (isMethodCall && getter(namespace, name, options, args)) { var instance = $.data; return (instance ? instance[options].apply : undefined); } // handle initialization and non-getter methods return this.each { var instance = $.data; // constructor (!instance && !isMethodCall && $.data(this, name, new $[namespace][name]._init; // method call (instance && isMethodCall && $.isFunction && instance[options].apply; }; // create widget constructor $[namespace] = $[namespace] || {}; $[namespace][name] = function { var self = this; this.namespace = namespace; this.widgetName = name; this.widgetEventPrefix = $[namespace][name].eventPrefix || name; this.widgetBaseClass = namespace + '-' + name; this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, $.metadata && $.metadata.get[name], options); this.element = $ .bind('setData.' + name, function { if (event.target == element) { return self._setData .bind('getData.' + name, function { if (event.target == element) { return self._getData .bind { return self.destroy; }; // add widget prototype $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype); // TODO: merge getter and getterSetter properties from widget prototype // and plugin prototype $[namespace][name].getterSetter = 'option'; }; $.widget.prototype = { _init: function() {}, destroy: function() { this.element.removeData .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled') .removeAttr; }, option: function { var options = key, self = this; if (typeof key == "string") { if { return this._getData; } options = {}; options[key] = value; } $.each(options, function { self._setData; }, _getData: function { return this.options[key]; }, _setData: function { this.options[key] = value; if { this.element [value ? 'addClass' : 'removeClass']( this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled') .attr("aria-disabled", value); } }, enable: function() { this._setData; }, disable: function() { this._setData; }, _trigger: function { var callback = this.options[type], eventName = (type == this.widgetEventPrefix ? type : this.widgetEventPrefix + type); event = $.Event; event.type = eventName; // copy original event properties over to the new event // this would happen if we could call $.event.fix instead of $.Event // but we don't have a way to force an event to be fixed multiple times if { for (var i = $.event.props.length, prop; i;) { prop = $.event.props[--i]; event[prop] = event.originalEvent[prop]; } } this.element.trigger; return !($.isFunction && callback.call(this.element[0], event, data) === false || event.isDefaultPrevented; } }; $.widget.defaults = { disabled: false }; /** Mouse Interaction Plugin **/ $.ui.mouse = { _mouseInit: function() { var self = this; this.element .bind('mousedown.'+this.widgetName, function { return self._mouseDown .bind('click.'+this.widgetName, function { if(self._preventClickEvent) { self._preventClickEvent = false; event.stopImmediatePropagation; // Prevent text selection in IE if { this._mouseUnselectable = this.element.attr; this.element.attr; } this.started = false; }, // TODO: make sure destroying one instance of mouse doesn't mess with // other instances of mouse _mouseDestroy: function() { this.element.unbind; // Restore text selection in IE ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable)); }, _mouseDown: function { // don't let more than one widget handle mouseStart // TODO: figure out why we have to use originalEvent event.originalEvent = event.originalEvent || {}; if (event.originalEvent.mouseHandled) { return; } // we may have missed mouseup (this._mouseStarted && this._mouseUp; this._mouseDownEvent = event; var self = this, btnIsLeft = , elIsCancel = (typeof this.options.cancel == "string" ? $.parents.filter.length : false); if (!btnIsLeft || elIsCancel || !this._mouseCapture { return true; } this.mouseDelayMet = !this.options.delay; if { this._mouseDelayTimer = setTimeout { self.mouseDelayMet = true; }, this.options.delay); } if (this._mouseDistanceMet && this._mouseDelayMet { this._mouseStarted = (this._mouseStart; if { event.preventDefault(); return true; } } // these delegates are required to keep context this._mouseMoveDelegate = function { return self._mouseMove; }; this._mouseUpDelegate = function { return self._mouseUp; }; $ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); // preventDefault() is used to prevent the selection of text here - // however, in Safari, this causes select boxes not to be selectable // anymore, so this fix is needed ($.browser.safari || event.preventDefault; event.originalEvent.mouseHandled = true; return true; }, _mouseMove: function { // IE mouseup check - mouseup happened when mouse was out of window if ($.browser.msie && !event.button) { return this._mouseUp; } if { this._mouseDrag; return event.preventDefault(); } if (this._mouseDistanceMet && this._mouseDelayMet { this._mouseStarted = (this._mouseStart(this._mouseDownEvent, event) !== false); (this._mouseStarted ? this._mouseDrag : this._mouseUp; } return !this._mouseStarted; }, _mouseUp: function .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); if { this._mouseStarted = false; this._preventClickEvent = (event.target == this._mouseDownEvent.target); this._mouseStop; } return false; }, _mouseDistanceMet: function { return (Math.max( Math.abs(this._mouseDownEvent.pageX - event.pageX), Math.abs(this._mouseDownEvent.pageY - event.pageY) ) >= this.options.distance ); }, _mouseDelayMet: function { return this.mouseDelayMet; }, // These are placeholder methods, to be overriden by extending plugin _mouseStart: function {}, _mouseDrag: function {}, _mouseStop: function {}, _mouseCapture: function { return true; } }; $.ui.mouse.defaults = { cancel: null, distance: 1, delay: 0 }; }); ui.sortable.js [javascript] view plaincopy在CODE上查看代码片派生到自己的代码片 /* * jQuery UI Sortable 1.7.1 * * Copyright 2009 AUTHORS.txt () * Dual licensed under the MIT * and GPL licenses. * * * * Depends: * ui.core.js */ { $.widget("ui.sortable", $.extend({}, $.ui.mouse, { _init: function() { var o = this.options; this.containerCache = {}; this.element.addClass; //Get the items this.refresh(); //Let's determine if the items are floating this.floating = this.items.length ? .test(this.items[0].item.css : false; //Let's determine the parent's offset this.offset = this.element.offset(); //Initialize mouse events for interaction this._mouseInit(); }, destroy: function() { this.element .removeClass("ui-sortable ui-sortable-disabled") .removeData .unbind; this._mouseDestroy(); for ( var i = this.items.length - 1; i >= 0; i-- ) this.items[i].item.removeData; }, _mouseCapture: function(event, overrideHandle) { if { return false; } if(this.options.disabled || this.options.type == 'static') return false; //We have to refresh the items data once first this._refreshItems; //Find out if the clicked node (or one of its parents) is a actual item in this.items var currentItem = null, self = this, nodes = $.parents { if($.data(this, 'sortable-item') == self) { currentItem = $; return false; } }); if($.data(event.target, 'sortable-item') == self) currentItem = $; if return false; if(this.options.handle && !overrideHandle) { var validHandle = false; $(this.options.handle, currentItem).find.each { if validHandle = true; }); if return false; } this.currentItem = currentItem; this._removeCurrentsFromItems(); return true; }, _mouseStart: function(event, overrideHandle, noActivation) { var o = this.options, self = this; this.currentContainer = this; //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture this.refreshPositions(); //Create and append the visible helper this.helper = this._createHelper; //Cache the helper size this._cacheHelperProportions(); /* * - Position generation - * This block generates everything position related - it's the core of draggables. */ //Cache the margins of the original element this._cacheMargins(); //Get the next scrolling parent this.scrollParent = this.helper.scrollParent(); //The element's absolute position on the page minus margins this.offset = this.currentItem.offset(); this.offset = { top: this.offset.top - this.margins.top, left: this.offset.left - this.margins.left }; // Only after we got the offset, we can change the helper's position to absolute // TODO: Still need to figure out a way to make relative sorting possible this.helper.css("position", "absolute"); this.cssPosition = this.helper.css; $.extend(this.offset, { click: { //Where the click happened, relative to the element left: event.pageX - this.offset.left, top: event.pageY - this.offset.top }, parent: this._getParentOffset(), relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper }); //Generate the original position this.originalPosition = this._generatePosition; this.originalPageX = event.pageX; this.originalPageY = event.pageY; //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied if this._adjustOffsetFromHelper; //Cache the former DOM position this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way if(this.helper[0] != this.currentItem[0]) { this.currentItem.hide(); } //Create the placeholder this._createPlaceholder(); //Set a containment if given in the options if this._setContainment { // cursor option if .css this._storedCursor = $; $.css; } if { // opacity option if (this.helper.css this._storedOpacity = this.helper.css; this.helper.css; } if { // zIndex option if (this.helper.css this._storedZIndex = this.helper.css; this.helper.css; } //Prepare scrolling if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') this.overflowOffset = this.scrollParent.offset(); //Call callbacks this._trigger("start", event, this._uiHash; //Recache the helper size if(!this._preserveHelperProportions) this._cacheHelperProportions(); //Post 'activate' events to possible containers if { for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash; } } //Prepare possible droppables if $.ui.ddmanager.current = this; if ($.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets; this.dragging = true; this.helper.addClass; this._mouseDrag; //Execute the drag once - this causes the helper not to be visible before getting its correct position return true; }, _mouseDrag: function { //Compute the helpers position this.position = this._generatePosition; this.positionAbs = this._convertPositionTo; if (!this.lastPositionAbs) { this.lastPositionAbs = this.positionAbs; } //Do scrolling if { var o = this.options, scrolled = false; if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') { if((this.overflowOffset.top

.item:first-of-type .up { color:#ccc; cursor:not-allowed; } .item:last-of-type .down { color:#ccc; cursor:not-allowed; }

  • this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; } else { if(event.pageY - $ < o.scrollSensitivity) scrolled = $.scrollTop.scrollTop; else if - (event.pageY - $) < o.scrollSensitivity) scrolled = $.scrollTop.scrollTop; if(event.pageX - $.scrollLeft() < o.scrollSensitivity) scrolled = $.scrollLeft.scrollLeft; else if - (event.pageX - $.scrollLeft < o.scrollSensitivity) scrolled = $.scrollLeft.scrollLeft; } if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) $.ui.ddmanager.prepareOffsets; } //Regenerate the absolute position used for position checks this.positionAbs = this._convertPositionTo; //Set the helper position if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px'; if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px'; //Rearrange for (var i = this.items.length - 1; i >= 0; i--) { //Cache variables and intersection, continue if no intersection var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer; if continue; if(itemElement != this.currentItem[0] //cannot intersect with itself && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true) ) { this.direction = intersection == 1 ? "down" : "up"; if (this.options.tolerance == "pointer" || this._intersectsWithSides { this._rearrange; } else { break; } this._trigger("change", event, this._uiHash; break; } } //Post events to containers this._contactContainers; //Interconnect with droppables if $.ui.ddmanager.drag; //Call callbacks this._trigger('sort', event, this._uiHash; this.lastPositionAbs = this.positionAbs; return false; }, _mouseStop: function { if return; //If we are using droppables, inform the manager about the drop if ($.ui.ddmanager && !this.options.dropBehaviour) $.ui.ddmanager.drop; if { var self = this; var cur = self.placeholder.offset(); self.reverting = true; $.animate({ left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) }, parseInt(this.options.revert, 10) || 500, function() { self._clear; } else { this._clear; } return false; }, cancel: function() { var self = this; if { this._mouseUp(); if(this.options.helper == "original") this.currentItem.css.removeClass; else this.currentItem.show(); //Post deactivating events to containers for (var i = this.containers.length - 1; i >= 0; i--){ this.containers[i]._trigger("deactivate", null, self._uiHash; if(this.containers[i].containerCache.over) { this.containers[i]._trigger("out", null, self._uiHash; this.containers[i].containerCache.over = 0; } } } //$.remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild; if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove(); $.extend(this, { helper: null, dragging: false, reverting: false, _noFinalSort: null }); if(this.domPosition.prev) { $(this.domPosition.prev).after; } else { $(this.domPosition.parent).prepend; } return true; }, serialize: function { var items = this._getItemsAsjQuery; var str = []; o = o || {}; $.each { var res = .attr || '').match(o.expression || ; if str.push(+'='+(o.key && o.expression ? res[1] : res[2])); }); return str.join; }, toArray: function { var items = this._getItemsAsjQuery; var ret = []; o = o || {}; items.each { ret.push.attr || ''); }); return ret; }, /* Be careful with the following core functions */ _intersectsWith: function { var x1 = this.positionAbs.left, x2 = x1 + this.helperProportions.width, y1 = this.positionAbs.top, y2 = y1 + this.helperProportions.height; var l = item.left, r = l + item.width, t = item.top, b = t + item.height; var dyClick = this.offset.click.top, dxClick = this.offset.click.left; var isOverElement = > t && < b && > l && < r; if( this.options.tolerance == "pointer" || this.options.forcePointerForContainers || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height']) ) { return isOverElement; } else { return (l < x1 + (this.helperProportions.width / 2) // Right Half && x2 - (this.helperProportions.width / 2) < r // Left Half && t < y1 + (this.helperProportions.height / 2) // Bottom Half && y2 - (this.helperProportions.height / 2) < b ); // Top Half } }, _intersectsWithPointer: function { var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left
  • this.offset.click.left, item.left, item.width), isOverElement = isOverElementHeight && isOverElementWidth, verticalDirection = this._getDragVerticalDirection(), horizontalDirection = this._getDragHorizontalDirection(); if return false; return this.floating ? ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 ) : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) ); }, _intersectsWithSides: function { var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + , item.height), isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + , item.width), verticalDirection = this._getDragVerticalDirection(), horizontalDirection = this._getDragHorizontalDirection(); if (this.floating && horizontalDirection) { return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf)); } else { return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf)); } }, _getDragVerticalDirection: function() { var delta = this.positionAbs.top - this.lastPositionAbs.top; return delta != 0 && (delta > 0 ? "down" : "up"); }, _getDragHorizontalDirection: function() { var delta = this.positionAbs.left - this.lastPositionAbs.left; return delta != 0 && (delta > 0 ? "right" : "left"); }, refresh: function { this._refreshItems; this.refreshPositions(); }, _connectWith: function() { var options = this.options; return options.connectWith.constructor == String ? [options.connectWith] : options.connectWith; }, _getItemsAsjQuery: function { var self = this; var items = []; var queries = []; var connectWith = this._connectWith(); if(connectWith && connected) { for (var i = connectWith.length - 1; i >= 0; i--){ var cur = $; for (var j = cur.length - 1; j >= 0; j--){ var inst = $.data; if(inst && inst != this && !inst.options.disabled) { queries.push([$.isFunction ? inst.options.items.call : $(inst.options.items, inst.element).not(".ui-sortable-helper"), inst]); } }; }; } queries.push([$.isFunction ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper"), this]); for (var i = queries.length - 1; i >= 0; i--){ queries[i][0].each { items.push; }; return $; }, _removeCurrentsFromItems: function() { var list = this.currentItem.find"); for (var i=0; i < this.items.length; i++) { for (var j=0; j < list.length; j++) { if(list[j] == this.items[i].item[0]) this.items.splice; }; }; }, _refreshItems: function { this.items = []; this.containers = [this]; var items = this.items; var self = this; var queries = [[$.isFunction ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; var connectWith = this._connectWith { for (var i = connectWith.length - 1; i >= 0; i--){ var cur = $; for (var j = cur.length - 1; j >= 0; j--){ var inst = $.data; if(inst && inst != this && !inst.options.disabled) { queries.push([$.isFunction ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); this.containers.push; } }; }; } for (var i = queries.length - 1; i >= 0; i--) { var targetData = queries[i][1]; var _queries = queries[i][0]; for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) { var item = $; item.data('sortable-item', targetData); // Data for target checking items.push({ item: item, instance: targetData, width: 0, height: 0, left: 0, top: 0 }); }; }; }, refreshPositions: function { //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change if(this.offsetParent && this.helper) { this.offset.parent = this._getParentOffset(); } for (var i = this.items.length - 1; i >= 0; i--){ var item = this.items[i]; //We ignore calculating positions of all connected containers when we're not over them if(item.instance != this.currentContainer && this.currentContainer && item.item[0] != this.currentItem[0]) continue; var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; if { item.width = t.outerWidth(); item.height = t.outerHeight(); } var p = t.offset(); item.left = p.left; item.top = p.top; }; if(this.options.custom && this.options.custom.refreshContainers) { this.options.custom.refreshContainers.call; } else { for (var i = this.containers.length - 1; i >= 0; i--){ var p = this.containers[i].element.offset(); this.containers[i].containerCache.left = p.left; this.containers[i].containerCache.top = p.top; this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); }; } }, _createPlaceholder: function { var self = that || this, o = self.options; if(!o.placeholder || o.placeholder.constructor == String) { var className = o.placeholder; o.placeholder = { element: function() { var el = $(document.createElement(self.currentItem[0].nodeName)) .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") .removeClass[0]; if el.style.visibility = "hidden"; return el; }, update: function { // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified if(className && !o.forcePlaceholderSize) return; //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item if { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css
  • parseInt(self.currentItem.css||0, 10)); }; if { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css||0, 10) - parseInt(self.currentItem.css||0, 10)); }; } }; } //Create the placeholder self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); //Append it after the actual current item self.currentItem.after; //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) o.placeholder.update(self, self.placeholder); }, _contactContainers: function { for (var i = this.containers.length - 1; i >= 0; i--){ if(this._intersectsWith(this.containers[i].containerCache)) { if(!this.containers[i].containerCache.over) { if(this.currentContainer != this.containers[i]) { //When entering a new container, we will find the item with the least distance and append our item near it var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[i].floating ? 'left' : 'top']; for (var j = this.items.length - 1; j >= 0; j--) { if(!$.ui.contains(this.containers[i].element[0], this.items[j].item[0])) continue; var cur = this.items[j][this.containers[i].floating ? 'left' : 'top']; if < dist) { dist = Math.abs; itemWithLeastDistance = this.items[j]; } } if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled continue; this.currentContainer = this.containers[i]; itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[i].element, true); this._trigger("change", event, this._uiHash; this.containers[i]._trigger("change", event, this._uiHash; //Update the placeholder this.options.placeholder.update(this.currentContainer, this.placeholder); } this.containers[i]._trigger("over", event, this._uiHash; this.containers[i].containerCache.over = 1; } } else { if(this.containers[i].containerCache.over) { this.containers[i]._trigger("out", event, this._uiHash; this.containers[i].containerCache.over = 0; } } }; }, _createHelper: function { var o = this.options; var helper = $.isFunction ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone; if(!helper.parents //Add the helper to the DOM if that didn't happen already $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild; if(helper[0] == this.currentItem[0]) this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css, top: this.currentItem.css, left: this.currentItem.css }; if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width; if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height; return helper; }, _adjustOffsetFromHelper: function { if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left; if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; if this.offset.click.top = obj.top + this.margins.top; if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; }, _getParentOffset: function() { //Get the offsetParent and cache its position this.offsetParent = this.helper.offsetParent(); var po = this.offsetParent.offset(); // This is a special case where we need to modify a offset calculated on start, since the following happened: // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { po.left += this.scrollParent.scrollLeft(); po.top += this.scrollParent.scrollTop(); } if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix po = { top: 0, left: 0 }; return { top: po.top + (parseInt(this.offsetParent.css || 0), left: po.left + (parseInt(this.offsetParent.css,10) || 0) }; }, _getRelativeOffset: function() { if(this.cssPosition == "relative") { var p = this.currentItem.position(); return { top: p.top - (parseInt(this.helper.css + this.scrollParent.scrollTop(), left: p.left
  • (parseInt(this.helper.css + this.scrollParent.scrollLeft() }; } else { return { top: 0, left: 0 }; } }, _cacheMargins: function() { this.margins = { left: (parseInt(this.currentItem.css || 0), top: (parseInt(this.currentItem.css || 0) }; }, _cacheHelperProportions: function() { this.helperProportions = { width: this.helper.outerWidth(), height: this.helper.outerHeight() }; }, _setContainment: function() { var o = this.options; if(o.containment == 'parent') o.containment = this.helper[0].parentNode; if(o.containment == 'document' || o.containment == 'window') this.containment = [ 0 - this.offset.relative.left - this.offset.parent.left, 0 - this.offset.relative.top - this.offset.parent.top, $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top ]; if(!(/^(document|window|parent)$/).test { var ce = $[0]; var co = $.offset.css != 'hidden'); this.containment = [ co.left + .css,10) || 0) + .css || 0) - this.margins.left, co.top + .css || 0) + .css || 0) - this.margins.top, co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - .css,10) || 0) - .css || 0) - this.helperProportions.width - this.margins.left, co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - .css || 0) - .css || 0) - this.helperProportions.height - this.margins.top ]; } }, _convertPositionTo: function pos = this.position; var mod = d == "absolute" ? 1 : -1; var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = .test; return { top: ( pos.top // The absolute mouse position + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.top * mod // The offsetParent's offset without borders - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop, left: ( pos.left // The absolute mouse position + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + this.offset.parent.left * mod // The offsetParent's offset without borders - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft }; }, _generatePosition: function { var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = .test; // This is another very weird special case that only happens for relative elements: // 1. If the css position is relative // 2. and the scroll parent is the document or similar to the offset parent // we have to refresh the relative offset during the scroll so there are no jumps if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) { this.offset.relative = this._getRelativeOffset(); } var pageX = event.pageX; var pageY = event.pageY; /* * - Position constraining - * Constrain the position to a mix of grid, containment. */ if(this.originalPosition) { //If we are not dragging yet, we won't check for options if { if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; } if { var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; } } return { top: ( pageY // The absolute mouse position - this.offset.click.top // Click offset (relative to the element) - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.top // The offsetParent's offset without borders + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop, left: ( pageX // The absolute mouse position - this.offset.click.left // Click offset (relative to the element) - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent - this.offset.parent.left // The offsetParent's offset without borders + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft }; }, _rearrange: function(event, i, a, hardRefresh) { a ? a[0].appendChild : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); //Various things done here to improve the performance: // 1. we create a setTimeout, that calls refreshPositions // 2. on the instance, we have a counter variable, that get's higher after every append // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same // 4. this lets only the last addition to the timeout stack through this.counter = this.counter ? ++this.counter : 1; var self = this, counter = this.counter; window.setTimeout { if(counter == self.counter) self.refreshPositions; //Precompute after each DOM insertion, NOT on mousemove },0); }, _clear: function { this.reverting = false; // We delay all events that have to be triggered to after the point where the placeholder has been removed and // everything else normalized again var delayedTriggers = [], self = this; // We first have to update the dom position of the actual currentItem // Note: don't do it if the current item is already removed , or it gets reappended if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before; this._noFinalSort = null; if(this.helper[0] == this.currentItem[0]) { for(var i in this._storedCSS) { if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = ''; } this.currentItem.css.removeClass; } else { this.currentItem.show(); } if(this.fromOutside && !noPropagation) delayedTriggers.push { this._trigger("receive", event, this._uiHash; }); if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent && !noPropagation) delayedTriggers.push { this._trigger("update", event, this._uiHash; //Trigger update callback if the DOM position has changed if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element if delayedTriggers.push { this._trigger("remove", event, this._uiHash; for (var i = this.containers.length - 1; i >= 0; i--){ if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) { delayedTriggers.push { return function { c._trigger("receive", event, this._uiHash.call(this, this.containers[i])); delayedTriggers.push { return function { c._trigger("update", event, this._uiHash.call(this, this.containers[i])); } }; }; //Post events to containers for (var i = this.containers.length - 1; i >= 0; i--){ if delayedTriggers.push { return function { c._trigger("deactivate", event, this._uiHash.call(this, this.containers[i])); if(this.containers[i].containerCache.over) { delayedTriggers.push { return function { c._trigger("out", event, this._uiHash.call(this, this.containers[i])); this.containers[i].containerCache.over = 0; } } //Do what was originally in plugins if $.css("cursor", this._storedCursor); //Reset cursor if this.helper.css("opacity", this._storedOpacity); //Reset cursor if this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index this.dragging = false; if(this.cancelHelperRemoval) { if { this._trigger("beforeStop", event, this._uiHash; for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call; }; //Trigger all delayed events this._trigger("stop", event, this._uiHash; } return false; } if this._trigger("beforeStop", event, this._uiHash; //$.remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! this.placeholder[0].parentNode.removeChild; if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null; if { for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call; }; //Trigger all delayed events this._trigger("stop", event, this._uiHash; } this.fromOutside = false; return true; }, _trigger: function() { if ($.widget.prototype._trigger.apply === false) { this.cancel(); } }, _uiHash: function { var self = inst || this; return { helper: self.helper, placeholder: self.placeholder || $, position: self.position, absolutePosition: self.positionAbs, //deprecated offset: self.positionAbs, item: self.currentItem, sender: inst ? inst.element : null }; } })); $.extend($.ui.sortable, { getter: "serialize toArray", version: "1.7.1", eventPrefix: "sort", defaults: { appendTo: "parent", axis: false, cancel: ":input,option", connectWith: false, containment: false, cursor: 'auto', cursorAt: false, delay: 0, distance: 1, dropOnEmpty: true, forcePlaceholderSize: false, forceHelperSize: false, grid: false, handle: false, helper: "original", items: '> *', opacity: false, placeholder: false, revert: false, scroll: true, scrollSensitivity: 20, scrollSpeed: 20, scope: "default", tolerance: "intersect", zIndex: 1000 } }); });

下一场利用 jQuery 完成点击按钮时发展、下移。

upBtn.click(function () { $(this).parent().parent().prev().before($(this).parent().parent()); return false; }); downBtn.click(function () { $(this).parent().parent().next().after($(this).parent().parent()); return false; });

大家这里运用了开关组,所以当两层 parent(卡塔尔(قطر‎ 之后正是按键所在的 item 项了,第一句正是将近些日子项放在脚下项的三哥前面,第二句正是将近些日子项放在最近项的大哥前面。

去除用什么吧?

对协和那个 item 用 remove(State of Qatar。

本文由威尼斯www.9778.com发布于编程人生,转载请注明出处:jquery实现的鼠标拖动排序Li或Table-Web前端之家

关键词:

深远.NET平台C#编程 测验题剖析

using static除了命名空间,还可以在命名空间最后加一个类,这样后面可以直接使用这个类的:静态方法、类中类等。...

详细>>

Google C++ 编程风格指南:作用域

通常每一个  .cc  文件都有一个对应的  .h  文件. 也有一些常见例外,如单元测试代码和只包含  main()  函数的  .c...

详细>>

C++ 中三种正则表明式相比较

3、boost regex /* write by xingming * for:test boost regex * time:2012年10月23日11:35:33 * */#include iostream#include string#include sys/time.h#in...

详细>>

威尼斯正版官方网站C++中的基类与派生类

一、 C++成员函数的重载 C++中的成员函数有四种,分别是普通成员函数,virtual虚函数,const成员函数。 (1) void func(in...

详细>>