选择框脚本

选择框由<option>和<select>元素创建,为了方便选择框的交互,除了提供表单字段的公有方法之外

HTMLSelectElement 类型还提供下列特有的属性和方法:

  1. add(newOption, relOption) : 向控件中插入新的 option 位于 relOption 之前
  2. multiple : 布尔值,表示空间是否允许多选,多选 type 值为 select-multiple 否则为 select-one
  3. options : 所有 option 的 HTMLCollection 集合
  4. remove( index ):移除指定位置的的选项
  5. selectIndex: 从0开始,表示当前选中项在所有选项中的索引,若没有选中项那么值为 -1
  6. size : 选择框的可见行数

对于选择框的值有以下几点:

  • 如果没有选中项,则选择框的 value 属性的值为空字符串
  • 如果有一个选中项且在HTML中指定了 value 特性,那么选择框的值与选中项的 value 值一致,如:
    <option value="example"></option>
  • 如果有一个选中项但在HTML中没有指定 value 特性,那么选择框的值与选中项的文本一致,如:
    <option>Example</option>
  • 如果有多个选中项,那么选择框将根据上面两条规则获取选中的第一个选项的值

此外在DOM中,每个<option>元素都由一个 HTMLOptionElement 对象表示,以便访问数据

该对象拥有以下属性:

  • index : 当前选项在 options 集合中的索引
  • label : 当前选项的标签, 等价于HTML中的 label 特性
  • selected : 布尔值,表示当前选项是否被选中,设置为 true 可以设置当前选项
  • text : 当前选项的文本
  • value : 选项的值

上面的属性都是为了提高对选项数据的访问效率

虽然可以使用 getAttribute() 等DOM方式访问,但是效率低下

PS: 选择框的 change 事件的触发条件和其它表单字段有所不同,当选择了不同的选项时就会触发,不需要失去焦点

选择选项

对于只允许选择一项的选择框来说,访问选中项的最简单的方式就是使用选择框的 selectedIndex 属性:

var selectedOption = selectBox.options[selectBox.selectedIndex];// 获取选中的选项

但是对于可以选择多项的选择框, selectedIndex 属性表现和不允许多选一致,则设置该属性会取消之前所有选中的项,然后选中指定的那一项

并且读取该属性也只能获取所有选中项中的第一个

所以如果需要获取所有选中的项,则需要对所有的 option 进行遍历

通过 option 的 selected 属性来判断,此外对于单选的选择框将其的 selected 的值设置为 false 并不会有影响

获取所有选中的 option 可以使用以下函数:

function getSelectedOptions(selectbox){
var result = new Array();
var option = null; for(let i = 0,len = selectbox.options.length; i < len ; i++){
option = selectbox.options[i];
if(option.selected){
result.push(option);
}
} return result;
}

添加选项

我们可以使用JS动态创建选项,并将其添加到选择框中

以添加一个 option 到选项框的末尾为例:

使用DOM方式如下所示:

var newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("option text"));
newOption.setAttribute("value","Option value"); selectbox.appendChild(newOption);

使用option构造函数的方式如下:

var newOption = new Option("option text","Option value");

selectbox.appendChild(newOption);

使用 select 的 add 方法:

var newOption = new Option("option text","Option Value");

selectbox.add(newOption, undefined);// 最佳方案

移除选项

与添加选项类似,移除选项也有多种方法

首先可以使用 removeChild 方法

selectbox.removeChild(selectbox.options[0]);// 移除第一个选项

也可以使用选择框的 remove 方法

selectbox.remove(0);

还可以将相应选项的值设置为 null

selectbox.options[0] = null;

需要注意的是当我们移除选项时,剩余的选项会依次向前补全位置

所以如果希望移除所有的选项,那么我们只需要循环地移除选项中的第一个即可

移动和重排

在DOM标准出现之前,将一个选择框中的选项移动到另一个选择框中是十分麻烦的

整个过程需要先从第一个选择框移除选项,然后以相同的值创建一个 option 选项

再将创建好的 option 移入第二个选项框

但是使用 DOM 的appendChild 方法就可以轻松完成该操作,因为appendChild 方法会先将指定节点从其父节点移除

然后再将其插入文档的指定位置:

var selectbox1 = document.getElementById("selectbox1");
var selectbox2 = document.getElementById("selectbox2"); selectbox2.appendChild(selectbox1.options[0]);

移动选项与移除选项有着相近的地方,那就是都会重置 index 属性

对于重排选项次序来说,最适合的 DOM 方法就是 insertBefore:

var optionToMove = selectbox.optionsp[1];
selectbox.insertBefore(optionToMove,selectbox.options[optionToMove.index-1]);

