Javascript draggable我需要引用初始拖动的对象,以便我可以交换

时间:2016-03-15 07:19:45

标签: javascript html drag-and-drop

我需要的功能是当你拖动一个元素并将它放在他们交换位置的另一个元素上时。

我想写一个像这样的交换函数。

function swapElements(obj1, obj2) {
    // create marker element and insert it where obj1 is
    var temp = document.createElement("div");
    obj1.parentNode.insertBefore(temp, obj1);

    // move obj1 to right before obj2
    obj2.parentNode.insertBefore(obj1, obj2);

    // move obj2 to right before where obj1 used to be
    temp.parentNode.insertBefore(obj2, temp);

    // remove temporary marker node
    temp.parentNode.removeChild(temp);
}

因此作为参数我需要传递初始拖动的元素,然后在drop传递被删除的元素。

  var self = this;

  // drag start
  myNode.addEventListener("dragstart", function(e) {
    this.classList.add('dragstart');
    e.dataTransfer.setData('from', this.innerHTML);
  }, false);

  // drop event
  myNode.addEventListener("drop", function(e) {
    if (e.preventDefault) e.preventDefault(); 
    if (e.stopPropagation) e.stopPropagation();
    this.classList.remove('dragover');

    var obj1 = e.dataTransfer.getData('from');

    // user has dropped lets do the swap
    self.swapElements(obj1, this);

  }, false);

所以上面我正在做的是使用dataTransfer,但实际上并没有引用初始节点,只是克隆了HTML。

所以我的问题是如何引用初始拖动的节点以便我可以运行我的交换函数?

1 个答案:

答案 0 :(得分:0)

您可以为这两个事件处理程序使用公共变量,并将要拖动的元素存储在其中。

var dragged;

myNode.addEventListener("dragstart", function(e) {
    this.classList.add('dragstart');
    dragged=e.target;
  }, false);

 myNode.addEventListener("drop", function(e) {
    if (e.preventDefault) e.preventDefault(); 
    if (e.stopPropagation) e.stopPropagation();
    this.classList.remove('dragover');
    self.swapElements(dragged, e.target);

  }, false);