javascript - 如何在不使用 javascript 交换表行的情况下交换表行中的表单值?

标签 javascript jquery dom dom-traversal

我试图将 row1 中的表单值与 row2 中的表单值交换,而不交换行。有人可以告诉我如何用纯 javascript、vanilla JS 或 jquery 实现此目的吗?我将表行缩短为两行,但实际表由 17 行组成。请仔细查看第三个示例中的 id 和表单值。

当未单击“向上”或“向下”按钮时,表格的简单形式如下所示:

   <form id="menuitems">
    <table class="toolbaritems">
       <tbody class="sortable">
       <tr id="row1">
          <td><button class="up_arrow">UP</button></td>
          <td><input value="1></td>
          <td><select><option="1" selected></option></select></td>
          <td><select><option="1a" selected></option></select></td>
       </tr>
       <tr id="row2">
          <td><button class="down_arrow">DOWN</button></td>
          <td><input value="2"></td>
          <td><select><option="2" selected></option></select></td>
          <td><select><option="2a" selected></option></select></td>
       </tr>
      <tr><td><input type="submit" value="SAVE"></td></tr>
      </tbody>
    </table>
  </form>

当前代码 - 单击“向上”或“向下”按钮时,表格如下所示:

   <form id="menuitems">
    <table class="toolbaritems">
       <tbody class="sortable">
       <tr id="row2">
          <td><button class="up_arrow">UP</button></td>
          <td><input value="2"></td>
          <td><select><option="2" selected></option></select></td>
          <td><select><option="2a" selected></option></select></td>
       </tr>
       <tr id="row1">
          <td><button class="down_arrow">DOWN</button></td>
          <td><input value="1"></td>
          <td><select><option="1" selected></option></select></td>
          <td><select><option="1a" selected></option></select></td>
       </tr>
      <tr><td><input type="submit" value="SAVE"></td></tr>
      </tbody>
    </table>
</form>

这就是我想要实现的目标 - 除了 tr 之外,输入的值应该交换。请注意,tr id 保持不变,但表单值已交换:

<form id="menuitems">
    <table class="toolbaritems">
       <tbody class="sortable">
       <tr id="row1">
          <td><button class="down_arrow">DOWN</button></td>
          <td><input value="2"></td>
          <td><select><option="2" selected></option></select></td>
          <td><select><option="2a" selected></option></select></td>
       </tr>
       <tr id="row2">
          <td><button class="up_arrow">UP</button></td>
          <td><input value="1"></td>
          <td><select><option="1" selected></option></select></td>
          <td><select><option="1a" selected></option></select></td>
       </tr>
      <tr><td><input type="submit" value="SAVE"></td></tr>
      </tbody>
    </table>
</form>

最佳答案

这只是交换整行,而不是尝试重新排列每个单独的表单元素,这会以更少的努力获得相同的结果:

$('.down_arrow').click(function() {
  $(this).closest('tr').insertAfter($(this).closest('tr').next());
});

$('.up_arrow').click(function() {
  $(this).closest('tr').insertBefore($(this).closest('tr').prev());
});
table tr:first-child .up_arrow {
  opacity: 0
}
table tr:last-child .down_arrow {
  opacity: 0
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- I took the liberty of fixing up the broken <option> tags here.  If that was supposed to be two separate <select>s, this code will still work exactly the same -->
<table>
  <tr>
    <td>
      <button class="down_arrow">↓</button>
      <button class="up_arrow">↑</button>
    </td>
    <td><input value="1"></td>
    <td><select><option>1</option><option>1a</option></select>
    </td>
  </tr>
  <tr>
    <td>
      <button class="down_arrow">↓</button>
      <button class="up_arrow">↑</button>
    </td>
    <td><input value="2"></td>
    <td><select><option>2</option><option>2a</option></select>
    </td>
  </tr>
    <tr>
    <td>
      <button class="down_arrow">↓</button>
      <button class="up_arrow">↑</button>
    </td>
    <td><input value="3"></td>
    <td><select><option>3</option><option>3a</option></select>
    </td>
  </tr>
  <tr>
    <td>
      <button class="down_arrow">↓</button>
      <button class="up_arrow">↑</button>
    </td>
    <td><input value="4"></td>
    <td><select><option>4</option><option>4a</option></select>
    </td>
  </tr>
</table>

将事件绑定(bind)到表本身而不是每个单独的按钮可能会更好:

$('table').on('click','.down_arrow',function() {...});

这样您就可以以编程方式添加或删除表行,而无需添加新的绑定(bind)。 (在这种情况下,通常要小心使用 .html() 覆盖 DOM 的部分内容,因为它会破坏您可能已经包含的任何事件绑定(bind)。)

关于javascript - 如何在不使用 javascript 交换表行的情况下交换表行中的表单值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35022150/

相关文章:

javascript - Web Audio API AudioParam.value 未记录

javascript - 在 jQuery 中取消注册委托(delegate)事件

java - 无法提取节点下的子节点名称

jquery - 在 TypeScript 中访问两个 'this' 变量

javascript - 全局时 JSON 变量未定义

javascript - 有什么办法可以加速 mousemove 事件吗?

javascript - 使用 jquery 获取子节点内的文本

javascript - 如何通过 web3 或其他人获取 Metamask 钱包中的所有代币?

javascript - VueJS 无法将输入绑定(bind)到 beforeMount Hook 中生成的属性

javascript - JS Submit() 访问被拒绝 IFrame IE