5

有一个divid parentDiv,并且有一些 div 与divlblock1中的类parentDiv

<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 中,带有 class 的 divblock1是可拖动的。

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

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

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

那是不可拖动的。

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

我们可以在div 上为它的 children定义一个click事件,如果我们在这个 div 中添加带有类按钮的新输入,所有的都将作为方面工作。#btninput.button#btn

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

4

4 回答 4

5

您可以使用带有事件的jQuery on 方法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!');
    }
});

这是一个展示它的小提琴

于 2013-05-21T12:35:20.803 回答
2

您需要使用 jquery 的“实时”功能在未来元素上添加事件和功能。

此代码是从另一篇文章中借来的(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})
于 2012-10-22T13:49:06.833 回答
1

您需要将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();
});

});

于 2012-10-22T13:45:15.670 回答
-1
$('#maindiv div").draggable({container:"#maindiv",scroll:false}) 

现在你可以做任何你想做的事

于 2013-10-04T07:25:58.813 回答