jquery拖拽自动排序插件使用方法详解


Posted in jQuery onJuly 20, 2020

本文为大家分享了jquery拖拽自动排序插件,供大家参考,具体内容如下

该插件并不是原生js写的,是基于jquery的,想看原生的话,请绕道而行。

html:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
 <script type="text/javascript" src="jquery.js"></script>
 <script type="text/javascript" src="drag.js"></script>
 <style type="text/css">
 div{
  height: 200px;
  overflow-y: auto;
 }
 ul{
  margin: 0;
  padding: 0;
  list-style: none;
  box-shadow: rgba(0, 0, 0, 0.2) 5px 5px 10px;
  display: inline-block;
 }
 .drag-item{
  width: 100px;
  padding: 0 10px;
  line-height: 38px;
  cursor: move;
 }
 .draging{
  background-color: #ccc !important;
 }
 .no-draging{
  background-color: #fff !important;
 }
 </style>
</head>
<body>
 <ul class="drag-box">

 </ul>
</body>
<script type="text/javascript">
 new Drag({
 container: '.drag-box',
 data: ['应用1','应用2','应用3','应用4','应用5','应用6','应用7','应用8','应用9']
 });
</script>
</html>

js:

(function(win){

 function Drag(opts){
 this.init(opts);
 };

 Drag.prototype = {
 constructor: Drag,

 options: {
  container: '',
  data: [], //可以是数据,也可以是html标签
  className: 'item'
 },

 //初始化 
 init: function(opts){
  $.extend(this.options, opts);
  this.$el = $(this.get('container'));
  this._render();
  this._bindEvent();
 },

 get: function(key){
  return this.options[key];
 },

 set: function(key, value){
  this.options[key]=value;
 },

 //渲染列表
 _render: function(){
  var me = this, lis = '',
  data = me.get('data') || [];
  for(var i=0,len=data.length;i<len;i++) lis+='<li class="drag-item" id="drag-item-'+i+'">'+ data[i]+'</li>';
  me.$el.append(lis)
   .find('li').attr('draggable',true)
    .addClass(this.get('className'));
 },

 //绑定事件
 _bindEvent: function(){
  var me = this,
  $lis = $('li', me.$el),
  events = ['dragstart', 'dragenter', 'dragover', 'drop', 'dragend'];
  $.each(events, function(index, item){
  $lis.on(item, function(e){
   me['_'+item+'Handle'] && me['_'+item+'Handle'](e, me);
  });
  })
  $lis.hover(function(){
  $(this).css('background-color','#eee');
  },function(){
  $(this).css('background-color','#fff');
  });
 },

 //开始拖动
 _dragstartHandle: function(e){
  var me = this,oe = e.originalEvent;
  if(oe.dataTransfer){
  oe.dataTransfer.setData('text', '');
  }
  me.$drag = $(e.currentTarget);
  $('li',me.$el).removeClass('item-hover');
  me.$drag.addClass('draging').siblings().addClass('no-draging');
 },

 _dragenterHandle: function(e){
  var me = this;
  me.$drop = $(e.currentTarget);
  if(me.timer){clearTimeout(me.timer)} //事件控制
  me.timer = setTimeout(function(){
  if(me.$drag.attr('id') !== me.$drop.attr('id')){
   me._createMask();
   if(me.$drag.index()<me.$drop.index()) me.$drag.insertAfter(me.$drop);
   else me.$drag.insertBefore(me.$drop);
  }
  }, 30);

 },

 _dragoverHandle: function(e){
  var oe = e.originalEvent;
  e.preventDefault();
  return false;
 },

 _dropHandle: function(e){
  e.preventDefault();
  e.stopPropagation();
  return false;
 },

 //拖动结束
 _dragendHandle: function(e){
  var me = this;
  me.$mask && me.$mask.remove();
  setTimeout(function(){
  $('li', me.$el).removeClass('draging no-draging');
  },30);
 },

 //创建遮罩
 _createMask: function(){
  var me = this,$mask = me.$mask = $('<div class="drag-mask"></div>');
  $mask.css({
  position: 'absolute',
  width: me.$drop.outerWidth(),//new
  height: me.$drop.outerHeight(),//new
  left: me.$drop.position().left,
  top: me.$drop.position().top+me.$el.scrollTop(),//new
  backgroundColor: '#fff'
  });
  $mask.on({
  'drop': me._dropHandle,
  'dragover': me._dragoverHandle
  });
  this.$el.find('.drag-mask').remove();
  this.$el.append($mask);
 }

 };

 win.Drag = Drag;
})(window);

