我正在创建一个简单的表单构建器来使用jQueryUI。我有一个表单元素的列表,就像我已经设置为可拖动的图像,设置为帮助'克隆'。我还有一个可拖放区域,我在其上设置了drop事件以读取已删除图像的id并创建一个合适的表单元素并将其附加到可放置区域。一旦我添加了新元素,我就将其设置为可拖动。问题在于,尽管新的元素具有类ui-draggable,一旦被拖动它们就被称为它们,它们是不可拖动的。我希望能够在创建它们之后将它们拖动。
这是代码: -
var itemCount = 1;
var idToAdd;
var itemToAdd;
$(document).ready(function(){
$(".draggable").draggable({
opacity:0.5,
helper: "clone"
});
$(".form_builder").droppable(
{
activeClass: "droppable_dragged",
drop: function(e, ui){
var dropped_item = ui.draggable;
switch($(dropped_item).attr("id")){
case "text_box":
idToAdd = "textBox" + itemCount;
itemToAdd = "<input id='" + idToAdd + "' type='text' />";
break;
case "text_area":
break;
case "radio":
idToAdd = "radio" + itemCount;
itemToAdd = "<input id='" + idToAdd + "' type='radio' />";
break;
case "check":
idToAdd = "check" + itemCount;
itemToAdd = "<input id='" + idToAdd + "' type='check' />";
break;
case "dropdown":
break;
case "file":
idToAdd = "file" + itemCount;
itemToAdd = "<input id='" + idToAdd + "' type='file' />";
break;
case "button":
idToAdd = "button" + itemCount;
itemToAdd = "<input id='" + idToAdd + "' type='submit' />";
break;
}
itemCount++;
$(this).append(itemToAdd);
$("#" + idToAdd).draggable();
}
});
});
答案 0 :(得分:3)
更新它不起作用的原因是输入以某种方式干扰了拖动事件。这与被删除的事实无关。我已经为元素添加了填充,现在,拖动填充,它可以工作:http://jsfiddle.net/7HUt2/4/
尝试限制变量的范围:
drop: function(e, ui){
var itemToAdd;
...
}
这将确保没有其他同步事件会破坏您的程序流程。
如果您可以直接引用它们,请避免寻找您的对象:
itemToAdd = '<input type="..."/>'; //No id necessary at this point.
$(itemToAdd).appendTo(this).draggable();
这将使其更加健壮
答案 1 :(得分:1)
无论您要附加新元素,都必须再次应用插件,因为动态添加的元素不知道自己附加的位置,如
//here you add the elements with class draggable
$(".draggable").draggable({
//settings here
});
答案 2 :(得分:0)
调用.draggable只影响现有的DOM,而不影响将来的DOM元素。因此,您需要在添加要使其可拖动的新元素后再次调用它。
答案 3 :(得分:0)
请尝试更改
$('body').append(itemToAdd)
到
$('body').append(itemToAdd).find('.draggable').draggable()
或者
$('body').append(itemToAdd);
$('.draggable').draggable();
答案 4 :(得分:0)
要让您的插件对动态添加的元素生效,您可以使用.on()
方法(自{jQuery v1.7.x以来.on()
替换.live()
),如:
$('body').on("focusin", function(){
$(".draggable").draggable({
opacity:0.5,
helper: "clone"
});
}); // on
要对问题进行排序,请为tabindex="1"
的每个元素添加class="draggable"
属性。其他插件有同样的问题,这是解决方法。
通过此解决方法,您无需按建议添加新元素后再次调用插件。