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

Laravel项目中点击表格列名实现MySQL数据排序的JS功能异常排查

问题点整理
    1. HTML属性书写错误:HTML原生属性为class,你写的className是JavaScript操作DOM时的属性名,浏览器无法识别该属性,导致getElementsByClassName无法匹配到对应表格。
    1. 函数调用参数缺失:你的sortTable函数定义需要传入列索引参数n,但绑定的点击事件onclick="sortTable()"没有传递任何参数,导致逻辑执行时找不到需要排序的列。如果需要实现点击列头排序,应该把点击事件绑定到<th>元素上,同时传入对应列的索引,第一列索引为0,依次递增即可。
    1. DOM获取方式错误:document.getElementsByClassName返回的是匹配元素的集合,不是单个DOM元素,你直接访问集合的rows属性会报错,需要取集合的第一个元素[0]才能拿到表格对象。
    1. 排序逻辑兼容问题:当前你统一用字符串小写比较的逻辑,对数字、日期类型的列排序会出错,比如字符串比较下"10"会小于"2",日期如果是标准格式也需要转成时间戳比较才准确,另外最后一列的数字被<h3>标签包裹,直接取innerHTML会包含HTML标签,需要取innerText或者textContent再做类型转换。
    1. 行遍历范围问题:table.rows会包含表头的行,你当前遍历逻辑有可能误操作表头,建议单独获取<tbody>下的行做排序。
修正后的代码

HTML部分

<!-- 把className改成class -->
<table class="sorting">
  <thead>
    <tr>
      <!-- 给每个列头绑定点击事件,传入对应列索引 -->
      <th onclick="sortTable(0)">Name</th>
      <th onclick="sortTable(1)">Example</th>
      <th onclick="sortTable(2)">Test</th>
      <th onclick="sortTable(3)">Date</th>
      <th onclick="sortTable(4)">Number</th>
    </tr>
  </thead>
  <tbody>
    @foreach ($get_all_examples as $post)
      <tr>
        @php
          $user_id = Auth::user()->getAuthIdentifier();
          $cek_tiket = DB::table('test')
            ->where('date', '!=', null)
            ->where('numbery', '=', $post->name)
            ->where('user_id', '=', $user_id)
            ->count();
        @endphp
        <td>{{ $post->name?? "brak" }} </td>
        <td>{{ $post->example ?? "brak" }}</td>
        <td>{{ $post->number ?? "brak" }}</td>
        <td>{{ $post->date ?? "brak" }}</td>
        <td><h3>{{$cek_tiket}}</h3></td>
      </tr>
    @endforeach
  </tbody>
</table>

JavaScript部分

function sortTable(n) {
  var table, rows, switching, i, x, y, shouldSwitch, dir, switchcount = 0;
  // 取集合的第一个元素拿到表格对象
  table = document.getElementsByClassName("sorting")[0];
  switching = true;
  dir = "asc";
  while (switching) {
    switching = false;
    // 只取tbody下的行,避免操作表头
    rows = table.tBodies[0].rows;
    for (i = 0; i < (rows.length - 1); i++) {
      shouldSwitch = false;
      // 取textContent消除标签影响,再根据列类型处理比较逻辑
      let xVal = rows[i].getElementsByTagName("TD")[n].textContent.trim();
      let yVal = rows[i + 1].getElementsByTagName("TD")[n].textContent.trim();
      // 数字类型判断和转换,日期如果是标准格式可以转成new Date(xVal).getTime()比较
      if (!isNaN(Number(xVal)) && !isNaN(Number(yVal))) {
        xVal = Number(xVal);
        yVal = Number(yVal);
      } else {
        xVal = xVal.toLowerCase();
        yVal = yVal.toLowerCase();
      }
      if (dir == "asc") {
        if (xVal > yVal) {
          shouldSwitch = true;
          break;
        }
      } else if (dir == "desc") {
        if (xVal < yVal) {
          shouldSwitch = true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
      switching = true;
      switchcount ++;
    } else {
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:12:01