我对jQuery相当新,并且我试图将拖动的图像元素id附加到放置目标而不是图像元素本身或放置目标ID。我正在使用html5原生DnD。到目前为止,我可以通过使用drag函数中的datatransfer方法和drop中的getdata函数发送其id来获取元素本身。每当我尝试从drop中调用该id时,它会获得drop target id而不是拖动元素。
任何帮助都会非常感激,因为我已经在网上彻底搜索过,只找到了更多方法来获取丢弃区域的目标ID。这是我当前代码小提琴的片段:
function allowDrop(ev) {
ev.preventDefault();
}
function dragStart(ev) {
ev.dataTransfer.setData('Text/html', ev.target.id); // sends the dragged images data.
//alert(ev.target.id); // alerts the correct id of the dragged image.
}
function drop(ev) {
ev.preventDefault();
var data = ev.dataTransfer.getData("text/html");//retrieves dropped images data.
ev.target.appendChild(document.getElementById(data));//this displays the dropped image.
//alert(ev.target.id); // alerts the id of the drop target(Want to get the dropped images id.)
//$("#mybillets").append("<span>"+ev.target.id+" </span>"); //appends the drop targets id(Want to append the dropped images id.)
}
答案 0 :(得分:11)
在drop
方法中,ev
是事件对象,因此ev.target
将引用项目被删除的元素。
因此请使用ev.target.id
来引用放置目标ID。
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData('Text/html', ev.target.id);
}
function drop(ev, target) {
ev.preventDefault();
console.log(target.id, ev.target.id)
var data = ev.dataTransfer.getData("text/html");
alert(data)
}
&#13;
#div1 {
width: 350px;
height: 70px;
padding: 10px;
border: 1px solid #aaaaaa;
}
&#13;
<div id="div1" ondrop="drop(event, this)" ondragover="allowDrop(event)"></div>
<br/>
<img id="drag1" src="//placehold.it/336X69/ff0000" draggable="true" ondragstart="drag(event)" width="336" height="69" />
&#13;
答案 1 :(得分:0)
感谢@Arun P Johny。关于这个简单例子的出色工作。
但是,我只是想补充一点,如果您尝试从“A”标签中拖动,那么您将没有太多运气。
这将不工作(在所有浏览器中):
<a draggable="true" ondragstart="drag(event)" id="drag1" href="#">
<img src="//placehold.it/336X69/ff0000" width="336" height="69" />
</a>
然而,这将有效(在更多浏览器中):
<img draggable="true" ondragstart="drag(event)" id="drag1" src="//placehold.it/336X69/ff0000" width="336" height="69" />
我花了很长时间才发现这一点,因为许多浏览器都没有返回或让你获得拖动内容的源ID。 此示例应在警报和控制台中显示您的源ID:
<script>
function allowDrop(ev) {
ev.preventDefault();
}
function drag(ev) {
ev.dataTransfer.setData('text', ev.target.id);
}
function drop(ev, target) {
ev.preventDefault();
console.log(target.id + " : " + ev.target.id)
console.log(ev.dataTransfer.getData("text/html"));
console.log(ev.dataTransfer.getData("text"));
var data = ev.dataTransfer.getData("text");
alert(data)
}
</script>
<style "type="text/css">
#div1
{
width: 350px;
height: 70px;
padding: 10px;
border: 1px solid #aaaaaa;
}
</style>
<div id="div1" ondrop="drop(event, this)" ondragover="allowDrop(event)"></div>
<br/>
<img id="drag1" src="http://placehold.it/336X69/ff0000" draggable="true" ondragstart="drag(event)" width="336" height="69" />
答案 2 :(得分:0)
我创建了简单的拖放示例,也许您可以将其用作解决问题的示例。有4个可以放置图像的框。只需从下面的列表中抓取图像,然后将其放入上面的框之一即可。该代码将提醒您进行的动作。
HTML代码:
<div id="box1" class="empty">Box 1</div>
<div id="box2" class="empty">Box 2</div>
<div id="box3" class="empty">Box 3</div>
<div id="box4" class="empty">Box 4</div>
<div id="example1" class=" container list-group col" >
<div id="image1" class="fill list-group-item" draggable="true">
<img src="https://source.unsplash.com/random/150x150"> Image 1
</div>
<div id="image2" class="fill list-group-item" draggable="true">
<img src="https://source.unsplash.com/random/149x149"> Image 2
</div>
<div id="image3" class="fill list-group-item" draggable="true">
<img src="https://source.unsplash.com/random/151x151"> Image 3
</div>
<div id="image4" class="fill " draggable="true">
<img src="https://source.unsplash.com/random/152x152"> Image 4
</div>
<div id="image5" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/153x153"> Image 5
</div>
<div id="image6" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/154x154"> Image 6
</div>
<div id="image7" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/155x155"> Image 7
</div>
<div id="image8" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/156x156"> Image 8
</div>
<div id="image9" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/157x157"> Image 9
</div>
<div id="image10" class="fill" draggable="true">
<img src="https://source.unsplash.com/random/158x158"> Image 10
</div>
</div>
JavaScript
const fills = document.querySelectorAll('.fill');
const empties = document.querySelectorAll('.empty');
let object="";
let destiny="";
// Fill listeners
for (const fill of fills) {
fill.addEventListener('dragstart', dragStart);
fill.addEventListener('dragend', dragEnd);
}
// Loop through empty boxes and add listeners
for (const empty of empties) {
empty.addEventListener('dragover', dragOver);
empty.addEventListener('dragenter', dragEnter);
empty.addEventListener('dragleave', dragLeave);
empty.addEventListener('drop', dragDrop);
}
// Drag Functions
function dragStart() {
this.className += ' hold';
setTimeout(() => (this.className = 'invisible'), 0);
console.log('Start');
objeto = this.id;
}
function dragEnd() {
//alert('Objeto: '+this.id);
this.className = 'fill';
}
function dragOver(e) {
e.preventDefault();
}
function dragEnter(e) {
e.preventDefault();
this.className += ' hovered';
}
function dragLeave() {
this.className = 'empty';
}
function dragDrop() {
//alert('Destino: '+this.id);
this.className = 'empty';
destino = this.id;
showMove();
}
function showMove()
{
alert('Moving object: '+objeto+' -> to : '+destino);
console.log('Moving object: '+objeto+' to : '+destino);
}