【问题标题】:How to dynamically add an ondragstart event to a dynamically created div如何将 ondragstart 事件动态添加到动态创建的 div
【发布时间】:2013-08-06 21:10:22
【问题描述】:

似乎有几个问题在问这个问题,但没有人接受答案,也没有对我有用。

我有一个“组”按钮,当单击它时,将动态创建一个“组”div(然后我在其中附加一些预先选择的“子”div)
但是我需要新的“组”div 是可拖动的。
我可以动态设置draggable属性,没问题。 但是,如果没有 ondragstart() 事件,可拖动并没有多大好处,而且无论我尝试了什么,我都无法得到这个分配。
我正在使用可能有影响的 jQuery。

我的代码的最新迭代是(这出现在从 body.onload 调用的 init() 函数中):

var group=$(document.createElement('div'));
group.attr({id: 'group'+grpcount});
group.attr({draggable: "true"});
group.addClass('group');
group.html("<span class='group'>Group"+grpcount+"</span>");
$('#boundary').append(group);   
document.getElementById('group'+grpcount).addEventListener("startdrag",drag);

但我也尝试过 jQuery .bind 的各种组合:

group.bind("dragstart", drag(ev));
group.bind("dragstart", function(ev){drag(ev);});

一切都无济于事。

我已经定义了一个拖动功能(我已经尝试将它放在上面的代码之前和之后):

function drag(ev) {
    ev.dataTransfer.setData("Text",ev.target.id+":"+ev.pageX+":"+ev.pageY);
}

我希望有一些我看不到的非常明显的东西。
有人可以解决这个问题吗?

【问题讨论】:

  • group.bind("dragstart", function(ev){drag(ev);}); 应该可以正常工作。 group.bind("dragstart", drag); 也应该如此。请参阅:jsfiddle.net/K4hgw
  • 你能提供一个jsfiddle的例子吗?

标签: javascript jquery dom javascript-events


【解决方案1】:

你最好看看Jquery UI draggable here

如果您还不知道,您可以在一个链中调用多个 jquery 函数,这样您的代码看起来更具可读性,如下所示:

var group=$('div').attr('id', 'group'+grpcount)
                  .addClass('group')
                  .html("<span class='group'>Group"+grpcount+"</span>");

$('#boundary').append(group);   

而不是

document.getElementById('group'+grpcount).addEventListener("startdrag",drag);

使用这个

group.draggable({
    start:function(event, ui){
         //this is where dragging starts when you push mousedown and move mouse
    },
    drag:function(event, ui){
         //this function will be called after drag started each time you move your mouse
    }
    stop:function(event, ui){
         //this is where you release mouse button
    }
})

如果你真的想实现复杂的拖放功能,这个带有droppable 小部件的 jquery 可拖动小部件会让你的生活变得轻松

【讨论】:

  • 很高兴了解 jQuery 结构。最后我这样做了:var group=$(document.createElement('div')).attr('id', 'group'+grpcount) .addClass('group') .html("&lt;span class='group'&gt;Group"+grpcount+"&lt;/span&gt;"); 否则它将更改应用于我所有的“div”。我尝试了 group.draggable() 方法,但得到一个错误“group.draggable 不是函数”(我添加了奇怪的 , 和 ; 我认为应该存在但仍然是相同的错误)。一定与组的范围/取消引用有关吗?我将围绕 jQuery UI 进行更多探索以了解更多信息。感谢您的帮助。
  • 啊,我只包括 Jquery,不包括 JQuery UI(doh!),将继续进行重新测试...
  • 是的,这与 Robert R 解决方案一样有效,将问题转移到未定义的 ev.dataTransfer 上。所以从技术上讲,你们都回答了原始问题,但不认为我可以多选正确答案。
【解决方案2】:

我做了这个:

function drag(ev) {  alert('Hi');  }

var grpcount = 21;
var group=$(document.createElement('div'));
group.attr({id: 'group'+grpcount});
group.attr({draggable: "true"});
group.addClass('group');
group.html("<span class='group'>Group"+grpcount+"</span>");
group.bind("dragstart", function(ev){drag(ev);});
$('#boundary').append(group);  

在此处查看工作小提琴:http://jsfiddle.net/nxcSz/

【讨论】:

  • 谢谢,看到你的小提琴工作帮助我坚持下去,我现在可以证明事件调用正在工作,我的问题实际上是 ev.dataTransfer 未定义(似乎只是动态附加事件处理程序的问题- 当我静态定义一个组并在 HTML 中附加处理程序时,它的行为都符合预期)。我怀疑在整个过程中使用 jQuery 将是我解决此问题的唯一方法,因此将探索@Armen 指出的一些内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多