[英]How to implement drag and drop so dragging child element will drag whole parent element
我正在为wordpress制作媒体导入插件。 我正在尝试实现拖放功能,以重新排序用户导入的媒体元素(音频和/或图像)。 我有一个<div>
标签(我们称之为媒体div ),最多可容纳三个<span>
, <img>
或<audio>
标签。 因此,我将已导入的所有媒体资产显示在一行中,并希望能够拖放以重新排序媒体div 。 使用html5实现基本的拖放操作没有问题。 我的问题是,当我点击媒体div中的媒体子元素( <audio>
或<img>
)时,子元素是拖动事件的目标。 有没有什么办法可以将拖动事件的目标重置为父元素,所以我拖动整个媒体div而不仅仅是媒体元素? 我已经查看了e.stopPropogation()
并阅读了冒泡和捕获,但我试图利用它们的每一种方式,都没有解决我的问题。 有什么我想念的吗? 如果可能的话,我宁愿避免使用jQuery,也绝对不能使用任何库或框架。
TL; DR:当单击子元素时,如何将父元素作为拖动事件的目标?
<div class="npr-import-media npr-import-audio npr-import-images" id="media-container">
<div class="npr-import-media-container" draggable="true">
<audio src="<?php echo $audio->format->mp4->{'$text'}; ?>" controls></audio>
<span class="npr-media-delete">X</span>
</div>
<div class="npr-import-image-container npr-import-media-container" draggable="true">
<img class="npr-import-image" src="<?php echo $image->src; ?>" >
<span class="npr-import-image-caption"><?php echo $image->caption->{'$text'} ?></span>
<span class="npr-media-delete">X</span>
</div>
<div class="npr-import-add-media npr-import-media-container">
Add Media+
</div>
</div>
这是我的代码的HTML部分。 最初有一些php功能可以循环显示原始源材料,以显示从原始文章导入的所有媒体元素,但我认为不必包含它。
您可以将ondragstart
事件的处理程序设置为false,如下所示:
<div class="npr-import-media npr-import-audio npr-import-images" id="media-container">
<div class="npr-import-image-container npr-import-media-container" draggable="true" ondragstart="drag(event)" style="border:1px solid blue;padding:10px;">
<img class="npr-import-image" src="img.jpg" >
<span class="npr-import-image-caption">Caption</span>
<span class="npr-media-delete">X</span>
</div>
<div class="npr-import-add-media npr-import-media-container">
Add Media+
</div>
</div>
<script>
function drag(e) {
console.log(e);
}
var images = document.getElementsByTagName('img');
for(i = 0 ; i < images.length; i++)
images[i].ondragstart = function() { return false; }
</script>
在控制台输出上,您可以看到:
>> DragEvent {isTrusted: true, dataTransfer: DataTransfer, screenX: 66, screenY: 161, clientX: 66…}
更新通过如上所述的html属性设置父元素上的拖动事件处理程序或按代码附加事件侦听器,如下所示:
document.getElementById('draggable').addEventListener('dragstart', function(e) {
console.log(e);
});
我只是在同样的问题,无法解决img标签,所以切换到div。
您可以使用
<div style="background-image: url('img.jpg')"></div>
代替
<img class="npr-import-image" src="img.jpg" >
我刚刚遇到过这个问题。 只需在每个子元素中添加draggable =“false”,我就可以在没有javascript的情况下解决它。
<div class="npr-import-image-container npr-import-media-container" draggable="true" ondragstart="drag(event)" style="border:1px solid blue;padding:10px;">
<img draggable="false" class="npr-import-image" src="img.jpg" >
<span draggable="false" class="npr-import-image-caption">Caption</span>
<span draggable="false" class="npr-media-delete">X</span>
</div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.