本文主要介绍JS实现将左边下拉框列表选中项数据添加到右边的功能,支持多选移动。文章中提供了两种方案,一种是将左侧选中项复制到右边,左侧数据不发生变化,同时阻止数据重复添加到右侧;另一种是数据添加到右边的同时从左边移除,从右边移除的同时向左边追加,并对右侧列表数据实现了上下移动功能。

一、效果图
进行左右移动时,选定一项或多项点击添加或移除(按住shift或ctrl可以多选),上下移动不支持多选。

1.左侧数据添加到右边,重复添加数据时会进行提示并阻止

2.左侧数据移动到右边,移动后从左侧列表删除,选中右侧列表中数据点击上移/下移进行移动

二、Html代码:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>moveOption</title><style>.sel-box {width: 100%;border: 1px solid #cccccc;height: 180px;padding: 10px;}</style>
</head>
<body><p>选定一项或多项点击添加或移除(按住shift或ctrl可以多选)</p><form method="post" name="myform"><p>左侧数据复制到右边,右侧数据不能重复</p><table border="0" width="300"><tr><td width="40%"><select id="languageCopy" class="sel-box " multiple></select></td><td width="20%" align="center"><button type="button" title="添加" onclick="copyOption(this, 'add')">添加</button><br /><br /><button type="button" title="删除" onclick="copyOption(this, 'remove')">删除</button></td><td width="40%"><select id="copyResult" class="sel-box" multiple></select></td></tr></table><p>左侧数据移动到右边,数据移动后从左侧列表删除</p><table border="0" width="400"><tr><td width="30%"><select id="languageRemove" class="sel-box " multiple></select></td><td width="20%" align="center"><button type="button" title="添加" onclick="moveOption(this.parentNode.previousElementSibling.childNodes[1], this.parentNode.nextElementSibling.childNodes[1])">添加</button><br /><br /><button type="button" title="删除" onclick="moveOption(this.parentNode.nextElementSibling.childNodes[1], this.parentNode.previousElementSibling.childNodes[1])">删除</button></td><td width="30%"><select id="groupMember" class="sel-box" multiple></select></td><td width="20%" align="center"><button type="button" onclick="changepos(this,-1)">上移</button><br /><br /><button type="button" onclick="changepos(this,1)">下移</button></td></tr></table></form><script src="../../plugins/jquery-2.0.3.min.js"></script>
</body>
</html> 

三、Js代码:

//下拉框初始数据
var data = [{ "id": 1, "text": "Java" }, { "id": 2, "text": "JavaScript" }, { "id": 3, "text": "C#" }, { "id": 4, "text": "PHP" }, { "id": 5, "text": "C++" }, { "id": 6, "text": "Python" }, { "id": 7, "text": "GO" }, { "id": 8, "text": "SQL" }, { "id": 9, "text": "C" }];
//右侧栏数据集合,用于判重
var selectMember = [];//初始化页面
$(document).ready(function () {//初始化数据initData(data);
})
/*** 初始化数据,给左侧下拉框绑定下拉选项*/
function initData(data) {var $languageCopy = document.querySelector('#languageCopy');data.forEach(function (item, index) {var objOption = document.createElement("option");objOption.text = item.text;objOption.value = item.id;objOption.disabled = !!item.IsDisable;$languageCopy.appendChild(objOption);});var $languageRemove = document.querySelector('#languageRemove');data.forEach(function (item, index) {var objOption = document.createElement("option");objOption.text = item.text;objOption.value = item.id;objOption.disabled = !!item.IsDisable;$languageRemove.appendChild(objOption);});
}
/*** 选中项添加到右边,左侧栏数据不删除,并且不能添加重复数据到右边*/
function copyOption(obj, type) {var eleA = "";var eleB = "";if (type == "add") {//从左侧向右侧添加数据eleA = obj.parentNode.previousElementSibling.firstElementChild;eleB = obj.parentNode.nextElementSibling.firstElementChild;} else {//删除右侧数据eleA = obj.parentNode.nextElementSibling.firstElementChild;eleB = obj.parentNode.previousElementSibling.firstElementChild;}for (var i = 0; i < eleA.options.length; i++) {if (eleA.options[i].selected) {var eSelected = eleA.options[i];if (type == "add") {if (selectMember.indexOf(eSelected.text) < 0) {//判断左边选中项在右侧群成员列表中是否存在eleB.options.add(new Option(eSelected.text, eSelected.value));//将选中项添加到右边selectMember.push(eSelected.text); //将选中值追加到selectMember[]中} else {alert("该项在右侧列表已经存在");}} else {eleA.remove(i);//移除选中项i = i - 1;//每移除一项,下拉选项的索引值会减1selectMember.splice($.inArray(eSelected.text, selectMember), 1); //将选中值从selectMember[]中移除}}}
}
/*** 选中项左右移动*/
function moveOption(eleA, eleB) {for (var i = 0; i < eleA.options.length; i++) {if (eleA.options[i].selected) {var eSelected = eleA.options[i];eleB.options.add(new Option(eSelected.text, eSelected.value));//将选中项添加到右边eleA.remove(i);//移除选中项i = i - 1;//每移除一项,下拉选项的索引值会减1}}
}
/*** 选中项上下移动*/
function changepos(obj, index) {var element = obj.parentNode.previousElementSibling.childNodes[1];//选中项索引值var selectedIndex = element.options.selectedIndex;var selText = element.options[selectedIndex].text;var selValue = element.options[selectedIndex].value;//上移,上移时将选中项数据与上一条option数据进行交换if (index == -1) {if (selectedIndex > 0) {element.options[selectedIndex].text = element.options[selectedIndex - 1].text;element.options[selectedIndex].value = element.options[selectedIndex - 1].value;element.options[selectedIndex].selected = false;element.options[selectedIndex - 1].text = selText;element.options[selectedIndex - 1].value = selValue;element.options[selectedIndex - 1].selected = true;}}//下移,下移时将选中项数据与下一条option数据进行交换else if (index == 1) {if (selectedIndex < element.options.length - 1) {element.options[selectedIndex].text = element.options[selectedIndex + 1].text;element.options[selectedIndex].value = element.options[selectedIndex + 1].value;element.options[selectedIndex].selected = false;element.options[selectedIndex + 1].text = selText;element.options[selectedIndex + 1].value = selValue;element.options[selectedIndex + 1].selected = true;}}
}

JS实现列表数据左右、上下移动功能相关推荐

  1. vue表格刷新数据_Vue.js的列表数据的同步更新方法

    这次给大家带来Vue.js的列表数据的同步更新方法,Vue.js列表数据同步更新方法的注意事项有哪些,下面就是实战案例,一起来看一下. 数组的 push(),pop(),shift(),unshift ...

  2. 表格设置翻页 html,使用原生JS实现表格数据的翻页功能

    使用原生JS实现如下图所示表格数据的翻页功能: HTML代码: 表格标题 < > 简单处理一下样式,CSS代码: #pagination { text-align: center; } # ...

  3. php编写一个学生类_PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能

    这个自己的小项目要先告一段落了.可能还有许多bug.请见谅 删除学生功能 PHP: // 这里是通过前端代码HTML中的 url 传过来的,用 $_GET 来获取(相关HTML代码可以看一下到主页看一 ...

  4. Case Study: 利用JS实现数据库网页的数据分页、数据选择、数据详细信息查看功能

    一.目标 该笔记的目的是引导读者借助WampServer平台和MySQL数据库,利用HTML/CSS/JS/PHP设计一个能够进行实现数据分页显示.数据选择.数据详细信息查看功能的数据库网页.该数据库 ...

  5. Django 后台带有字典的列表数据与页面js交互

    1.这里只是简单介绍一下Django的view如何跟js进行交互,首先,进入用户明细的时候会进入一个页面,叫用户信息表,里面包含了用户学习的课程和所得到的分数,每门课程对应一个分数,其中课程用下拉框依 ...

  6. json vue 对象转数组_vue.js基于v-for实现批量渲染 Json数组对象列表数据示例

    本文实例讲述了vue.js基于v-for实现批量渲染 json数组对象列表数据.分享给大家供大家参考,具体如下: vuejs的出现减轻了对dom的直接操作,同时它提供的 v-for 渲染列表数据也给我 ...

  7. JS国家列表JSON数据及使用

    1.新建js存放国家列表数据 var country = [ ["AO", "Angola"], ["AF", "Afghanis ...

  8. js动态生成数据列表

    我们通常会使用table标签来展示数据内容,由于需要展示的数据内容是随时更换的,所以不可能将展示的数据列表写死在html写死在页面中,而是需要我们根据后台传来的数据随时更换,这个时候就需要我们使用js ...

  9. 【效能平台】接口模块——获取列表数据、查看详情数据、增加以及更新项目接口、删除接口相关功能开发(六)

    今日状态:充充实实 打卡学习 星期一 星期二 星期三 星期四 星期五 星期六 星期日 成功 暂无 暂无 暂无 暂无 暂无 暂无 一.获取接口列表数据 二.获取接口详情数据和更新数据 三.增加接口数据

最新文章

  1. 膨胀腐蚀操作(MATLAB)
  2. spring中的单例工厂SingletonBeanRegistry设计与实现
  3. codefroces 297E Mystic Carvings
  4. ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
  5. C++学习之路 | PTA乙级—— 1076 Wifi密码 (15 分)(精简)
  6. C# 文件读取方法,自己写的例子,保存一下,备用
  7. ubuntun 16.04 AttributeError: type object 'Callable' has no attribute '_abc_registry'
  8. SQL必知必会-事物处理
  9. wxpython textctrl绑键盘事件_wxPython控件学习之TextCtrl(三)响应文本控件事件
  10. vue前台导出zip文件_在Vue.js中使用JSZip实现在前端解压文件的方法_心病_前端开发者...
  11. mysql查询hash分区数据_mysql分区管理 - hash分区
  12. idea给main方法附带参数
  13. 【bzoj3676】
  14. 天神娱乐实控人朱晔宣布离职:暂时的离开是为更好相见
  15. (一)NanoPi m4v2 安装 Home Assistant(含 supervisor)
  16. 【HTTP协议其实很简单】03.自己写一个微型静态Web服务器
  17. 三星s6经常信号无服务器,看看你中招了没?盘点三星S6 Edge六大常见问题
  18. 阿里推出新品牌“瓴羊”,致力成为“数字化领头羊”
  19. 图像特征之SURF特征匹配
  20. 计算机网络技术计什么意思,计算机网络技术和计机应用技术.doc

热门文章

  1. centos 6.5使用 360WiFi2 无线模块
  2. 792. 匹配子序列的单词数
  3. python:初始化方法
  4. Windows 7 / 2008 R2 SP1 RTM 全部版本官方下载
  5. webman 报错解决手册
  6. html 天气预报开发,html javascript 天气预报 (内附源代码)
  7. python学习课程 0基础学Python视频教程
  8. 机器学习VS深度学习
  9. 小脑神经网络——CMAC
  10. SkeyeARS全景AR增强监视系统应用智慧城市解决方案