实现Flask应用中HTML表格select排名的动态去重调整功能
景点排名动态调整的JavaScript解决方案
首先修正你HTML里的一个问题:所有下拉框用了相同的id="regions",这不符合HTML规范(id必须唯一),建议改成class="region-rank",方便后续JS批量定位元素。
完整实现代码
修正后的HTML(仅修改select部分)
<!DOCTYPE html> <body> <h1> 景点排名页面</h1> <h6> 请为以下你想去的景点排名 </h6> <table> <tr> <th>地区</th> <th>排名</th> </tr> <tr> <td>智利托雷斯德尔佩恩国家公园</td> <td> <select class="region-rank" name="0" > <option value="0">-</option> <option value="1">1</option> <option selected value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </td> </tr> <tr> <td>缅甸蒲甘</td> <td> <select class="region-rank" name="1" > <option value="0">-</option> <option value="1">1</option> <option value="2">2</option> <option selected value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </td> </tr> <tr> <td>哥斯达黎加蒙特维多云雾森林保护区</td> <td> <select class="region-rank" name="2" > <option value="0">-</option> <option selected value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </td> </tr> <tr> <td>塞舌尔银泉海滩</td> <td> <select class="region-rank" name="3" > <option value="0">-</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </td> </tr> <tr> <td>美国亚利桑那州大峡谷</td> <td> <select class="region-rank" name="4" > <option value="0">-</option> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> <option value="4">4</option> <option value="5">5</option> <option value="6">6</option> <option value="7">7</option> <option value="8">8</option> <option value="9">9</option> <option value="10">10</option> </select> </td> </tr> </table> <!-- JS放在页面底部,确保DOM加载完成后执行 --> <script> // 获取所有排名下拉框 const selectElements = document.querySelectorAll('.region-rank'); // 给每个下拉框绑定变更事件 selectElements.forEach(select => { select.addEventListener('change', handleRankChange); // 初始化存储上一次的排名值 select.dataset.previousRank = select.value; }); function handleRankChange(e) { const targetSelect = e.target; const newRank = parseInt(targetSelect.value); const oldRank = parseInt(targetSelect.dataset.previousRank); // 更新当前下拉框的历史排名记录 targetSelect.dataset.previousRank = newRank; // 选择"未排名"(值为0)时无需调整其他项 if (newRank === 0) return; // 遍历所有下拉框处理排名冲突 selectElements.forEach(select => { if (select === targetSelect) return; const currentRank = parseInt(select.value); // 情况1:其他下拉框已占用新排名,需要往后顺延 if (currentRank === newRank) { select.value = currentRank + 1; select.dataset.previousRank = currentRank + 1; } // 情况2:从旧排名调整到新排名时,中间的排名需要相应偏移 else if (oldRank !== 0) { if (newRank < oldRank && currentRank > newRank && currentRank <= oldRank) { select.value = currentRank - 1; select.dataset.previousRank = currentRank - 1; } else if (newRank > oldRank && currentRank >= oldRank && currentRank < newRank) { select.value = currentRank + 1; select.dataset.previousRank = currentRank + 1; } } }); } </script> </body> </html>
功能说明
- 排名冲突自动处理:当你给某景点设置新排名时,原占用该排名的景点会自动+1,后续所有受影响的排名依次顺延,确保无重复。
- 双向调整支持:无论是从高排名调到低排名(比如从5改到2),还是从低到高,中间的排名都会自动偏移补位。
- 未排名状态兼容:选择
-(值为0)时,不会触发任何调整逻辑。 - 大表格适配:即使表格有数百行,代码依然高效,因为仅遍历必要元素,无冗余操作。
内容的提问来源于stack exchange,提问作者Carlos
相关产品推荐
相关产品推荐

