编辑:替代解决方案
我只是认为pos_id
,我可以在遍历路径数组时查找“TD”元素(使用tagName
属性),而不是查找数据属性。同样,我可以得到父'TR'。单元格有一个cellIndex
属性,而行有一个rowIndex
,所以我可以使用这些值在构建表的源对象中查找单元格数据。
原始解决方案
我不知道这是否是最好的解决方案,但它对我有用:
首先,在 HTML 模板中,我向可放置单元格添加了一个pos_id
带有该单元格 ID 的数据属性。所以它们看起来像:
<tr>
<td data-pos_id="101"> ... </td>
<td data-pos_id="102"> ... </td>
...
<tr>
<tr>
<td data-pos_id="201"> ... </td>
<td data-pos_id="202"> ... </td>
...
<tr>
其次,在makeDroppable
指令中,在 drop 事件侦听器中,我使用path
/ composedPath
property/method 获取光标所在的 DOM 元素数组。然后,我遍历这个数组,寻找一个具有pos_id
dataset 属性的元素,这将是我正在寻找的元素:
el.addEventListener('drop', (e) => {
...
// Event DOM path
var path = e.path || (e.composedPath && e.composedPath());
for(let elem of path) {
// If the element has a data attribute called 'pos_id', it's a droppable <TD>
if (elem.dataset && elem.dataset.pos_id) {
elem.classList.add('over');
console.log('Dropped object on position '+elem.dataset.pos_id);
break;
}
}
...
}
但是,这种方法有一个大问题:它依赖于数据集属性来唯一标识用户放置对象的位置,因此如果用户使用开发者控制台或任何其他方法更改此属性,应用程序将无法正常工作预期的。我将发布一个关于这个主题的新问题,我将继续进行测试以尝试解决这个问题。