Javascript Select操作大集合


Posted in Javascript onMay 26, 2009

其实这本书一直都在我的电脑里,只是没认真看过。一直没怎么很正式的学习过javascript,偶尔用到的时候就到网上找些代码,改吧改吧就用了,这次从头开始学起,细细看下来,还真是有不少收获,甚至有点喜欢上javascript了。
现在步入正题,看到书中讲Form元素的操作,像Textbox、Button、Label等,都还是比较简单的,只是看到Select时,稍微有些复杂,于是就想仔细研究研究,于是就有了这篇文章。Select的操作包括动态添加、删除、移动、获取选中项的值、排序等等,现在一一讲述。
1、向Select里添加Option

//IE only,FF不支持Add方法 
function fnAddItem(text,value) 
{ 
var selTarget = document.getElementById("selID"); 
selTarget.Add(new Option("text","value")); 
} 
//IE FF both OK 
function fnAdd(oListbox, sName, sValue) 
{ 
var oOption = document.createElement("option"); 
oOption.appendChild(document.createTextNode(sName)); 
if (arguments.length == 3) 
{ 
oOption.setAttribute("value", sValue); 
} 
oListbox.appendChild(oOption); 
}

2、删除Select里的Option
function fnRemoveItem() 
{ 
var selTarget = document.getElementById("selID"); 
if(selTarget.selectedIndex > -1) 
{//说明选中 
for(var i=0;i<selTarget.options.length;i++) 
{ 
if(selTarget.options[i].selected) 
{ 
selTarget.remove(i); 
i = i - 1;//注意这一行 
} 
} 
} 
}

3、移动Select里的Option到另一个Select中
function fnMove(fromSelectID,toSelectID) 
{ 
var from = document.getElementById(fromSelectID); 
var to = document.getElementById(toSelectID); 
for(var i=0;i<from.options.length;i++) 
{ 
if(from.options[i].selected) 
{ 
to.appendChild(from.options[i]); 
i = i - 1; 
} 
} 
}

if 里的代码也可用下面几句代码代替
var op = from.options[i]; 
to.options.add(new Option(op.text, op.value)); 
from.remove(i);

4、Select里Option的上下移动
function fnUp() 
{ 
var sel = document.getElementById("selID"); 
for(var i=1; i < sel.length; i++) 
{//最上面的一个不需要移动,所以直接从i=1开始 
if(sel.options[i].selected) 
{ 
if(!sel.options.item(i-1).selected) 
{//上面的一项没选中,上下交换 
var selText = sel.options[i].text; 
var selValue = sel.options[i].value; 
sel.options[i].text = sel.options[i-1].text; 
sel.options[i].value = sel.options[i-1].value; 
sel.options[i].selected = false; 
sel.options[i-1].text = selText; 
sel.options[i-1].value = selValue; 
sel.options[i-1].selected=true; 
} 
} 
} 
}

在进行上下两项互换时,也可以使用以下代码,但是效率很低,因为每一次的Dom操作都将导致整个页面的重新布局,所以不如直接修改元素的属性值。
var oOption = sel.options[i] 
var oPrevOption = sel.options[i-1] 
sel.insertBefore(oOption,oPrevOption);

向下移动同理
function fnDown() 
{ 
var sel = fnGetTarget("selLeftOrRight"); 
for(var i=sel.length -2; i >= 0; i--) 
{//向下移动,最后一个不需要处理,所以直接从倒数第二个开始 
if(sel.options.item(i).selected) 
{ 
if(!sel.options.item(i+1).selected) 
{//下面的Option没选中,上下互换 
var selText = sel.options.item(i).text; 
var selValue = sel.options.item(i).value; 
sel.options.item(i).text = sel.options.item(i+1).text; 
sel.options.item(i).value = sel.options.item(i+1).value; 
sel.options.item(i).selected = false; 
sel.options.item(i+1).text = selText; 
sel.options.item(i+1).value = selValue; 
sel.options.item(i+1).selected=true; 
} 
} 
} 
}

