列表框的左右上下移动

本文提供了一个使用JavaScript操作HTML中列表框(select元素)的示例,包括将选项从一个列表框移动到另一个列表框的功能,以及在同一个列表框内调整选项的顺序。

效果:

HTML页面代码:

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">

<html>

	<head>

		<title>js操作列表框</title>

	</head>

	<script language="javascript">

	<!--

	var ListUtil = new Object();

	//全部移动

	ListUtil.moveAll = function moveAll(oListboxFrom,oListboxTo){

		var options = oListboxFrom.options;

		for(var i = 0; i < options.length; i++){

			oListboxTo.appendChild(options[i]); //???

			i -= 1;  //???每删除一个选项后,每个选项的index会被重置

		}

	}

	//单个或多个移动

	ListUtil.moveMuti = function moveMuti(oListboxFrom,oListboxTo){

		var options = oListboxFrom.options;

		for(var i = 0; i < options.length; i++){

			if(options[i].selected){

				oListboxTo.appendChild(options[i]);

				i -= 1;

			}

		}

	}

	

	//上移

	ListUtil.shiftUp = function(oListbox) {

		if(oListbox.selectedIndex > 0){

			var oOption = oListbox.options[oListbox.selectedIndex];

			var oPrevOption = oListbox.options[oListbox.selectedIndex-1];

			oListbox.insertBefore(oOption,oPrevOption);

		}

	}

	//下移

	ListUtil.shiftDown = function(oListbox){

		if(oListbox.selectedIndex < oListbox.options.length-1){

			var oOption = oListbox.options[oListbox.selectedIndex];

			var oNextOption = oListbox.options[oListbox.selectedIndex+1];

			oListbox.insertBefore(oNextOption,oOption);

		}

	}

	

	//-->

	</script>

	<body text="#000000" bgcolor="#ffffff" link="#0033cc">

	<form method=post action="#">

	<table>

		<tr>

			<td>

				未选员工

				<select name="oListboxFrom" id="oListboxFrom" size="10" multiple="true"

					style="width:100px;height:250px;margin-left:20px;float:left">

					<option value="1" selected>员工1</option>

					<option value="2">员工2</option>

					<option value="3">员工3</option>

					<option value="4">员工4</option>

					<option value="5">员工5</option>

				</select>

			</td>

			<td align="center">

				<input type="button" value=" >>> "

					onclick="ListUtil.moveAll(oListboxFrom, oListboxTo);" />

				<br/>

				<input type="button" value=" >> "

					onclick="ListUtil.moveMuti(oListboxFrom, oListboxTo);" />

				<br/>

				<input type="button" value=" << " 

					onclick="ListUtil.moveMuti(oListboxTo, oListboxFrom);" />

				<br/>

				<input type="button" value=" <<< " 

					onclick="ListUtil.moveAll(oListboxTo, oListboxFrom);" />

				<br/>

				<input type="button" value=" ↑ "

					onclick="ListUtil.shiftUp(oListboxFrom);" />

				<br/>

				<input type="button" value=" ↓ "

					onclick="ListUtil.shiftDown(oListboxFrom);" />

			</td>

			<td>

				已选员工

				<select name="oListboxTo" id="oListboxTo" multiple="true" size="10"

					style="width:100px;height:250px;margin-left:20px;float:left">

					<option value="319094784">员工6</option>

					<option value="320274432">员工8</option>

					<option value="322109440">员工7</option>

				</select>

			</td>

		</tr>

	</table>

	</form>

	</body>

</html>
在 Element UI 的 `el-transfer` 组件中,默认仅支持左右数据穿梭功能,并不提供上下移动选项的能力。若需实现上下移动功能,可以通过自定义组件的方式扩展其行为。 ### 实现思路 1. **保留原样式和基本功能**:沿用 `el-transfer` 的外观样式及左右穿梭逻辑。 2. **添加上下移动按钮**:在组件的一侧或两侧添加“上移”和“下移”按钮,用于调整选中项的位置。 3. **控制按钮状态**:通过监听选中项的状态,动态控制按钮的启用或禁用状态,确保只有在有可操作项时才允许移动。 4. **数据排序逻辑**:对数据数组进行重新排序,根据用户点击按钮的行为将选中项向上或向下移动一个位置。 ### 示例代码 以下是一个基于 Vue 和 Element UI 的示例代码片段,展示如何在 `el-transfer` 基础上实现上下移动功能: ```html <template> <div> <el-transfer v-model="selectedData" :data="allData" :titles="['源数据', '目标数据']" @change="handleChange" ></el-transfer> <div class="move-buttons"> <el-button type="primary" icon="el-icon-top" @click="moveUp" :disabled="!canMoveUp">上移</el-button> <el-button type="primary" icon="el-icon-bottom" @click="moveDown" :disabled="!canMoveDown">下移</el-button> </div> </div> </template> <script> export default { data() { return { allData: [ { key: 1, label: '选项1' }, { key: 2, label: '选项2' }, { key: 3, label: '选项3' }, { key: 4, label: '选项4' }, { key: 5, label: '选项5' } ], selectedData: [], selectedIndex: -1 }; }, computed: { canMoveUp() { return this.selectedIndex > 0; }, canMoveDown() { return this.selectedIndex < this.selectedData.length - 1 && this.selectedIndex !== -1; } }, methods: { handleChange(value) { // 可以在这里处理左右穿梭时的数据变化 }, moveUp() { if (this.selectedIndex <= 0) return; const temp = this.selectedData[this.selectedIndex - 1]; this.$set(this.selectedData, this.selectedIndex - 1, this.selectedData[this.selectedIndex]); this.$set(this.selectedData, this.selectedIndex, temp); this.selectedIndex--; }, moveDown() { if (this.selectedIndex === -1 || this.selectedIndex >= this.selectedData.length - 1) return; const temp = this.selectedData[this.selectedIndex + 1]; this.$set(this.selectedData, this.selectedIndex + 1, this.selectedData[this.selectedIndex]); this.$set(this.selectedData, this.selectedIndex, temp); this.selectedIndex++; } } }; </script> <style scoped> .move-buttons { margin-top: 10px; } </style> ``` ### 注意事项 - 数据绑定需要使用 Vue 的响应式机制,例如 `$set` 方法来保证视图更新。 - 上述示例中的 `selectedIndex` 是假设用户从目标列表中选择了一个条目,实际应用中可能需要结合额外的交互逻辑(如点击目标项触发选中)。 - 如果需要更复杂的树形结构支持,可以参考类似 `el-tree-transfer` 的实现方式[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值