嵌套拖放 AddEventListener 中的事件会发生什么?
What happens with the events in nested drag drop AddEventListener?
我有以下嵌套的 addEventListener 来跟踪拖动的元素和我要拖动到的元素。
var objects = document.querySelector('.objects');
var destination = document.querySelector('.dest');
objects.addEventListener('dragstart', function(e) {
console.log("dragstart")
destination.addEventListener('dragover', function(e2) { e2.preventDefault(); });
destination.addEventListener('drop', function(e2) {
console.log("drop")
console.log(e.target);
console.log(e2.target);
})
})
<style>
div >div {
margin: 50px;
width: 100px;
height: 100px;
background-color: green;
}
</style>
<body>
<div class="objects">
<div draggable='true' id='o1'>A</div>
</div>
<div class="dest">
<div id='D1' >1</div>
</div>
</body>
第一次拖放一切似乎都符合我的预期,但是当我第二次拖放时,drop 的addEventListener 执行了两次,第三次执行了三次。为什么?
如果我只 console.log 拖放字符串,则不会出现这种加倍和三倍的行为。事件 e 和 e2 会发生什么?
您可以使用 removeEventListener
删除之前添加的事件,这样它就不会在每次拖动时都重新添加,为此您只需单独存储该函数即可
var objects = document.querySelector('.objects');
var destination = document.querySelector('.dest');
function dragFnc(e2) {
e2.preventDefault();
}
function dropt(e2) {
console.log("drop")
console.log(e2.target);
e2.target.removeEventListener("dragover",dropt)
e2.target.removeEventListener("drop",dragFnc)
}
objects.addEventListener('dragstart', function(e) {
console.log("dragstart")
destination.addEventListener('dragover', dragFnc);
destination.addEventListener('drop', dropt)
})
<style>
div >div {
margin: 50px;
width: 100px;
height: 100px;
background-color: green;
}
</style>
<body>
<div class="objects">
<div draggable='true' id='o1'>A</div>
</div>
<div class="dest">
<div id='D1' >1</div>
</div>
</body>
我有以下嵌套的 addEventListener 来跟踪拖动的元素和我要拖动到的元素。
var objects = document.querySelector('.objects');
var destination = document.querySelector('.dest');
objects.addEventListener('dragstart', function(e) {
console.log("dragstart")
destination.addEventListener('dragover', function(e2) { e2.preventDefault(); });
destination.addEventListener('drop', function(e2) {
console.log("drop")
console.log(e.target);
console.log(e2.target);
})
})
<style>
div >div {
margin: 50px;
width: 100px;
height: 100px;
background-color: green;
}
</style>
<body>
<div class="objects">
<div draggable='true' id='o1'>A</div>
</div>
<div class="dest">
<div id='D1' >1</div>
</div>
</body>
第一次拖放一切似乎都符合我的预期,但是当我第二次拖放时,drop 的addEventListener 执行了两次,第三次执行了三次。为什么?
您可以使用 removeEventListener
删除之前添加的事件,这样它就不会在每次拖动时都重新添加,为此您只需单独存储该函数即可
var objects = document.querySelector('.objects');
var destination = document.querySelector('.dest');
function dragFnc(e2) {
e2.preventDefault();
}
function dropt(e2) {
console.log("drop")
console.log(e2.target);
e2.target.removeEventListener("dragover",dropt)
e2.target.removeEventListener("drop",dragFnc)
}
objects.addEventListener('dragstart', function(e) {
console.log("dragstart")
destination.addEventListener('dragover', dragFnc);
destination.addEventListener('drop', dropt)
})
<style>
div >div {
margin: 50px;
width: 100px;
height: 100px;
background-color: green;
}
</style>
<body>
<div class="objects">
<div draggable='true' id='o1'>A</div>
</div>
<div class="dest">
<div id='D1' >1</div>
</div>
</body>