我有一个类似的问题,需要更详细的结果。我的系统从左侧的一个 div 中拖动,该 div 包含具有表单元素名称和 id 的其他 div,这些 div 拖放到右侧的一个可排序的 div 中,该 div 将成为一个网络表单。因为我需要右边的 div 与表单的内容非常相似而没有额外的标记,所以使用无序列表是不可能的,除非我想在进入数据库的过程中做一堆“清理”。不,谢谢。在我的示例中,当我从左侧列表中拖动时,我必须使用被拖动元素的 id 通过 ajax 查找一些东西,然后将标签、表单元素和验证放入列表中根据该ajax的结果离开。为了清楚起见,我从示例中删除了 ajax。
因此,从本质上讲,您正在使用两个并排的 div,通过列表连接进行可拖动和可排序。关键是您必须使用 Sortable 中的回调函数。只有在将新元素添加到可排序列表时才会触发“接收”回调。这很重要,因为您必须进行区分,这样您的更改也不会在排序时发生。但是,您不能单独使用“接收”,因为如果您尝试在该回调中操作 html,您将影响您从中拖动的列表,而不是您拖动到的列表。为了跟踪它是添加列表还是拖动,我将 $.data 中名为“newlement”的变量设置为 1,如果它是列表添加,然后我检查更新回调以查看是否应该影响拖动的 html或不。就我而言,我不
所以,HTML:
<div class='master_list'>
<div id="2">First Name</div>
<div id="3">Last Name</div>
</div>
<div id="webform_container">
</div>
和 jQuery:
$( ".master_list div" ).draggable({
connectToSortable: "#webform_container",
helper: "clone",
revert: "invalid"
});
$( "#webform_container" ).sortable({
revert: true,
cursor: 'pointer',
placeholder: "placeholderdiv",
connectWith: '.master_list',
start: function() {
/* Clear the value of newelement at start */
$(this).data('newelement', 0);
},
receive: function(event, ui) {
/* Get id from function and pass to the update to do stuff with */
$(this).data('id', ui.item[0].id);
/* Set value of newelement to 1 only when new element is added to list */
$(this).data('newelement', 1);
},
update: function(event, ui) {
/* If newelement ==1, this is a new element to the list, transform it */
if ($(this).data('newelement') == 1) {
var fieldname = ui.item.text();
ui.item.html('your new html here');
}
}
});