我正在开发一个应用程序的前端来跟踪比赛。在一个页面中,用户需要通过将玩家从左侧列表中拖动到右侧最终结果表中来更新锦标赛结果,我将发送到 PHP 后端进行处理(我不是在开发后端,只需要通过 POST 发送正确的数据)。我的要求是:
- 有一个球员名单
- 有一个结果表,每行都有固定的位置(第一行,第二行)。
- 每个位置将有 4 个相关输入,全部命名为
position-1-NAME
,位于同一行但不同的列中 - 用户应该能够将玩家拖到每个位置
- 一名球员只能在一个位置,每个位置只能有一名球员
- 当玩家被放置在桌子上时,他应该从列表中删除
我尝试了几种方法,但最接近的一种方法是使用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 中,我做了一个 hack,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);
});
到目前为止,这正在处理一些错误:
我可以在同一个中放置两个播放器
td
,它们将在 UI 中显示两者都被拖动li
,但表单将只有最后放置的播放器的值。如果我将玩家一个接一个地拖到所有位置,所有输入都将具有他的名字的值,直到我将另一个玩家拖到该位置为止。
所以,我想完成几件事:
每个里面只允许一名玩家
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', '');
});