トーナメントを追跡するアプリのフロントエンドを開発しています。1 つのページで、ユーザーはトーナメントの結果を更新する必要があります。これは、処理のために PHP バックエンドに送信する、右側の最終結果テーブル内の左側のリストからプレイヤーをドラッグすることによって行われます (私はバックエンドを開発していません)。 、POST 経由で正しいデータを送信する必要があります)。私の要件は次のとおりです。
- プレイヤーのリストを持っている
- 各行の位置が固定された結果テーブルを用意します (1 行目に 1 行、2 行目に 1 行)。
- 各位置には 4 つの関連する入力があり、すべて という名前が付けられ
position-1-NAME
、同じ行に異なる列があります。 - ユーザーはプレーヤーを各位置にドラッグできる必要があります
- 1 人のプレーヤーは 1 つのポジションにのみ配置でき、各ポジションには 1 人のプレーヤーしか配置できません
- プレーヤーがテーブルに配置されたら、リストから削除する必要があります
私はいくつかのアプローチを試しましたが、近いものはDragula JSプラグインを使用することです。
ul
次に、 を使用してプレイヤーのリストを作成しid
、Dragula のコンテナーにします。
<ul id="players-container">
<li>
Player 1
</li>
</ul>
次に、タグtable
内にform
があり、フィールドの名前はすべて、次のように位置に従って名前が付けられますposition-1-name-of-the-input
。
<form method="POST" action="file_to_process_form.php">
<thead>
<th>Position</th>
<th>Player</th>
...
</thead>
<tbody>
<tr>
<td>
1st Position
</td>
<td class="target">
<input type="text" name="position-1-player-name" value="" hidden>
</td>
<td>
...other inputs
</td>
</tr>
</tbody>
次に、JavaScript で、ドラッグされたtext()
からを取得し、 のの属性内に配置するハックを作成して、最初の位置にあるプレーヤーの名前をバックエンドに送信できるようにしました。コード:li
value
input
table
dragula([document.querySelector('#players-container'), document.querySelector('.target')], {
isContainer: function(el){
return el.classList.contains('target');
},
revertOnSpill: true
}).on('drop', function(el, target, source, sibling){
elValue = $(el).text();
$(target).find('input').attr('value', elValue);
});
これまでのところ、これはいくつかのバグで動作しています:
同じ に 2 人のプレーヤーをドロップできます
td
。両方とも UI にドラッグli
されて表示されますが、フォームには最後にドロップされたプレーヤーの値しかありません。プレーヤーをすべての位置に次々とドラッグすると、別のプレーヤーをその位置にドラッグするまで、すべての入力がその名前の値になります。
だから、私はいくつかのことを達成したい:
各 内に 1 人のプレーヤーのみを許可します
td class="target"
。td
クラスを削除して無効にしようとしました.target
が、ドロップされた後、プレーヤーを再び移動できません。プレーヤーをドラッグするときに入力の値を削除します。
私はこれがちょっとしたハックであることを知っていますが、私は JS/jQuery の経験があまりなく、これが今のところリモートで機能する唯一のソリューションです。
私の質問:
td
DragulaまたはJS / jQueryコードを使用して、複数のプレーヤーフォームが同じフォームにドラッグされるのを防ぐにはどうすればよいですか?[解決済み - 編集を参照]プレーヤーを からドラッグしたときに
value
を削除するにはどうすればよいですか?input
td
推奨するこれらの要件を実装するより良い方法を知っていますか?
編集
次のコードを追加することで、質問2を解決できました。
dragulaObject.on('drag', function(el, source) {
$(source).find('input').attr('value', '');
});