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

时间:2012-10-22 13:43:20

标签: jquery-ui draggable jquery

div标识为parentDivblock1 divl

中有一些类parentDiv的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正在作为方面工作,但问题是,如果block1中有parentDiv的任何新div通过点击btn输入添加,如

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

不可拖动。

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

我们可以在click div上为其子#btn定义input.button事件,如果我们在此#btn div中添加带有类按钮的新输入,则所有将作为方面工作。

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

4 个答案:

答案 0 :(得分:5)

您可以将jQuery on methodmouseover事件结合使用来绑定未初始化的可拖动子项:

$(".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

答案 1 :(得分:2)

您需要使用jquery的“live”函数在未来元素上添加事件和函数。

此代码借鉴自另一篇文章(http://stackoverflow.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})

答案 2 :(得分:1)

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

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

要为新动态项启用draggable,您可以执行的操作是,将将draggablity功能绑定的代码移动到方法,并在将新项添加到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();
});

});

答案 3 :(得分:-1)

$('#maindiv div").draggable({container:"#maindiv",scroll:false}) 

现在你可以做你想做的事了