将 ondragstart 处理程序添加到动态创建的图像

Tri*_*iFu 1 html javascript drag-and-drop

我正在尝试向我动态创建的图像添加一个 ondragstart 处理程序:

var image = new Image();
    image.src = "https://www.filepicker.io/api/file/JhJKMtnRDW9uLYcnkRKW";
    image.onload = function(event){
        this.ondragstart = drag(event);
        divImage.appendChild(this);
    };
function drag(ev)
    {
        ev.dataTransfer.setData("Text",ev.target.id);
    }
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误消息:Uncaught TypeError: Cannot call method 'setData' of undefined

我已经尝试过使用通过 dom 加载的静态图像,它工作正常,但为什么我的动态生成的图像不起作用?出于某种原因,在拖动功能中,当它是动态创建的图像时,ev 不包含 dataTransfer 对象?有谁知道为什么?

这就是我想要做的: http://www.w3schools.com/html/tryit.asp?filename=tryhtml5_draganddrop 除了,我希望能够通过 javascript 动态创建图像,并将 ondragstart 处理程序添加到它。

谢谢,

Tyb*_*itz 5

因为动态生成的元素不属于页面加载时的 DOM,所以您需要对addEventListener元素的每个新实例进行处理,如下所示:

this.addEventListener('dragstart', function() {drag(ev)}, false);
Run Code Online (Sandbox Code Playgroud)

我在这里创建了一个小提琴,向您展示它的工作原理(对您的代码进行了一些修改和一些假设)。

img 首先加载到蓝色的“body”div 中,如果您快速单击按钮几次,您将看到这一点。

这篇 Stackoverflow 帖子与您的帖子密切相关:Javascript ondrag、ondragstart、ondragend

编辑:正如帖子中所述,如果您想要一个用于拖动事件的跨浏览器解决方案,最好使用 js 框架。

  • @SuperUberDuper 也许你混淆了这两种语法:`elem.ondragstart = function() { ... }` 和 `elem.addEventListener('dragstart', function() {...}, false)`; 注意当使用 addEventListener 时它是 *dragstart*,而不是 *ondragstart* (2认同)