Javascript高级编程学习笔记(79)—— 表单(7)选择框脚本的更多相关文章

  1. 《JavaScript高级程序设计》笔记:表单脚本(十四)

    表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在JS中,表单对应的是HTMLFormElement类型.HTMLFormElement继承了HTMLElement,因而 ...

  2. Javascript高级编程学习笔记(75)—— 表单(3)表单字段

    表单字段 表单作为web应用中不可或缺的一部分,当然也是可以使用原生的 DOM 元素来访问的 除了标准的访问方式之外,每个表单都拥有一个 elements 属性,该属性保存着该表单所有 表单元素 的集 ...

  3. Javascript高级编程学习笔记(80)—— 表单(8)表单序列化

    表单序列化 随着 Ajax 的出现,表单序列化成为一种常见需求 以将表单信息序列化为查询字符串为例 我们可以利用表单的 type 属性,以及 name 和 value 实现对表单的序列化 序列化应满足 ...

  4. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API

    自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...

  5. Javascript高级编程学习笔记(77)—— 表单(5)过滤输入

    在日常实践中,我们常常会需要用户按照某种规则输入数据 但是文本框在默认情况下缺少验证数据的手段,因此需要使用JS来完成此类过滤输入的操作 通过事件和DOM的结合手段就能够将普通的文本框转换为功能型控件 ...

  6. Javascript高级编程学习笔记(74)—— 表单(2)表单提交及重置

    表单提交 表单的很大一部分作用就是帮助用户完成和服务器的交互 所以表单提交是表单中比较重要的部分 虽然现如今的大部分应用场景都使用 AJAX 的异步请求来代替表单,但是仍有部分操作需要使用表单来完成, ...

  7. Javascript高级编程学习笔记(73)—— 表单(1)表单基础

    表单 JS最初的一个用途就是帮助服务器分担处理表单的责任 时至今日,虽然web应用以及JS都有了长足的发展,但是表单依然是现在web应用中比较重要的部分. 因为默认的表单控件很丑,所以有时候我们会使用 ...

  8. Javascript高级编程学习笔记(83)—— 富文本选区(3)

    富文本选区 在富文本编辑器中使用 iframe 的 getSelection() 方法可以获取选中的文本 该方法是 window 对象和 document 对象的属性,调用后会返回一个当前选选择文本的 ...

  9. Javascript高级编程学习笔记(64)—— 事件(8)键盘与文本事件

    键盘与文本事件 用户在使用键盘时会触发键盘事件 “DOM2级事件”最初规定了键盘事件,但是最后在定稿时又删除了相应内容 所以键盘事件被放入了DOM3级事件的规范中 总的来说有三个键盘事件: keydo ...

随机推荐

  1. VSCode下调试mocha测试用例

    之前使用tape做Node.js的单元测试,最方便一条就是使用它就和自己写个控制台应用程序测试一样,控制起来比较灵活,直接用VSCode进行调试也比较方便.然而tape输出中文字符总是乱码,想了很多办 ...

  2. 安装mitmproxy

    https://www.jianshu.com/p/1dd40826113b 先连接到同一个局域网,再访问官网下载描述文件

  3. 直接插入排序(js版)

    直接插入排序(从小到大) 基本思想:将一个记录插入到已经排好序的有序表中,得到一个新的,记录数加1的有序表. function insertSort(arr){ var i,j,temp=0; for ...

  4. asp.net WebService如何去掉asmx后缀

    现在有一个发布好的WebService,地址是http://hovertree.com:2706/UploadExpenseToConstract.asmx能不能把最后面的asmx去掉呢?变成http ...

  5. CSS3网页动画

    CSS3网页动画 概要:CSS3变形是一些效果的集合 如:平移.旋转.缩放.倾斜效果 每个效果都可以称为变形(transform)他们可以分别操控元素发生平移.旋转.缩放.倾斜等变化. 网页中能够实现 ...

  6. Asp.Net项目与TCP服务端交互

    private void SocketSend(string sendstr) { //将字符串转换成字节数组 Byte[] fsSize = System.Text.Encoding.Default ...

  7. python语法之函数2

    高阶函数: def f(n): return n*n def foo(a,b,func): func(a)+func(b) ret=func(a)+func(b) return ret foo(1,2 ...

  8. 常用API String

    Java的API以及Object类 Java的API Java的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JD ...

  9. Ubuntu搭建Anki服务器

    Ubuntu搭建Anki服务器 第一步安装Anki 阿里云的服务器,xshell远程登录上 #以root用户进行操作 #安装Akni服务 easy_install AnkiServer #添加名为an ...

  10. [Java练习题] -- 1. 使用java打印杨辉三角

    package cn.fzm.demo1.array; import java.util.Scanner; /* * 需求:打印杨辉三角形(行数可以键盘录入) 1 1 1 1 2 1 1 3 3 1 ...