如何在父容器中使所有 div 可拖动

Posted

技术标签:

【中文标题】如何在父容器中使所有 div 可拖动【英文标题】:How to make all div draggable with in a parent container 【发布时间】:2012-10-12 08:08:51 【问题描述】:

有一个div id parentDiv,在parentDiv divl 中有一些类block1 的div

喜欢

<div id="btn"><input name="click" type="button" value="Click" class='button" /></div>

<div id="parentDiv">
    <div class="block1" style=" width:100px; height:100px; background:orange;">I am Block1</div>
    <div class="block1" style=" width:100px; height:100px; background:orange;">I am Block1</div>
</div>

在 JQuery 中,类为 block1 的 div 是可拖动的。

$(function()
    $('.block1').draggable(
        drag: function() 
           $('.block1').text('Drag Now!');
        ,
        stop: function() 
           $('.block1').text('Stop Now!');
        
    );
);

这些 div 作为方面工作,但问题是,如果通过单击 btn 输入将任何带有 block1 的新 div 附加到 parentDiv

$('#btn').on('click', 'input.button', function()
    var $newDiv=$('<div class="block1" style=" width:100px; height:100px; background:green;">I am Block1</div>');
);

这是不可拖动的。

是的,它不起作用,因为它不在 DOM 中。

我们能够在#btn div 上为其子input.button 定义一个click 事件,如果我们在这个#btn div 中添加带有类按钮的新输入,所有这些都将作为方面工作。

所以我的问题是,有没有办法让父容器parentDiv 中的所有 div 都可以拖动,就像我们可以使用#btn div 一样?

【问题讨论】:

【参考方案1】:

您可以使用jQuery on method 和mouseover 事件来绑定未初始化的可拖动子项:

$(".parentDiv").on("mouseover", ".block1", function() 

    // Use the UI pseudo-selector to check that
    // it is not already draggable
    if(!$(this).is(":ui-draggable"))
        $(this).draggable(
            /* Options */
        );
);

为方便起见,包装在一个扩展 jQuery 的函数中:

$.fn.extend(

    /**
     * Children of the element with the given selector
     * will automatically be made draggable
     * @param String selector
     *  The selector of the child / descendant elements
     *  to automatically be made draggable
     * @param Object opts
     *  The options that would normally be passed to the
     *  draggable method
     * @returns
     *  The jQuery array for chaining
     */
    draggableChildren: function(selector, opts) 

        // On using event delegation to automatically
        // handle new child events
        $(this).on("mouseover", selector, function() 

           // Check that draggable not already initialized
           if(!$(this).is(":ui-draggable"))

               // Initialize draggable
               $(this).draggable(opts);
        );

        // Return this for chaining
        return this;
    
);

您可以按如下方式使用它:

$(".parentDiv").draggableChildren(".block1", 
    drag: function() 
        $(this).text('Drag Now!');
    ,
    stop: function() 
        $(this).text('Stop Now!');
    
);

Here is a fiddle showing it in action

【讨论】:

非常感谢!如果可以的话+100。我还制作了一个 .resizable 版本。这种技术使我能够将 260 个 div 的 .draggable 和 .resizable 创建时间从 2600 ms 减少到 20 ms,因为 .d 和 .r 现在仅在需要时才初始化。最好的是:每次页面加载只需执行一次。【参考方案2】:

你需要使用jquery的“live”功能在future元素上添加事件和函数。

此代码是从另一篇文章中借用的 (http://***.com/questions/1805210/jquery-drag-and-drop-using-live-events)

(function ($) 
   $.fn.liveDraggable = function (opts) 
      this.live("mouseover", function() 
         if (!$(this).data("init")) 
            $(this).data("init", true).draggable(opts);
         
      );
      return $();
   ;
(jQuery));

现在不要这样称呼它:

$(selector).draggable(opts);

...只需使用:

$(selector).liveDraggable(opts)

【讨论】:

是的,它正在工作。但正如 jquery doc 所说,不推荐使用 live() 方法。我们如何使用它来使用 live。【参考方案3】:

您需要将containment 属性设置为 parent 以限制区域。

$("#yourItem" ).draggable( containment: "parent" );

要为新的动态项目启用可拖动,您可以做的是,将绑定可拖动功能的代码移动到一个方法,并在将新项目添加到 DOM 后调用该方法

 function BindDraggable()
 
    $('.block1').draggable(
        drag: function() 
           $('.block1').text('Drag Now!');
        ,
        stop: function() 
           $('.block1').text('Stop Now!');
        ,
        containment: 'parent'
    );
 

现在在文档准备好并添加新内容后立即调用它

$(function()
  BindDraggable();

  $('#btn').on('click', 'input#button', function()
    var $newDiv=$('<div class="block1" style=" width:100px; height:100px; background:green;">I am Block1</div>');
    //to do :attach the new item to the DOM

    BindDraggable();
);

);

【讨论】:

是的,目前我正在使用你描述的,但是有没有办法只调用这个 BindDraggable() 一次,并且它适用于新的一次。【参考方案4】:
$('#maindiv div").draggable(container:"#maindiv",scroll:false) 

现在你可以为所欲为

【讨论】:

据我所知,可拖动对象中没有container 选项。你的意思是containment..?

以上是关于如何在父容器中使所有 div 可拖动的主要内容,如果未能解决你的问题,请参考以下文章

如果所有三个容器都是使用一种方法呈现的,我怎样才能在 Dragula 中使所有三个容器都可拖动?使用 React js 和 Dragula(不是 react-dragula)

在 Jquery 中使新的 div 可拖动

如何使嵌套元素在可拖动容器中不可拖动?

jQuery 可拖动,放置在父 div 之外时的事件

如何在jquery中使动态添加的列表元素可拖动?

如何从可滚动的 div 拖动到 droppable 然后再次拖动?