表格拖拽,表格行拖拽排序,跨表格拖拽

由于开发时要时用到表格行拖拽排序功能,但是网上看了很多都不符合我的需求,我需要从一个表格拖动到另外一个表格,下面是我自己写的一个jquery表格拖拽排序插件:
tableDrag.js

//;(function($){
//	$.fn.extend({
//		"drag":function(){
//			
//			return this;
//		}
//	});
//})($);
(function(factory) {
	if (typeof define === 'function' && define.amd) {
		define([ 'jquery' ], factory);
	} else {
		factory(jQuery);
	}
}(function($) {
	var DRAG_THRESHOLD = 5;// 鼠标移动阈值(px),直到拖动动作开始
	var counter = 0;// 生成事件名称空间
	var dragEvents = {
		START : 'mousedown',
		MOVE : 'mousemove',
		END : 'mouseup'
	};
	$.fn.tableDrag = function(options) {
		var dragging = false;
		var $clone;
		var dragElement;
		var $dragElement;
		var originalClientX, originalClientY; // 客户端(X|Y)开始拖动之前的位置
		var $elements; // 拖拽元素所在的元素列表
		var leftOffset;
		var topOffset;
		var eventNamespace;
		var oldStyle;

		if (typeof options === "string") {
			if (options === 'destroy') {
				if (this.eq(0).parent().data('drag-destroy')) {
					this.eq(0).parent().data('drag-destroy')();
				}
				return this;
			}
		}

		options = $.extend({
			"dragEndEvent" : "drag.end.tableDrag"
		}, options);
		var dragEndEvent = options["dragEndEvent"];
		$elements = this;
		eventNamespace = getEventNamespace();

		this.each(function() {
			var dragSelector = options.dragSelector;
			var self = this;// js对象
			var $this = $(this);// jquery对象
			if (dragSelector) {
				$this.on(dragEvents.START + eventNamespace, dragSelector, dragStartHandler);
			} else {
				$this.on(dragEvents.START + eventNamespace, dragStartHandler);
			}
			function dragStartHandler(e) {
				e.stopPropagation();
				var tagName = $(e.target).get(0).tagName;
				if (tagName == "BUTTON" || tagName == "I"||tagName=="INPUT") {
					$(e.target).trigger($(e.originalEvent), e);
					return;
				}

				dragging = true;
				originalClientX = e.clientX || e.originalEvent.clientX;
				originalClientY = e.clientY || e.originalEvent.clientY;
				dragElement = self;
				$dragElement = $this;
				$clone = clone($dragElement);
				leftOffset = $dragElement.offset().left;
				topOffset = $dragElement.offset().top;
				$clone.offset({
					left : leftOffset,
					top : topOffset
				});
				oldStyle = $dragElement.css("cssText");
				$dragElement.css(options.downStyle);
				$(document.body).append($clone);
			}
		});
		$(document).on(dragEvents.MOVE + eventNamespace, dragMoveHandler);// 绑定鼠标移动事件
		$(document).on(dragEvents.END + eventNamespace, dragEndHandler);// 绑定鼠标松开事件

		function dragMoveHandler(e) {
			e.stopPropagation();
			if (!dragging) {
				return;
			}
			var dragDistanceX = (e.clientX || e.originalEvent.clientX) - originalClientX;
			var dragDistanceY = (e.clientY || e.originalEvent.clientY) - originalClientY;
			var isMove = Math.abs(dragDistanceX) > DRAG_THRESHOLD || Math.abs(dragDistanceY) > DRAG_THRESHOLD;
			if (isMove) {
				$clone.offset({
					left : leftOffset + dragDistanceX,
					top : topOffset + dragDistanceY
				});
			}
		}

		function dragEndHandler(e) {
			e.stopPropagation();
			if ($dragElement) {
				$dragElement.css("cssText", oldStyle);
			}
			if (dragging) {
				dragging = false;
				var mouseY = (e.clientY || e.originalEvent.touches[0].clientY);
				var targetElement = getTargetElement($clone, $dragElement, $(options.targetElements));
				if (targetElement) {
					var targetY = $(targetElement).offset().top;
					var targetHeight = $(targetElement).height();
					if ((mouseY - targetY) < (targetHeight / 2)) {
						$(targetElement).before($dragElement);
					} else {
						$(targetElement).after($dragElement);
					}
					$(dragElement).parents("table").trigger(dragEndEvent, [ $(dragElement) ]);
				}
				$clone.remove();
			}
		}

		function destroy() {
			$(document).off(dragEvents.MOVE + eventNamespace).off(dragEvents.END + eventNamespace);
			if($elements){
				$elements.each(function() {
					var dragSelector = options.dragSelector;
					var $this = $(this);
					if (dragSelector) {
						$this.off(dragEvents.START + eventNamespace, dragSelector);
					} else {
						$this.off(dragEvents.START + eventNamespace);
					}
				});
				$elements.eq(0).parent().data('drag-destroy', null);
				$elements = null;
			}
			dragMoveHandler = null;
			dragEndHandler = null;
		}
		this.eq(0).parent().data('drag-destroy', destroy);
		//debugger;
		//console.log(this.eq(0).parent().data('drag-destroy'));
	};

	function getTargetElement($clone, $dragElement, $movableElements) {
		var cloneOffset = $clone.offset();
		var cloneWidth = $clone.width();
		var cloneHeight = $clone.height();
		var cloneLeftPosition = cloneOffset.left;
		var cloneRightPosition = cloneOffset.left + cloneWidth;
		var cloneTopPosition = cloneOffset.top;
		var cloneBottomPosition = cloneOffset.top + cloneHeight;
		var $currentElement;
		var horizontalMidPosition, verticalMidPosition;
		var offset, overlappingX, overlappingY, inRange;

		for (var i = 0; i < $movableElements.length; i++) {
			$currentElement = $movableElements.eq(i);
			if ($currentElement[0] === $dragElement[0]) {
				continue;
			}
			offset = $currentElement.offset();
			horizontalMidPosition = offset.left + 0.5 * $currentElement.width();
			verticalMidPosition = offset.top + 0.5 * $currentElement.height();

			overlappingX = (horizontalMidPosition < cloneRightPosition) && (horizontalMidPosition > cloneLeftPosition);
			overlappingY = (verticalMidPosition < cloneBottomPosition) && (verticalMidPosition > cloneTopPosition);
			inRange = overlappingX && overlappingY;
			if (inRange) {
				return $currentElement[0];
			}
		}
		return null;
	}

	function clone($element) {
		var $clone = $element.clone();
		$clone.css({
			position : 'absolute',
			width : $element.width(),
			height : $element.height(),
			'z-index' : 100000
		});
		return $clone;
	}

	function getEventNamespace() {
		counter += 1;
		return '.tableDrag-' + counter;
	}
}));

使用:

//给tr注册拖拽事件
$('#'+table_id+' tbody tr').tableDrag({
	downStyle : {
		"background-color" : "#4472C4",
		"cursor" : "move",
		"color" : "#FFFFFF"
	},
	targetElements : "#"+table_id+" tbody tr",
});
//添加拖拽回调事件
$('#'+table_id).on("drag.end.tableDrag", function(dragElement) {
	alert("拖拽完成");
});
//跨表格拖拽(如下代码,则只能从table1拖动到table2)
$('#table1 tbody tr').tableDrag({
	downStyle : {
		"background-color" : "#4472C4",
		"cursor" : "move",
		"color" : "#FFFFFF"
	},
	targetElements : "#table2 tbody tr",
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值