js實現的dom元素拖動封裝外掛程式碼例項

admin發表於2017-04-05

在實際應用中經常會有對元素進行拖動的需求,下面就是一個對此功能的封裝程式碼。

需要的朋友可以做一下參考,程式碼如下:

[JavaScript] 純文字檢視 複製程式碼
/**
* 相容不同定位方式的通用拖動介面
* @param {Node} dragger 需要被拖動的元素
*/
//必須告訴系統,哪些元素是可以進行互動,而哪些是不行
function canDrag(dragger) {
 var drag = bindEvent(dragger,'onmousedown',function(e){
  //相容事件物件
  e = e || event;
  //相容座標屬性
  var pageX = e.clientX || e.pageX;
  var pageY = e.clientY || e.pageY;
  //相容樣式物件
  var style = dragger.currentStyle || window.getComputedStyle(dragger,null);
  //當沒有設定left和top屬性時,IE下預設值為auto
  var offX = parseInt(style.left) || 0;
  var offY = parseInt(style.top) || 0;
  //獲取滑鼠相對於元素的間距
  var offXL = pageX - offX;
  var offYL = pageY - offY;
  //為dragger增加onDrag屬性,用來儲存拖動事件
  if (!dragger.onDrag) {
   //監聽拖動事件
   dragger.onDrag = bindEvent(document,'onmousemove',function(e){
    e = e || event;
    var x = e.clientX || e.pageX;
    var y = e.clientY || e.pageY
    //設定X座標
    dragger.style.left = x - offXL + 'px';
    //設定Y座標
    dragger.style.top = y - offYL + 'px';
   });
   //監聽拖動結束事件
   dragger.onDragEnd = bindEvent(document,'onmouseup',function(e){
    //釋放前讀取事件物件
    var x = e.clientX || e.pageX;
    var y = e.clientY || e.pageY
    //釋放拖動監聽和結束監聽
    removeEvent(document, 'onmousemove', dragger.onDrag);
    removeEvent(document, 'onmouseup', dragger.onDragEnd);
    try {
     //刪除拖動時所用的屬性,相容FF使用
     delete dragger.onDrag;
     delete dragger.onDragEnd;
    } catch (e) {
     //刪除拖動時所用的屬性,相容IE6使用
     dragger.removeAttribute('onDrag');
     dragger.removeAttribute('onDragEnd');
    }
   });
  }
 });
 return function() {
  //返回一個可以取消拖動功能的函式引用
  //釋放拖動監聽和結束監聽
  removeEvent(document, 'onmousemove', dragger.onDrag);
  removeEvent(document, 'onmouseup', dragger.onDragEnd);
  try {
   //刪除拖動時所用的屬性,相容FF使用
   delete dragger.onDrag;
   delete dragger.onDragEnd;
  } catch (e) {
   //刪除拖動時所用的屬性,相容IE6使用
   dragger.removeAttribute('onDrag');
   dragger.removeAttribute('onDragEnd');
  }
 }
}

相關文章