
在HTML中使用 <select> 和 <option> 元素創(chuàng)建選擇框。而 <select> 元素對應(yīng)的是 HTMLSelectElement 接口,<option> 元素對應(yīng)的是 HTMLOptionElement 接口。這兩個接口都是通過 HTMLElement 接口從其他 HTML 元素共享所有屬性和方法。
先從 <select> 元素對應(yīng)的 HTMLSelectElement 接口開始介紹專屬的屬性和方法。
-
autofocus:返回boolean值,表示控件在頁面加載時是否應(yīng)該具有輸入焦點,除非用戶覆蓋它。等價于<select>元素中的autofocus屬性。 -
disabled: 返回boolean值,表示控件是否被禁用。等價于<select>元素中的disabled屬性。 -
form:返回HTMLFormElement值的只讀屬性,表示與此元素關(guān)聯(lián)的表單。 -
labels:與此元素關(guān)聯(lián)的<label>元素組成的NodeList。 -
length:返回number值,表示<select>元素中<option>元素的數(shù)量。 -
multiple:返回boolean值,表示是否允許多選,等價于<select>元素中的multiple屬性。 -
name:返回string值,表示此控件的名稱。等價于<select>元素中的name屬性。 -
options:返回HTMLOptionsCollection值的可讀屬性,表示此元素包含的<option>元素集。 -
required:返回boolean值,表示用戶在提交表單之前是否需要選擇值。等價于<select>元素中的required屬性。 -
selectedIndex:返回number值,表示第一個選定的<option>元素的索引。值為-1表示未選擇任何元素,對于允許多選的列表,始終是第一個選項的索引。 -
selectedOptions:返回HTMLCollection值的可讀屬性,表示所選的<option>的元素集。 -
size:返回number值,表示控件中可見項的數(shù)量。等價于<select>元素的size屬性。默認值為1,如果multiple為true,則為4。 -
type:返回string值的只讀屬性,表示表單控件類型。當multiple為true時,它返回"select-multiple",否則返回"select-one"。 -
validationMessage:返回string值的只讀屬性,表示一個本地化消息,描述了控件不滿足的驗證約束。如果willvalidate=false,或者它滿足其約束,則此屬性為空字符串。 -
validity:返回ValidityState的只讀屬性,表示該控件所處的有效狀態(tài)。 -
value:返回string值,表示表單控件的值。返回option元素的value屬性,如果沒有該屬性,則返回text屬性。 -
willValidate:返回boolean值的只讀屬性,表示該按鈕是否是約束驗證的候選者。如果任何條件禁止約束驗證,則為false。 -
add(elemen, before):將element元素添加到before元素之前。element參數(shù)為要添加的<option>元素,before參數(shù)為已存在的<option>元素,before為可選參數(shù)。 -
checkValidity():檢查元素是否有任何約束以及它是否滿足它們。如果元素未通過約束,瀏覽器將在元素處觸發(fā)可取消的invalid事件并返回false。 -
item(index):從<select>元素的options集合中獲取一個<option>元素。 -
namedItem(name):獲取具有指定名稱的options集合中的<option>元素。而傳入的name參數(shù)可以匹配<option>元素的id或name屬性。 -
remove(index):從<select>元素的options集合中刪除指定索引處的元素。 -
reportValidity():此方法向用戶報告元素約束的問題。如果有問題,它會在元素處觸發(fā)可取消的invalid事件,并返回false;如果沒有問題,則返回true。 -
setCustomValidity(error):將<select>元素的自定義有效性消息設(shè)置為指定的消息。使用空字符串表示元素不具有自定義有效性錯誤。
下面介紹一下<select> 元素根據(jù)不同選中狀態(tài)下的value屬性的值:
<select name="location" id="selLocation">
<option value="Sunnyvale, CA">Sunnyvale</option>
<option value="Los Angeles, CA">Los Angeles</option>
<option value="Mountain View, CA">Mountain View</option>
<option value="">China</option>
<option>Australia</option>
</select>
當選中選項框中的第一項時,<select> 元素的 value 值為 "Sunnyvale, CA";而選中第四項時,<select> 元素的 value 值為 "",因為該項的 value 屬性是空字符串;選中最后一項,則 value 值為 "Australia",因為該 <option> 元素沒有指定 value 屬性。
因此,根據(jù)以上的例子,<select> 元素的value屬性根據(jù)以下規(guī)則獲取值:
- 無選中項,
<select>元素的value屬性為空字符串。 - 有一個選中項,且其
value屬性有值,則<select>元素的value屬性的值為<option>元素的value屬性的值。 - 有一個選中項,且其
value屬性沒有指定值,則<select>元素的value屬性的值是<option>元素的text值。 - 有多個選中項,則
<select>元素的值會獲取第一個<option>元素的value值或text值。
再介紹 <option> 元素對應(yīng)的 HTMLOptionElement 接口專屬屬性和方法。
-
defaultSelected:返回boolean值。表示默認情況下是否被選中。 -
disabled:返回boolean值。表示該選項不可用,等價于<option>元素的disabled屬性的值。 -
form:返回HTMLFormElement值的只讀屬性。如果<option>是<select>元素的后代,表示與相應(yīng)<select>元素的form值相同的值,如果不是,則為null。 -
index:返回string的只讀屬性。表示選項在options集合中的索引。 -
label:返回string的只讀屬性。表示<option>元素的標簽,等價于<option>元素的label屬性。如果未設(shè)置此屬性,則讀取該屬性將返回元素的文本內(nèi)容。 -
selected:返回boolean值,表示當前是否選擇了該選項。 -
text:返回string值。表示選項的文本值。 -
value:返回string值。表示選項的值。等價于<option>元素的value屬性。
<small>
這里強調(diào)一下,<select> 元素的 change 事件與其它表單字段是不一樣的。其它表單字段會在自己的值改變后觸發(fā) change 事件,然后字段失去焦點。而 <select> 會在選中一項時立即觸發(fā) change 事件。
</small>
選項處理
對于只允許選擇一項的 <select> 元素,獲取選項最簡單的方式是使用 <select> 元素的 selectIndex 屬性,如下面的例子:
let selectedOption = selectbox.options[selectbox.selectedIndex];
獲取到 <option> 元素后,就可以根據(jù) <option> 元素的屬性和方法獲取想要的信息。
對于允許多選的 <select> 元素,selectedIndex 屬性就像只允許選擇一項一樣。設(shè)置 selectedIndex 會移除所有選項,只選擇指定的項,而獲取 selectedIndex 只會返回選中的第一項的索引。
選項還可以通過取得選項的引用并將其 selected 屬性設(shè)置為 true 來選中。例如,以下代碼會選中 <select> 的第一項:
selectbox.options[0].selected = true;
與 selectedIndex 不同,設(shè)置選項的 selected 屬性不會在多選時移除其他選項,從而可以動態(tài)選擇任意多個選項。如果修改單選框中選項的 selected 屬性,則其他選項會被移除。要注意的是,把 selected 屬性設(shè)置為 false 對單選框沒有影響。
通過 selected 屬性可以確定選擇框中哪個選項被選中。要取得所有選中項,需要循環(huán)選項集合逐一檢測 selected 屬性,比如:
function getSelectedOptions(selectbox){
let result = new Array();
for (let option of selectbox.options) {
if (option.selected) {
result.push(option);
}
}
return result;
}
添加選項
可以使用 JavaScript 動態(tài)創(chuàng)建選項并將它們添加到選擇框。首先,可以使用 DOM 方法,如下所示:
let newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("Option text"));
newOption.setAttribute("value", "Option value");
selectbox.appendChild(newOption);
以上代碼創(chuàng)建了一個新的<option>元素,使用文本節(jié)點添加文本,設(shè)置其 value 屬性,然后將其添加到選擇框。添加到選擇框之后,新選項會立即顯示出來。
瀏覽器原生提供 Option() 構(gòu)造函數(shù)創(chuàng)建 HTMLOptionElement 實例:
new Option(text, value, defaultSelected, selected) : HTMLOptionElement
-
text:一個可選的string值參數(shù),表示該選項的文本內(nèi)容。如果省略,返回空字符串。 -
value:一個可選的string值參數(shù),表示該選項的值。如果省略,默認返回text屬性的值。 -
defaultSelected:一個可選的boolean值參數(shù),表示該項是否默認選中,默認為false。注意,即使設(shè)為true,也不代表該項的selected屬性為true。 -
selected:一個可選的boolean值參數(shù),表示該項是否選中。默認為false。
來看案例:
let newOption = new Option("Option Text", "Option Value", true);
創(chuàng)建之后,需要將該實例添加到 HTML 的 <select> 元素中,這里有兩種添加方法:
-
DOM操作中的appendChild()方法。 -
HTMLSelectElement接口中的add()方法。
這里詳細介紹下 add() 方法:
add(element: HTMLOptionElement | HTMLOptGroupElement, before?: HTMLElement | number | null): void;
-
element:一個HTMLOptionElement或HTMLOptGroupElement元素的參數(shù)。 -
before:可選的參數(shù),是集合中的一個元素或者類型為number的索引,表示在element參數(shù)之前插入。如果傳入的是null或索引不存在,新元素會添加在集合的末尾。
如果想要符合所有瀏覽器的規(guī)范,可以傳入 undefined 作為第二個參數(shù)。
let newOption = new Option("Option text", "Option value", true);
selectbox.add(newOption, undefined);
<small>這里注意一下 defaultSelected 和 selected 兩個參數(shù),有時候容易弄混。selected 屬性為 true 時,該 <option> 當前狀態(tài)處于已選擇狀態(tài)。defaultSelected 屬性為 true 時,表示 <option> 在默認情況下為已選擇狀態(tài),但不代表 <option> 的當前狀態(tài)是已選擇狀態(tài)。當頁面重置時,selected 屬性值為 true 的 <option> 可能會變成未選擇狀態(tài),而 defaultSelected 屬性值為 true 的 <option> 則一定會變成已選擇狀態(tài)。</small>
移除選項
移除 <option> 元素的方法也不止一種,下面列舉的方法都可以實現(xiàn):
-
DOM操作中的removeChild()方法。 -
HTMLSelectElement接口中的remove()方法。傳入的參數(shù)為要移除的<option>元素的索引。 - 直接將指定
<option>元素賦值為null。如selects.options[1] = null。
要清除選擇框的所有選項,需要迭代所有選項并逐一移除它們,如下面例子所示:
function clearSelectbox(selectbox) {
for (let index = 0; index < selectbox.options.length;) {
selectbox.remove(0);
}
}
移動和重排選項
使用 DOM 操作中的 appendChild() 方法實現(xiàn)從一個 <select> 元素中將 <option> 移到另一個 <select> 元素中,這種實現(xiàn)方法會將 <option> 元素先從其父元素中移除,然后再插入指定位置。如下所示:
let selectbox1 = document.getElementById("selLocations1");
let selectbox2 = document.getElementById("selLocations2");
selecbox2.appendChild(selectbox1.options[0]);
移動選項和移除選項都會導(dǎo)致每個 <option> 的 index 屬性重置。
重排 <option> 的話,使用 DOM 操作中的 insertBefore() 方法,而移到最后位置,還是使用 appendChild() 方法較為方便。
下面的代碼演示了將一個 <option> 在 <select> 中前移一個位置:
let optToMove = selectbox.options[1];
selectbox.insertBefore(optToMove, selectbox.options[optionToMove.index-1]);
這個例子首先獲得要移動 <option> 的索引,然后將其插入之前位于它前面的 <option> 之前,其中第二行代碼適用于除第一個 <option> 之外的所有 <option>。下面的代碼則可以將<option>向下移動一個位置:
let optionToMove = selectbox.options[1];
selectbox.insertBefore(optionToMove,
selectbox.options[optionToMove.index+2]);
總結(jié)
<select> 和 <option> 是在 HTML 頁面布局時,經(jīng)常使用的表單控件,學會使用與之對應(yīng)的 HTMLSelectElement 和 HTMLOptionElement 接口中的屬性和方法會很容易的操控 <select> 和 <option> 元素。借助于 DOM 操作 <select> 和 <option> 也較為方便。
更多內(nèi)容請關(guān)注公眾號「海人為記」