Description
我正在尝试向canvas元素添加拖放功能 . 我观察到浏览器本身支持拖放图像元素,拖动的图像也可以直接添加到gmail或保存在计算机上 .

Considered Solution1
1.我将拖动的元素('canvas')包装在div标签中,并为其添加'draggable' true属性 .
2.我将一个图像元素(使用 canvas.toDataURL('images/png') )附加到父拖动的div并隐藏图像 .
3.一旦dragStart触发,我就会显示图像元素并隐藏数据元素 .

Problem
不幸的是,这似乎不起作用 . 被拖动的事件仍然认为这是一个div .
(例如:这不能放在Gmail电子邮件中) .

Investigation till now
我找到的关键区别是拖动的事件,其中有一个名为targetElement的属性,sourceElement和toElement被设置为div(在我的情况下)与img相比(如果div中只有一个图像) .

将事件对象在我的情况(DIV '画布')sourceCapabilities:InputDeviceCapabilities srcElement:DIV#test_container <==这是一个div目标:DIV#test_container <==这是DIV时间戳:1454458126932 toElement:DIV#test_container <= =这是div类型:“dragstart”

与...相比

在只有图像的div中拖动事件 . sourceCapabilities:InputDeviceCapabilities srcElement:IMG#MYTEST <==这是IMG目标:IMG#MYTEST <==这是IMG时间戳:1454458674491 toElement:IMG#MYTEST <==这是IMG类型: “的dragstart”

Questions
1.我可以在拖动的事件中动态更改srcElement和targetElement吗?
2.我是否可以通过API调用浏览器来重新计算拖动的事件?
3.是否有一个事件在dragEvent启动之前被触发,以便我可以在那里翻转?

MyCode For Reference

27   function createImage(svgText) {
 28       var canvas = document.getElementById('myCanvas');
 29         return canvas.toDataURL('image/png');
 30     }
 31     function cacheImage(containerId) {
 32         var container = d3.select('#' + containerId),
 33             imageEle = new Image();
 34         imageEle.src = createImage(container.html().trim());
 36         imageEle.id = 'myTest';
 37         imageEle.style.display = 'none';
 38         document.getElementById(containerId).appendChild(imageEle);
 39         container.select('svg').style('display', 'none');
 40         container.select('#myTest').style('display', 'block');
 41         return imageEle;
 42     }
 43     function flip(containerId) {
 44         var container = d3.select('#' + containerId);
 45         container.select('canvas').style('display', 'none');
 46         container.select('#myTest').style('display', 'block');
 47     }
 48     function flipBack(containerId) {
 49         var container = d3.select('#' + containerId);
 50         container.select('canvas').style('display', 'block');
 51         container.select('img').style('display', 'none');
 52     }
 53     function attachDragDrop(containerId) {
 54         var parentDiv = d3.select('#' + containerId),
 55             parentEle = document.getElementById(containerId);
 56         cacheImage(containerId); // Add an Image
 57         parentDiv.attr('draggable', 'true');
 58         parentEle.addEventListener('dragstart', function(ev){
 59             flip(containerId);
 60         }, false);
 61         parentEle.addEventListener('dragend', function() {
 62                 flipBack(containerId);
 63           }, false);
 64     }

谢谢您的帮助 .