5、Select里Option的排序
这里借助Array对象的sort方法进行操作,sort方法接受一个function参数,可以在这个function里定义排序时使用的算法逻辑。
array.sort([compareFunction]) 里compareFunction接受两个参数(p1,p2),sort操作进行时,array对象会每次传两个值进去,进行比较;compareFunciton必须返回一个整数值:当返回值>0时,p1会排在p2后面;返回值<0时,p1会排在p2前面;返回值=0时,不进行操作。
例如:
function fnCompare(a,b) 
{ 
if (a < b) 
return -1; 
if (a > b) 
return 1; 
return 0; 
} 
var arr = new Array(); 
//add some value into arr 
arr.sort(fnCompare); 
//这里sort的操作结果就是arr里的项按由小到大的升序排序 
//如果把fnCompare里改为 
//if (a < b) 
// return 1; 
//if (a > b) 
// return -1; 
//return 0; 
//则sort的结果是降序排列 
好,下面就是对Select里Option的排序 
//因为排序可以按Option的Value排序,也可以按Text排序,这里只演示按Value排序 
function sortItem() 
{ 
var sel = document.getElementById("selID"); 
var selLength = sel.options.length; 
var arr = new Array(); 
var arrLength; 
//将所有Option放入array 
for(var i=0;i<selLength;i++) 
{ 
arr[i] = sel.options[i]; 
} 
arrLength = arr.length; 
arr.sort(fnSortByValue);//排序 
//先将原先的Option删除 
while(selLength--) 
{ 
sel.options[selLength] = null; 
} 
//将经过排序的Option放回Select中 
for(i=0;i<arrLength;i++) 
{ 
fnAdd(sel,arr[i].text,arr[i].value); 
//sel.add(new Option(arr[i].text,arr[i].value)); 
} 
} 
function fnSortByValue(a,b) 
{ 
var aComp = a.value.toString(); 
var bComp = b.value.toString(); 
if (aComp < bComp) 
return -1; 
if (aComp > bComp) 
return 1; 
return 0; 
}

排序时还可以有更多选项,比如将value值看做Integer或是String进行排序,得到的结果是不一样的。篇幅限制,不在多做介绍。
我将这些所有的操作都写在了一个文件里,运行的效果如图
Javascript Select操作大集合
Javascript 相关文章推荐
JS 面向对象之神奇的prototype
Feb 26 Javascript
关于jquery.validate1.9.0前台验证的使用介绍
Apr 26 Javascript
Jquery实现的tab效果可以指定默认显示第几页
Oct 16 Javascript
JS使用ajax方法获取指定url的head信息中指定字段值的方法
Mar 24 Javascript
Javascript节点关系实例分析
May 15 Javascript
JS中Attr的用法详解
Oct 09 Javascript
jQuery创建及操作xml格式数据示例
May 26 jQuery
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
vue实现表格过滤功能
Sep 27 Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 Javascript
jQuery实现简单全选框
Sep 13 jQuery
微信小程序开发数据缓存基础知识辨析及运用实例详解
Nov 06 Javascript
让GoogleCode的SVN下的HTML文件在FireFox下正常显示.
May 25 #Javascript
JavaScript constructor和instanceof,JSOO中的一对欢喜冤家
May 25 #Javascript
jQuery 图像裁剪插件Jcrop的简单使用
May 22 #Javascript
document.compatMode介绍
May 21 #Javascript
各种常用浏览器getBoundingClientRect的解析
May 21 #Javascript
简单的js分页脚本
May 21 #Javascript
input+select(multiple) 实现下拉框输入值
May 21 #Javascript
You might like
从php核心代码分析require和include的区别
2011/01/02 PHP
PHP加密解密实例分析
2015/12/25 PHP
Laravel实现表单提交
2017/05/07 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
jquery拖动层效果插件用法实例分析(附demo源码)
2016/04/28 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
react native实现往服务器上传网络图片的实例
2017/08/07 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
vue+vant 上传图片需要注意的地方
2021/01/03 Vue.js
[07:26]2015国际邀请赛第二日TOP10集锦
2015/08/06 DOTA
对python遍历文件夹中的所有jpg文件的实例详解
2018/12/08 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
python文件写入write()的操作
2019/05/14 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
python基于socket模拟实现ssh远程执行命令
2020/12/05 Python
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
世界经理人咨询有限公司面试
2014/09/23 面试题
小学生新学期寄语
2014/01/19 职场文书
公务员个人总结
2015/02/12 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
电影小兵张嘎观后感
2015/06/03 职场文书
寻找成龙观后感
2015/06/12 职场文书
2015年十月一日放假通知
2015/08/18 职场文书