两个select多选模式的选项相互移动(示例代码)


以下是一个使用HTML和JavaScript实现两个多选(select)框之间选项相互移动的基本示例。在这个示例中,我们创建了两个`select`元素,分别用于表示源列表和目标列表,并提供了两个按钮用于将选项从一个列表移动到另一个列表。

HTML 部分:


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>选项移动示例</title>
</head>
<body>
<select id="source" multiple size="5">
    <option value="1">选项1</option>
    <option value="2">选项2</option>
    <option value="3">选项3</option>
    <option value="4">选项4</option>
</select>
<button onclick="moveSelectedOptions('source', 'target')">移动到目标</button>
<button onclick="moveSelectedOptions('target', 'source')">移回源</button>
<select id="target" multiple size="5">
    <!-- 目标列表初始为空 -->
</select>

<script>
    function moveSelectedOptions(fromId, toId) {
        var fromSelect = document.getElementById(fromId);
        var toSelect = document.getElementById(toId);

        // 遍历源select框中的每个option
        for (var i = fromSelect.options.length - 1; i >= 0; i--) {
            // 如果该option被选中
            if (fromSelect.options[i].selected) {
                // 将其添加到目标select框的末尾
                toSelect.add(fromSelect.options[i], null);
                // 或者,如果你想要保持源select框的原始顺序不变,可以这样做:
                // toSelect.add(fromSelect.options[i].cloneNode(true), null);
                // 然后从源select框中移除它
                // fromSelect.remove(i);
                // 注意:上面的remove和add操作会影响循环的索引,因此我们从后向前遍历
            }
        }
    }
</script>
</body>
</html>

注意:在这个示例中,为了简化代码和保持其简洁性,我没有在移动选项后立即从源`select`中删除它们。如果你希望这样做以保持列表的整洁,你可以取消注释相应的`remove`行。但是,由于这会影响循环的索引,所以我们从后向前遍历列表(即`for`循环中的递减索引)。

此外,我还添加了一个注释,展示了如何使用`cloneNode(true)`来克隆被选中的`option`元素,这样原始列表就不会丢失任何数据了。然而,这种方法需要你自己决定是否要在源列表中保留这些选项的副本。