div
标识为parentDiv
,block1
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一样?
答案 0 :(得分:5)
您可以将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!');
}
});
答案 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})
现在你可以做你想做的事了