溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jquery拖拽自動排序插件使用方法詳解

發(fā)布時間:2020-08-26 06:33:54 來源:腳本之家 閱讀:249 作者:sinat_20482223 欄目:web開發(fā)

本文為大家分享了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);
  },

  //創(chuàng)建遮罩
  _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 毫秒會被觸發(fā)一次。

4、dragstart、dragenter、dragend事件通過jquery綁定,事件處理函數中的this指向最外層對象,例如上面的new Drag();dragover、drop事件通過jquery綁定,事件處理函數中的this指向被綁定的html標簽。

5、jquery獲取包括padding的寬度調用:$el.outerWidth()$el.outerHeight() 。

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI