简体   繁体   English

如何使用 html5 event.dataTransfer 传输整个元素?

[英]How to transfer the whole element using html5 event.dataTransfer?

I want to remember or get data of the current drag element.我想记住或获取当前拖动元素的数据。 This is what I did :这就是我所做的:

$('.source_element').on('dragstart', function(e){
   e.originalEvent.dataTransfer.setData("source", this); 
});

$('.destination').on('drop', function(e){
   var source = e.originalEvent.dataTransfer.getData('source');
   console.log(source);
   console.log(source.className);
   console.log($(source));
   $(this).html($(source).html());

   e.preventDefault();
});

The first console.log show [object HTMLDivElement] as a string, not an object, second undefined , third throws an error.第一个 console.log 将[object HTMLDivElement]显示为字符串,而不是对象,第二个undefined ,第三个抛出错误。

So I suspect that dataTransfer.setData only accept the data as a string, object is not allowed.所以我怀疑dataTransfer.setData只接受数据作为字符串,对象是不允许的。 If that's the case, how do you solve this problem, how can I remember which element is being dragged without knowing its specific ID ?如果是这种情况,你如何解决这个问题,我如何在不知道其特定 ID 的情况下记住哪个元素被拖动?

Just use some string to uniquely identify the element, like giving each element an id or a data attribute只需使用一些字符串来唯一标识元素,例如给每个元素一个 id 或一个数据属性

$('.source_element').on('dragstart', function(e){
   var id = 'drag-'+(new Date()).getTime();
   this.id = id;
   //$(this).attr('data-drag', id);
   e.originalEvent.dataTransfer.setData("source", id); 
});

$('.destination').on('drop', function(e){
   var source = e.originalEvent.dataTransfer.getData('source');
   console.log(source);
   console.log($('#'+source));
   $(this).html($('#'+source).html());
   //console.log($('[data-id="'+source+'"]'));
   //$(this).html($('[data-id="'+source+'"]').html());

   e.preventDefault();
});

I'm not a fan of globals, but sometimes they suit the problem.我不是全局变量的粉丝,但有时它们适合问题。 If you want to be able to move an HTMLElement with some data, try this:如果您希望能够移动带有某些数据的 HTMLElement,请尝试以下操作:

window.dragDepo = {};
const dragID = "unique_dragging_name";
sourceEl.addEventListener("dragstart", (event) => {
  window.dragDepo[dragID] = { el: sourceEl, origin: "where it was before" }
  event.dataTransfer.setData("text/plain", dragID);
});

// clear global data asap
sourceEl.addEventListener("dragend", (event) => window.dragDepo[dragID] = undefined);

. .

destinationEl.addEventListener("drop", (event) => {
  const dragID = event.dataTransfer.getData("text/plain");
  dragData = window.dragDepo[dragID];
});

You could also do this by inserting a stringified JSON object to the dataTransfer.setData part:您也可以通过将字符串化的 JSON 对象插入到 dataTransfer.setData 部分来做到这一点:

Add the HTML element (use outerHTML so it's a string):添加 HTML 元素(使用 outerHTML,所以它是一个字符串):

var dragData = {element:originalElement.outerHTML, type:'move-hovered'}
dragData = JSON.stringify(dragData);
event.dataTransfer.setData("text/plain", dragData);

In the above, I create the dragData object with 2 keys - one is the element , and the other, move-hovered , is just a name for the drag event, so you can identify it.在上面,我使用 2 个键创建了dragData对象 - 一个是element ,另一个, move-hovered ,只是拖动事件的名称,因此您可以识别它。

Then JSON parse it when dropped:然后在丢弃时 JSON 解析它:

var data = e.dataTransfer.getData("text");
var dragData = JSON.parse(data)
var element = dragData.element

Not sure if there's a limit on the length of the text that can be passed, but this is working for me.不确定可以传递的文本长度是否有限制,但这对我有用。 The main issue though is that there is no reference to the original HTML element, as a new string is used.但主要问题是没有对原始 HTML 元素的引用,因为使用了新字符串。

And you have to recreate the HTML node when dropped:并且您必须在删除时重新创建 HTML 节点:

var dragDataElement = document.createElement('div')
dragDataElement.innerHTML = dragData.element
originalElement = dragDataElement.firstChild

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 手动调用事件时如何使用 event.dataTransfer 设置数据? - How to set Data using event.dataTransfer when event was invoked manually? event.dataTransfer 在 setTimeout 函数中丢失其项目 - event.dataTransfer loses its items inside setTimeout function 拖动开始后可以异步设置 event.dataTransfer 吗? - Possible to set event.dataTransfer asynchronously after drag start? firefox ondrop event.dataTransfer 更新到版本 52 后为 null - firefox ondrop event.dataTransfer is null after update to version 52 在dragstart事件处理程序中,event.dataTransfer和event.originalEvent始终为null - event.dataTransfer and event.originalEvent are always null inside dragstart event handler Chrome / IE 10 / Edge中Event.dataTransfer中“ text / x-moz-url”的替代方法 - alternative for “text/x-moz-url” in Chrome / IE 10/Edge in Event.dataTransfer HTML5的dataTransfer.setDragImage和Blob - HTML5's dataTransfer.setDragImage and Blobs 如何在HTML5放置事件的特定位置附加数据传输内容 - How to append data transfer content at specific location on HTML5 drop event 如何在webGL和HTML5中移动整个场景? - How to move the whole scene in webGL and HTML5? 跨浏览器HTML5拖放JSON DataTransfer失败 - Cross-browser HTML5 Drag and Drop JSON DataTransfer fails
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM