私は、はるかに精巧な結果を必要とする同様の問題を抱えていました。私のシステムは、フォーム要素名と ID を持つ他の div を含む左側の div からドラッグしていました。これは、Web フォームになる右側のソート可能な div にドロップされました。追加のマークアップなしでフォームのコンテンツによく似た右側の div が必要だったので、データベースに入る途中で大量の「スクラブ」を行いたくない限り、順序付けられていないリストを使用することは問題外でした。結構です。私の例では、左側のリストからドラッグすると、ドラッグされた要素の ID を使用して、ajax を介してさまざまなものを検索し、ラベル、フォーム要素、および検証をリストのリストに配置する必要があります。そのajaxの結果に基づいて残しました。わかりやすくするために、例から ajax を削除しました。
したがって、本質的には、2 つの横に並んだ div を取得し、リスト接続でドラッグ可能および並べ替え可能にします。重要なのは、Sortable に利用しなければならないコールバック関数があることです。「Receive」コールバックは、ソート可能なリストに新しい要素が追加された場合にのみ発生します。並べ替え時に変更が発生しないように区別する必要があるため、これは重要です。ただし、「受信」だけを使用することはできません。そのコールバックで 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');
}
}
});