Javascript HTML5中的多个删除事件
我试图在HTML5中创建一个拖放功能,在这里我可以从一个列表拖动到另一个列表。我有一个列表包含可拖动的项目,另一个列表包含添加了拖放事件的项目。问题是,无论我放置在哪个元素上,添加的最后一个放置事件都是被调用的事件 谢谢你的帮助和建议 我已将我的代码包括在下面:Javascript HTML5中的多个删除事件,javascript,html,drag-and-drop,Javascript,Html,Drag And Drop,我试图在HTML5中创建一个拖放功能,在这里我可以从一个列表拖动到另一个列表。我有一个列表包含可拖动的项目,另一个列表包含添加了拖放事件的项目。问题是,无论我放置在哪个元素上,添加的最后一个放置事件都是被调用的事件 谢谢你的帮助和建议 我已将我的代码包括在下面: <!DOCTYPE html> <head> <title>List Conversion Test</title> <style type="text/css"> #l
<!DOCTYPE html>
<head>
<title>List Conversion Test</title>
<style type="text/css">
#list, #cart {
display: inline;
float: left;
border: 1px solid #444;
margin: 25px;
padding: 10px;
}
#list p {
background-color: #036;
color: #fff;
}
#cart p {
background-color: #363;
color: #fff;
}
.listitem {
}
.listitem_done {
text-decoration: line-through;
}
.product {
background-color: #CCC;
}
.product_over {
background-color: #363;
}
</style>
<script type="text/javascript" src="http://html5demos.com/js/h5utils.js"></script>
</head>
<body>
<article>
<div id="list">
<p>On My List</p>
<ul>
<li class="listitem" id="L001">Shopping List Item #1</li>
<li class="listitem" id="L002">Shopping List Item #2</li>
</ul>
<div id="done">
<p>In My Cart</p>
<ul></ul>
</div>
</div>
<div id="cart">
<p>Cart</p>
<ul>
<li class="product" id="P001">Product #1</li>
<li class="product" id="P002">Product #2</li>
</ul>
</div>
</article>
<script>
// make list items draggable
var list = document.querySelectorAll('li.listitem'), thisItem = null;
for (var i = 0; i < list.length; i++) {
thisItem = list[i];
thisItem.setAttribute('draggable', 'true');
addEvent(thisItem, 'dragstart', function (e) {
e.dataTransfer.effectAllowed = 'copy';
e.dataTransfer.setData('Text', this.id);
});
}
// give products drop events
var products = document.querySelectorAll('li.product'), thisProduct = null;
for (var i = 0; i < products.length; i++) {
thisProduct = products[i];
addEvent(thisProduct, 'dragover', function (e) {
if (e.preventDefault) e.preventDefault();
this.className = 'product_over';
e.dataTransfer.dropEffect = 'copy';
return false;
});
addEvent(thisProduct, 'dragleave', function () {
this.className = 'product';
});
addEvent(thisProduct, 'drop', function (e) {
//alert(thisProduct.id);
if (e.stopPropagation) e.stopPropagation();
var thisItem = document.getElementById(e.dataTransfer.getData('Text'));
thisItem.parentNode.removeChild(thisItem);
thisProduct.className = 'product';
handleDrop(thisItem, thisProduct);
return false;
});
}
// handle the drop
function handleDrop(i, p) {
alert(i.id + ' to ' + p.id);
var done = document.querySelector('#done > ul');
done.appendChild(i);
i.className = 'listitem_done';
}
</script>
</body>
</html>
列表转换测试
#列表,#购物车{
显示:内联;
浮动:左;
边框:1px实心#444;
利润率:25px;
填充:10px;
}
#列表p{
背景色:#036;
颜色:#fff;
}
#购物车p{
背景色:#363;
颜色:#fff;
}
.listitem{
}
.listitem_完成{
文字装饰:线条贯通;
}
.产品{
背景色:#CCC;
}
.产品名称{
背景色:#363;
}
在我的名单上
- 购物清单项目#1
购物清单项目2
在我的车里
推车
- 产品#1
- 产品#2
//使列表项可拖动
var list=document.querySelectorAll('li.listitem'),thisItem=null;
对于(变量i=0;iul”);
完成。儿童(i);
i、 className='listitem_done';
}
这就是为什么在循环中定义函数(如回调函数)通常是个坏主意。您正在循环中分配thisProduct
,但它将在循环的下一次迭代中重新分配。按照闭包的设置方式,每个回调都绑定到同一个变量thisProduct
,并将使用最新的值
一种可能的修复方法是在需要此产品的地方创建一个新的闭包,例如
(function(thisProduct) {
addEvent(thisProduct, 'drop', function (e) {
//alert(thisProduct.id);
if (e.stopPropagation) e.stopPropagation();
var thisItem = document.getElementById(e.dataTransfer.getData('Text'));
thisItem.parentNode.removeChild(thisItem);
thisProduct.className = 'product';
handleDrop(thisItem, thisProduct);
return false;
});
}(thisProduct));
这似乎对我现在起作用了。有关更多说明,请参阅。谢谢!这就是为什么最后一个id总是出现的原因。MDN链接很有帮助;看来我有点需要学习闭包。