我想记住或获取当前拖动元素的数据。这就是我所做的:
$('.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();
});
第一个console.log显示[object HTMLDivElement]
为字符串,而不是对象,第二个undefined
,第三个引发错误。
所以我怀疑dataTransfer.setData
只接受数据作为字符串,不允许使用对象。如果是这种情况,你如何解决这个问题,如何在不知道其特定ID的情况下记住被拖动的元素?
答案 0 :(得分:3)
只需使用一些字符串来唯一标识元素,例如为每个元素赋予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();
});
答案 1 :(得分:1)
我不喜欢全局变量,但是有时候它们适合这个问题。如果您希望能够使用某些数据移动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];
});
答案 2 :(得分:0)
您也可以通过将字符串化的 JSON 对象插入到 dataTransfer.setData 部分来实现:
添加 HTML 元素(使用 outerHTML 使其成为字符串):
var dragData = {element:originalElement.outerHTML, type:'move-hovered'}
dragData = JSON.stringify(dragData);
event.dataTransfer.setData("text/plain", dragData);
在上面,我用 2 个键创建了 dragData
对象 - 一个是 element
,另一个 move-hovered
只是拖动事件的名称,所以你可以识别。
然后在丢弃时 JSON 解析它:
var data = e.dataTransfer.getData("text");
var dragData = JSON.parse(data)
var element = dragData.element
不确定可以传递的文本长度是否有限制,但这对我有用。但主要问题是没有引用原始 HTML 元素,因为使用了新字符串。
并且您必须在删除时重新创建 HTML 节点:
var dragDataElement = document.createElement('div')
dragDataElement.innerHTML = dragData.element
originalElement = dragDataElement.firstChild