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

实现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. 排名冲突自动处理:当你给某景点设置新排名时,原占用该排名的景点会自动+1,后续所有受影响的排名依次顺延,确保无重复。
  2. 双向调整支持:无论是从高排名调到低排名(比如从5改到2),还是从低到高,中间的排名都会自动偏移补位。
  3. 未排名状态兼容:选择-(值为0)时,不会触发任何调整逻辑。
  4. 大表格适配:即使表格有数百行,代码依然高效,因为仅遍历必要元素,无冗余操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:10:50