【发布时间】:2012-01-21 05:59:12
【问题描述】:
当用户将文件拖到窗口上时,我想在视口上覆盖一个 div。
但是,我在事件传播方面遇到了问题。当我将覆盖设置为display: block 时,它似乎触发了dragleave 事件,然后触发了另一个dragenter,然后又触发了另一个dragleave,因此它始终处于拖放后状态。当然,我在事件对象上调用e.stopPropagation() 和e.preventDefault(),但似乎没有什么区别。
在窗口上拖动某些东西时的 console.log() 输出:
dragenter
dragenter
dragleave
dragenter
dragleave
CSS。 #overlay 默认设置为display: none,但会显示body 是否具有dragenter 类:
body {
position: absolute;
height: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: 0;
padding: 0;
}
#overlay {
position: absolute;
height: auto;
width: auto;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: url(bg.png) repeat-x top right, url(bg.png) repeat-x bottom left, url(bg.png) repeat-y top right, url(bg.p
ng) repeat-y bottom left;
display: none;
}
body.dragenter #overlay {
display: block;
}
JavaScript。在 dragenter 上添加 'dragenter' 类并在 dragleave 上将其删除:
$(document).on('dragenter', function (e) {
e.stopPropagation();
e.preventDefault();
console.log('dragenter');
$(document.body).addClass('dragenter');
});
$(document).on('dragleave', function (e) {
e.stopPropagation();
e.preventDefault();
console.log('dragleave';
$(document.body).removeClass('dragenter');
});
html:
<body>
<div id="overlay">...</div>
...
</body>
【问题讨论】:
标签: javascript jquery css html javascript-events