javascript - 带有链接行的 JS 可排序表?

标签 javascript html

好的,我有一张 table 。在此表中,我有一大堆列,我想使用可排序表 javascript,以便用户可以根据需要对表进行排序。有很多这样的 JS 脚本可用(即:http://tablesorter.com/docs/)

但是,我遇到的问题是,对于我想要排序的表格的每一行,在其正下方都有一个我不想排序的 colspan="4" 行。事实上,我希望这些行直接链接到它们上面的行,这样当这些行被排序时,它下面的 4-span 行会保持不变。

这样的事情可能吗?

table {
  border: 1px black solid;
  width: 100%;
}
thead {
  background-color: lightgrey;
  text-align: left;
}
.notes {
  text-align: right;
}
<table>
  <thead>
    <tr>
      <th>Command</th>
      <th>DMG</th>
      <th>EXE</th>
      <th>TOT</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Jouho Touken</td>
      <td>19</td>
      <td>17</td>
      <td>42</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Opponent crouching (H: Stagger)</td>
    </tr>
    <tr>
      <td>Chouyoushu</td>
      <td>25</td>
      <td>18</td>
      <td>46</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Damage varies due to distance (25-40)</td>
    </tr>
    <tr>
      <td>Tetsuzankou</td>
      <td>40</td>
      <td>19</td>
      <td>75</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Super Replay; Damage varies due to distance: 40-80</td>
    </tr>
  </tbody>
</table>

最佳答案

这是您如何执行此操作的示例。

  • <tbody> 中的所有行组成一个数组.
    • 将其分组。 [{data, note}, ...]
    • 按给定的排序函数排序
    • 展平成表格行的数组。
  • 清空 <tbody>标签
  • 插入 <tbody>标记排序表行数组中的所有内容。

var tableBody = document.querySelector('tbody')

var tableRows = Array
  .from(document.querySelectorAll('tbody > tr'))

var notesAndData = []
/* Group elements into
  [
    {data: <tr>, note: <tr>},
    ...
  ]
*/
for(var i = 1; i < tableRows.length; i += 2) {
  notesAndData.push({
    data: tableRows[i-1],
    note: tableRows[i]
  })
}

function flatten(arr) {
  return arr.reduce(function(acc, curr) {
    acc.push(curr.data)
    acc.push(curr.note)
    return acc
  }, [])
}

function repopulateTable(arr) {
  tableBody.innerHTML = ''
  arr.forEach(function(element) {
    tableBody.appendChild(element)
  })
}

function sortTable(sortingFunc) {
  /* Spread the notesAndData into a new array in 
     order to not modify it. This syntax is es6 */
  var sorted = [...notesAndData].sort(sortingFunc)
  repopulateTable(flatten(sorted))
}


function sortByDmg(ascending) {
  return function(a, b) {
    var aDmg = parseInt(a.data.children[1].textContent)
    var bDmg = parseInt(b.data.children[1].textContent)
    if (aDmg < bDmg) return ascending ? 1 : -1
    return ascending ? 1 : -1
  }
}

document
  .querySelector('.dmgSort')
  .addEventListener('click', function() {
    sortTable(sortByDmg(true))
  })
table {
  border: 1px black solid;
  width: 100%;
}
thead {
  background-color: lightgrey;
  text-align: left;
}
.notes {
  text-align: right;
}
<button class="dmgSort">Sort By DMG Ascending</button>

<table>
  <thead>
    <tr>
      <th>Command</th>
      <th>DMG</th>
      <th>EXE</th>
      <th>TOT</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Jouho Touken</td>
      <td>19</td>
      <td>17</td>
      <td>42</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Opponent crouching (H: Stagger)</td>
    </tr>
    <tr>
      <td>Chouyoushu</td>
      <td>25</td>
      <td>18</td>
      <td>46</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Damage varies due to distance (25-40)</td>
    </tr>
    <tr>
      <td>Tetsuzankou</td>
      <td>40</td>
      <td>19</td>
      <td>75</td>
    </tr>
    <tr>
      <td colspan="4" class="notes">Super Replay; Damage varies due to distance: 40-80</td>
    </tr>
  </tbody>
</table>

关于javascript - 带有链接行的 JS 可排序表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41215199/

相关文章:

javascript - 工具提示中的元素高度问题

html - 如何使用 CSS 垂直对齐 div 容器?

javascript - 图像悬停在几个图像上不起作用

javascript - 为什么 Jquery 在使用 set minutes 函数设置时间后显示当前系统时间?

javascript - 使用 jquery 变量调用函数

javascript - Vue.js - onclick 事件不触发

javascript - 在 ContentEditable 更改事件中的 P 标签中插入数据属性

javascript - 通过用户操作使用 cookie 隐藏 DIV,以防单击关闭按钮或弹出图像

javascript - 在 C# web 表单中的列表上进行 JSON stringify

javascript - 如何使用变量变量来集中输入