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

