jquery,dataTransfer 不存在于任何事件(或任何地方)
jquery, dataTransfer not existing in any event (Or anywhere)
当我尝试在 'LI' 元素上实现 SetDragImage 时,我遇到了一个问题,'LI' 是动态创建的,在文件夹内部搜索并获取其中文件的名称,创建后我设置了 .draggable() 属性
我可以拖放,拖动时显示的图像是文本,所以我想更改它并显示自定义图像。每个id'LI'包含图片的来源(路径+文件名)
我正在尝试使用 SetDragImage,但每次出现错误“Uncaught TypeError: Cannot read 属性 'SetDragImage' of undefined
我也试过在没有 "originalEvent" 的情况下这样做,但我得到了同样的错误
有人可以帮我找出错误吗?
请在下面找到我的代码
提前致谢
祝你有美好的一天
HTML 节:
<div class="toolGridContainer">
<div class="containerTitle">Container1</div>
<div class="containerSeparator">
<hr>
</div>
<li id="./images/Image1.svg" class="toolItem ui-draggable ui-draggable-handle">Item 1</li>
<li id="./images/Image2.svg" class="toolItem ui-draggable ui-draggable-handle">Item 2</li>
<li id="./images/Image3.svg" class="toolItem ui-draggable ui-draggable-handle">Item 3</li>
<li id="./images/Image4.svg" class="toolItem ui-draggable ui-draggable-handle">Item 4</li></div>
Javascript:
$(document).on('dragstart', '.toolItem', function(evt){
var imgObj = document.createElement('img');
imgObj.src = $(this).prop('id');
evt.originalEvent.dataTransfer.setDragImage(imgObj, 0, 0);
});
编辑 1:
这是我为重现问题所做的 JSFiddle
编辑 2:
我做了一个测试div,手动让它可以拖动,还有一个测试函数来查看setDragImage在其他事件中是否可用,这个函数工作正常,为什么?
HTML:
<li id="testItem" draggable="true" class="toolItem">TestItem</li>
Javascript:
var testFunction = function(evt){
console.log('testFunction running');
var dataTransfer = evt.dataTransfer;
var imgObj = document.createElement('img');
imgObj.src = './image.svg';
dataTransfer.setDragImage(imgObj, 0, 0);
}
var testElement = document.getElementById('testItem');
testElement.ondragstart = testFunction;
可以 quite 告诉你你想要什么吗?你从一些纯粹的 javascript 开始,然后添加到 jquery ui 的可拖动中。 JSFiddle 是可拖动的,所以只是对其进行了修改。
你基本上只需要修改辅助函数。
<style>
.dropContainer{
background-color: blue;
height: 200px;
width: 500px;
}
</style>
<div id="itemsList" class="toolContainer">
<div class="toolGridContainer">
<div class="containerTitle">Tool item container</div>
<div class="containerSeparator">
<hr>
</div>
</div>
</div>
<div id="dropContainer" class="dropContainer">
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script>
var getFileList = function (id){
for (i = 0; i < 5; i++) {
var newElement = document.createElement('li');
var newElementText = document.createTextNode('Item' + i);
newElement.className = 'toolItem';
newElement.appendChild(newElementText);
newElement.id = './image.svg';
$(newElement).draggable({
helper: function(e) {
image = $(this).attr('id');
var imgObj = document.createElement('img');
imgObj.src = image;
return imgObj;
},
cursor: 'dragging'
});
$(id).append(newElement);
}
}
//Drop area
$('#dropContainer').droppable({
accept: '.toolItem',
tolerance: 'pointer',
drop: function(evt, ui){
var canvasObj = document.createElement('canvas');
canvasObj.className = 'droppedItem';
var ctx = canvasObj.getContext('2d');
ctx.beginPath();
ctx.rect(20, 20, 10, 10);
ctx.stroke();
$(canvasObj).draggable().appendTo('#dropContainer');
}
});
getFileList('#itemsList');
</script>
当我尝试在 'LI' 元素上实现 SetDragImage 时,我遇到了一个问题,'LI' 是动态创建的,在文件夹内部搜索并获取其中文件的名称,创建后我设置了 .draggable() 属性
我可以拖放,拖动时显示的图像是文本,所以我想更改它并显示自定义图像。每个id'LI'包含图片的来源(路径+文件名)
我正在尝试使用 SetDragImage,但每次出现错误“Uncaught TypeError: Cannot read 属性 'SetDragImage' of undefined
我也试过在没有 "originalEvent" 的情况下这样做,但我得到了同样的错误
有人可以帮我找出错误吗?
请在下面找到我的代码
提前致谢
祝你有美好的一天
HTML 节:
<div class="toolGridContainer">
<div class="containerTitle">Container1</div>
<div class="containerSeparator">
<hr>
</div>
<li id="./images/Image1.svg" class="toolItem ui-draggable ui-draggable-handle">Item 1</li>
<li id="./images/Image2.svg" class="toolItem ui-draggable ui-draggable-handle">Item 2</li>
<li id="./images/Image3.svg" class="toolItem ui-draggable ui-draggable-handle">Item 3</li>
<li id="./images/Image4.svg" class="toolItem ui-draggable ui-draggable-handle">Item 4</li></div>
Javascript:
$(document).on('dragstart', '.toolItem', function(evt){
var imgObj = document.createElement('img');
imgObj.src = $(this).prop('id');
evt.originalEvent.dataTransfer.setDragImage(imgObj, 0, 0);
});
编辑 1: 这是我为重现问题所做的 JSFiddle
编辑 2: 我做了一个测试div,手动让它可以拖动,还有一个测试函数来查看setDragImage在其他事件中是否可用,这个函数工作正常,为什么?
HTML:
<li id="testItem" draggable="true" class="toolItem">TestItem</li>
Javascript:
var testFunction = function(evt){
console.log('testFunction running');
var dataTransfer = evt.dataTransfer;
var imgObj = document.createElement('img');
imgObj.src = './image.svg';
dataTransfer.setDragImage(imgObj, 0, 0);
}
var testElement = document.getElementById('testItem');
testElement.ondragstart = testFunction;
可以 quite 告诉你你想要什么吗?你从一些纯粹的 javascript 开始,然后添加到 jquery ui 的可拖动中。 JSFiddle 是可拖动的,所以只是对其进行了修改。
你基本上只需要修改辅助函数。
<style>
.dropContainer{
background-color: blue;
height: 200px;
width: 500px;
}
</style>
<div id="itemsList" class="toolContainer">
<div class="toolGridContainer">
<div class="containerTitle">Tool item container</div>
<div class="containerSeparator">
<hr>
</div>
</div>
</div>
<div id="dropContainer" class="dropContainer">
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
<script>
var getFileList = function (id){
for (i = 0; i < 5; i++) {
var newElement = document.createElement('li');
var newElementText = document.createTextNode('Item' + i);
newElement.className = 'toolItem';
newElement.appendChild(newElementText);
newElement.id = './image.svg';
$(newElement).draggable({
helper: function(e) {
image = $(this).attr('id');
var imgObj = document.createElement('img');
imgObj.src = image;
return imgObj;
},
cursor: 'dragging'
});
$(id).append(newElement);
}
}
//Drop area
$('#dropContainer').droppable({
accept: '.toolItem',
tolerance: 'pointer',
drop: function(evt, ui){
var canvasObj = document.createElement('canvas');
canvasObj.className = 'droppedItem';
var ctx = canvasObj.getContext('2d');
ctx.beginPath();
ctx.rect(20, 20, 10, 10);
ctx.stroke();
$(canvasObj).draggable().appendTo('#dropContainer');
}
});
getFileList('#itemsList');
</script>