我需要的功能是当你拖动一个元素并将它放在他们交换位置的另一个元素上时。
我想写一个像这样的交换函数。
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。
所以我的问题是如何引用初始拖动的节点以便我可以运行我的交换函数?
答案 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);