【问题标题】:how do i make dynamically created elements draggable()?我如何使动态创建的元素可拖动()?
【发布时间】:2013-09-18 07:41:53
【问题描述】:

我试图弄清楚如何使动态创建的 div 可拖动,所以我创建了 this very simple thing 来帮助我。我知道我必须将 on() 事件与非动态处理程序一起使用。通过让 body 元素处理链接的 JSfiddle 中的克隆事件,我成功地使动态创建的 div 可克隆,但它们不可拖动。我究竟做错了什么?

提前感谢您的帮助!

$(document).ready(function () {
    $("body").on('click', '.pink', function () {
        $('.container').append($("<div class='bl pink'></div>"))
    });
    $("body").on('click', '.blue', function () {
        $('.container').append($("<div class='bl blue'></div>"))
    });
    $("body").on('click', '.coral', function () {
        $('.container').append($("<div class='bl coral'></div>"))
    });
    $(".draggable").draggable();
});

【问题讨论】:

  • 你没有将类“可拖动”放在元素中
  • 哇,好收获。我不敢相信我错过了。我觉得很傻!

标签: javascript jquery draggable


【解决方案1】:

在创建时将类“可拖动”或 id 放入元素中。 (你没有上课)然后代码应该可以工作

$('.container').append($("<div class='bl pink draggable'></div>"));
$('.draggable').draggable() 

【讨论】:

  • id 有多个时怎么办?
  • 将类放入要运行的元素中
  • 或内联:$('.container').append($("&lt;div class='bl pink draggable'&gt;&lt;/div&gt;").draggable());
  • 我有使用 after : $("#" + appendID).after(NewDropPanelv).droppable();
【解决方案2】:

我会做类似this的事情

我在将元素添加到容器后调用draggable 方法,如下所示:

 $("<div class='bl pink'></div>").appendTo('.container').draggable();

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。接受的答案当然有效,但我一直在寻找更清洁、更集中的解决方案。我不想在脚本插入新元素的每个地方都显式调用 .draggable()。

    我决定在父元素上监听 DOM 插入,然后在插入的子元素上应用 .draggable()。例如:

    $("#Parent").on("DOMNodeInserted", ".ChildClass", function() { $(this).draggable(); });
    

    查看这个小提琴的演示:http://jsfiddle.net/9hL7u95L/

    【讨论】:

    【解决方案4】:

    使用

    $("<div class='bl blue'></div>").draggable().appendTo($('.container'));
    

    DEMO

    $(document).ready(function () {
    
        $('.container').on('click', '.pink', function () {
            $("<div class='bl blue'></div>").draggable().appendTo($('.container'));
        });
    
        $('.container').on('click', '.blue', function () {
            $("<div class='bl blue'></div>").draggable().appendTo($('.container'));
        });
        $('.container').on('click', '.coral', function () {
            $("<div class='bl coral'></div>").draggable().appendTo($('.container'));
        });
    
        $(".draggable").draggable();
    });
    

    .appendTo

    【讨论】:

    • 您不需要将 jquery 元素传递给 appendTo
    • 我没有说它不起作用。只是没有必要/错误,您正在创建一个不需要实例的实例
    【解决方案5】:

    将可拖动类添加到动态添加的元素中。

    $(document).ready(function () {
        $("body").on('click', '.pink', function () {
            $('.container').append($("<div class='bl pink draggable'></div>"));
            $(".draggable").draggable();
        });
        $("body").on('click', '.blue', function () {
            $('.container').append($("<div class='bl blue draggable'></div>"));
            $(".draggable").draggable();
        });
        $("body").on('click', '.coral', function () {
            $('.container').append($("<div class='bl coral draggable'></div>"));
            $(".draggable").draggable();
        });
    
    });
    

    【讨论】:

    • 与@Harry 的回答相同,如果您想要每个元素的特定行为,这可能是个问题
    • 然后为每一个使用一个特定的ID。 $('.container').append($("
      ")); $("#someid").draggable();
    • 或者,您可以查看我的答案
    • 我有使用 after : $("#" + appendID).after(NewDropPanelv).droppable();但我的 div droppable 不起作用
    【解决方案6】:

    您可以通过以下方式进行:

    $(document).ready(function () {
    
        $('.container').on('click', '.pink', function () {
            $('.container').append($("<div class='bl pink draggable'></div>"));
            $('.draggable').draggable();
        });
    
        $('.container').on('click', '.blue', function () {
            $('.container').append($("<div class='bl blue draggable'></div>"));
            $('.draggable').draggable();
        });
        $('.container').on('click', '.coral', function () {
            $('.container').append($("<div class='bl coral draggable'></div>"));
            $('.draggable').draggable();
        });
        $('.draggable').draggable();
    
    });
    

    Working Demo

    【讨论】:

    • 有了这个,你就想起了draggable() 已经可以拖动的元素。如果您想要每个元素的特定行为,这可能是一个问题
    • @NicoSantangelo:抱歉,我没有理解您所说的每个元素的特定行为 的意思。要求只是使动态元素也只能拖动对吗?
    • 对不起,如果我不清楚。我的意思是你可能想用不同的选项调用draggable,而$('.draggable').draggable([options]); 将对每个元素进行调用,而不是新元素。无论如何都没有错,我只是指出来
    • @NicoSantangelo:别担心,伙计,改进/指出项目并没有错 :) 我现在明白你的意思了。在这种情况下,我们可以将id 附加到div 或为每个独特的行为指定一个特定的class,并根据需要修改.draggable 调用。
    • @NicoSantangelo Btw,为您的样品和其他样品 +1。我看到我们中的许多人或多或少同时发布了工作选项。 OP 只能接受一个 :)
    【解决方案7】:

    我在您的小提琴中添加了一些内容,希望对您有所帮助:http://jsfiddle.net/m3BXZ/8/

    基本上我已经创建了一个名为 startDrag 的函数,它使新块可拖动:

    function startDrag(){
        $(".bl").draggable();
    }
    

    有很多方法可以做到这一点,只需找到最适合您的解决方案。

    【讨论】:

      【解决方案8】:

      试试这个(示例):

             $('.btn-hotspot-add').click(function(){
                  //Create element and append draggable action
                  var element = $('<span class="hotspot"></span>').draggable({
                      'containment': "parent",
                      'stop': function(elm){
                          //Sample stop action
                          var parentWith = elm.target.offsetParent.offsetWidth;
                          var parentHeight = elm.target.offsetParent.offsetHeight;
                          var x = elm.target.offsetLeft;
                          var y = elm.target.offsetTop;
                          console.log(parentWith+'x'+parentHeight+' - '+x+'x'+y );
      
                      }
                  });
      
                  //Append draggable element to parent container
                  $('#parent').append(element);
              });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多