踩得坑:

1、关于dataTransfer, 事件对象e中是没有该属性的,要找该属性应该通过e.originalEvent.dataTransfer中去找。

2、兼容火狐浏览器。如果不这样操作,火狐下是无法运行的:

if(oe.dataTransfer){
 oe.dataTransfer.setData('text', '');
}

3、dragover事件每隔 350 毫秒会被触发一次。

4、dragstart、dragenter、dragend事件通过jquery绑定,事件处理函数中的this指向最外层对象,例如上面的new Drag();dragover、drop事件通过jquery绑定,事件处理函数中的this指向被绑定的html标签。

5、jquery获取包括padding的宽度调用:$el.outerWidth()$el.outerHeight()

6、只有属性draggable="true"的元素才可以被拖动。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

jQuery 相关文章推荐
基于jQuery实现文字打印动态效果
Apr 21 jQuery
jQuery实现百度登录框的动态切换效果
Apr 21 jQuery
jQuery Ajax自定义分页组件(jquery.loehpagerv1.0)实例详解
May 01 jQuery
jquery实现简单实用的轮播器
May 23 jQuery
jQuery实现动态给table赋值的方法示例
Jul 04 jQuery
jQuery DOM节点的遍历方法小结
Aug 15 jQuery
jquery学习笔记之无new构建详解
Dec 07 jQuery
JQuery模拟实现网页中自定义鼠标右键菜单功能
Nov 14 jQuery
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 jQuery
jQuery Datatables 动态列+跨列合并实现代码
Jan 30 jQuery
如何在vue 中引入使用jquery
Nov 10 jQuery
jQuery实现电梯导航模块
Dec 22 jQuery
jQuery实现网页拼图游戏
Apr 22 #jQuery
基于jquery实现九宫格拼图小游戏
Nov 30 #jQuery
jQuery实现购物车的总价计算和总价传值功能
Nov 28 #jQuery
jQuery点击页面其他部分隐藏下拉菜单功能
Nov 27 #jQuery
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
jQuery 同时获取多个标签的指定内容并储存为数组
Nov 20 #jQuery
IE8中jQuery.load()加载页面不显示的原因
Nov 15 #jQuery
You might like
PHP写日志的实现方法
2014/11/05 PHP
Laravel5中contracts详解
2015/03/02 PHP
php源码之将图片转化为data/base64数据流实例详解
2016/11/27 PHP
让任务管理器中的CPU跳舞的js代码
2008/11/01 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
jquery animate 动画效果使用说明
2009/11/04 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
Webpack 实现 Node.js 代码热替换
2015/10/22 Javascript
JS实现alert中显示换行的方法
2015/12/17 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
AngularJS实现网站换肤实例
2021/02/19 Javascript
Bootstrap实现基于carousel.js框架的轮播图效果
2017/05/02 Javascript
Node.js中多进程模块Cluster的介绍与使用
2017/05/27 Javascript
JavaScript实现提交模式窗口后刷新父窗口数据的方法
2017/06/16 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
2017/09/11 jQuery
使用javaScript实现鼠标拖拽事件
2020/04/03 Javascript
基于vue配置axios的方法步骤
2017/11/09 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
跟老齐学Python之用Python计算
2014/09/12 Python
Python实现线程池代码分享
2015/06/21 Python
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
使用pandas读取csv文件的指定列方法
2018/04/21 Python
python 将md5转为16字节的方法
2018/05/29 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
解决Keras 自定义层时遇到版本的问题
2020/06/16 Python
CSS3中设置3D变形的transform-style属性详解
2016/05/23 HTML / CSS
办公室副主任岗位职责
2013/11/25 职场文书
社区工作者感言
2014/03/02 职场文书
马智宇结婚主持词
2014/04/01 职场文书
激励员工的口号
2014/06/16 职场文书
个人主要事迹材料
2014/08/26 职场文书
CSS实现多个元素在盒子内两端对齐效果
2021/03/30 HTML / CSS
教你利用python实现企业微信发送消息
2021/05/23 Python
python 远程执行命令的详细代码
2022/02/15 Python