You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拖拽表格行完成后调用JS函数并传递表格ID的实现问题

第一步:修改HTML的行事件绑定

你当前把重排序逻辑绑定在ondragover事件上存在逻辑问题,dragover是拖拽元素经过目标时会持续触发的事件,不是用户松开鼠标完成放置的时机,调整所有行的事件绑定规则如下:

<table id="myTable">
  <thead>
     <tr>
       <th>Head1</th>
       <th>Head2</th>
       <th>Head3</th>
       <th>Head4</th>
     </tr>
  </thead>
  <tbody>
     <tr id="row1" draggable="true" ondragstart="rowOrderStart()" ondragover="event.preventDefault()" ondrop="rowOrderEnd()">
       <td>values 1</td>
       <td>values 2</td>
       <td>values 3</td>
       <td>values 4</td>
     </tr>
     <tr id="row2" draggable="true" ondragstart="rowOrderStart()" ondragover="event.preventDefault()" ondrop="rowOrderEnd()">
       <td>values 5</td>
       <td>values 6</td>
       <td>values 7</td>
       <td>values 8</td>
     </tr>
     <tr id="row3" draggable="true" ondragstart="rowOrderStart()" ondragover="event.preventDefault()" ondrop="rowOrderEnd()">
       <td>values 8</td>
       <td>values 9</td>
       <td>values 10</td>
       <td>values 11</td>
     </tr>
  </tbody>
</table>

说明:ondragover="event.preventDefault()"是浏览器允许元素被放置的必要前提,ondrop事件只会在用户松开鼠标完成放置操作时触发一次

第二步:调整JS逻辑调用收尾函数

修改rowOrderEnd函数,修正表格ID的获取逻辑,在行重排序完成后直接调用rowOrderWrite即可:

var row;

function rowOrderStart(){  
  row = event.target; 
}
function rowOrderEnd(){
  var e = event;
  e.preventDefault(); 
  let children= Array.from(e.target.parentNode.parentNode.children);
  
  if(children.indexOf(e.target.parentNode)>children.indexOf(row))
    e.target.parentNode.after(row);
  else
    e.target.parentNode.before(row);

  // 修正:获取当前行所属表格的ID,不是行自身的ID
  var tableID = e.target.closest('table').id;
  // 放置完成后调用自定义收尾函数
  rowOrderWrite(tableID);
}

function rowOrderWrite(tableID){
   // 你的自定义收尾逻辑
   // ...
}

内容的提问来源于stack exchange,提问作者rolinger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:36:06