jQuery draggable sortable,在删除元素上更改html

我正在设计一个表单构建界面。 所有可用字段都位于界面左侧的无序列表中,右侧有一个大的空无序列表,它将成为我的webform。 使这个界面工作的“技巧”是将左侧的列表项转换为有效的html元素,方法是在将它们附加到右侧的可排序列表之前将html附加到droppable ui元素中。

我有它…大多数…使用draggable()和sortable()。 目前,我使用sortable的receive事件从draggable元素中获取id,我将其置于data()块中以传递给update事件。 从那里,我使用id元素进行ajax调用,确定它是什么类型的字段以及应该从后端添加哪些选项,构建元素,然后使用ui.item.html将其放入界面中,这是更新函数传递的元素。

我的方法的问题是它在拖动元素时也会触发,这会导致选择元素在无意中附加到可排序列表时乱丢屏幕。 显然,receive事件是仅在sort从连接列表中获取项目时触发的事件。 但是,如果我尝试内部html ui.item元素,它会更改源列表,而不是所需的目标。 当项目已经在右侧的网络表单列表中时,如果它们只是被排序,我绝对不想修改它们。

有没有办法在连接的sortable()列表接收事件中访问和更改目标html? 还有其他策略可以解决我的挑战吗?

代码:

 

Available Fields

  • First Name
  • Last Name
  • Company

Webform

<input type="hidden" name="webform_id" id="webform_id" value="">

    和jQuery

     /***** Make webform fields draggable *****/ $( ".master_list li" ).draggable({ connectToSortable: "#webform_list", helper: "clone", revert: "invalid" }); /***** Make form elements sortable *****/ $( "#webform_list" ).sortable({ revert: true, cursor: 'pointer', placeholder: "placeholderdiv", receive: function(event, ui) { $(this).data('id', ui.item[0].id); var element = event.target }, update: function(event, ui) { var fieldname = ui.item.text(); if ($(this).data('id')) { $.ajax({ url: "/webform/getFieldAttributes", timeout: 30000, type: "POST", data: 'id='+$(this).data('id'), dataType: 'json', error: function(XMLHttpRequest, textStatus, errorThrown) { alert("An error has occurred making the request: " + errorThrown) }, success: function(data){ switch (data.control_type) { case 'text': var inputfield = $('').attr('id', 'fieldname'); var field = (ui.item).text(); switch (field) { case 'Email Address': inputfield.addClass('validate[optional,custom[email]]'); break; default: inputfield.addClass('validate[required]'); break; } break; case 'textarea': var inputfield = $('