1.獲取表單:通過 document.forms 可以取得頁面中所有的表單。在這個集合裏,可以通過數值索引或name值來取得特定的表單
2.提交按鈕
<input type="image" src="graphic.gif"> 和 <input type="submit" value="Submit Form"> 或者 <button type="submit">Submit Form</button>是一樣的,在單擊或者回車鍵觸發都可以提交表單
3.一些誤解知識
①document.getElementById("myForm").submit(),在以調用 submit()方法的形式提交表單時,不會觸發submit事件,因此要記得在調用此方法前先驗證表單數據。
②調用 reset() 與調用 submit() 方法不同,調用 reset() 方法會想單擊重置按鈕一樣觸發 reset 事件
③change 事件,對於 <input> 和 <textare> 元素,在它們失去焦點且 value 值發生改變時觸發;對於 <select> 元素,在其選項改變時觸發。並且 change 事件和 blur 事件的發生順序並沒有嚴格的規定
4.獲取表單字段
每個表單都有 elements 屬性,該屬性是表單中所有表單元素的集合,有序地包含這表單中的所有字段,可以按照位置和 name 特性來訪問它們。
如果有多個表單控件都在使用一個 name (如單選按鈕),那麼就會返回以該 name 命名的一個 Nodelist。
5.禁用表單字段(除 filedset 元素),防止表單被重複點擊提交
(function(){
var form = document.forms[0];
//Code to prevent multiple form submissions
EventUtil.addHandler(form, "submit", function(event){
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//get the submit button
var btn = target.elements["submit-btn"];
//disable it
btn.disabled = true;
});
})();
注意,不能通過 onclick 事件處理程序來實現這個功能,原因是不同瀏覽器之間存在“時差”:有的瀏覽器會在觸發表單的 submit 事件之前觸發 click 事件,有的相反。
對於先觸發 click 事件的瀏覽器,意味着會在提交表單發生之前禁用按鈕,結果永遠都不會提交表單???sorry,i don't understand,why??什麼鬼??
因此,最好是通過 submit 事件來禁用提交按鈕。不過,這種方法不適合表單中不包含提交按鈕的情況;如前所述,只有在包含提交按鈕的情況下,纔有可能觸發表單的 submit 事件
6.選擇框腳本
① HTMLSelectElement 類型提供的屬性和方法:
add(newOption, relOption),類似insertBefore,相反爲remove(index)
options:控件中所有<option>元素的 HTMLCollection
selectedIndex:基於 0 的選中項的索引,如果沒有選中項,則值爲 -1
②選擇框的 value 屬性由當前選中項決定,相應規則如下:
a.如果沒有選中的項,則選擇框的 value 屬性保存空字符串
b.如果有一個選中項,而且該項的 value 特性已經在HTML中指定,則選擇框中的 value 屬性等於該選中項的 value 特性。即使value 特性的值是空字符串,也同樣遵循詞條規則
c.如果有一個選中項,但該項的 value 特性未在 HTML 中指定,則選擇框的 value 屬性等於該項的文本
d.如果有多個選中項,則選擇框的 value 屬性將依據前兩條規則取得第一個選中項的值
③HTMLOptionElement
index:當前選項在 options 集合中的索引
selected:布爾值,表示當前選項是否被選中。true | false。注意點:在允許多選的選擇框中設置選項的 selected 屬性,不會取消對其他選中項的選擇,但在單選選擇框中,修改某個選項的 selected 屬性則會取消對其他選項的選擇。特別注意的是,將 selected 屬性設置爲 false 對單選選擇框沒有影響
text:選項的文本
③添加新項最佳方案
var newOption = new Option("option text", "option value");
selectBox.add(newOption, undefined); //最佳方案
在IE 和 兼容 DOM的瀏覽器中,上面的代碼都可正常使用。如果你想把新項添加到其他位置(不是最後一個位置),就應該使用標準的 DOM 技術和 insertBefore() 方法
標準的DOM方法是指:
var newOption = document.createElement("option");
newOption.appendChild(document.createTextNode("option text"));
newOption.setAttribute("value", "option value");
selectbox.appendChild(newOption);
爲什麼上面的不用new Option() 構造 函數呢?因此在不兼容DOM的瀏覽器會創建一個 object 的實例,而不是兼容 DOM的瀏覽器中返回的一個 <option> 元素(IE-版本中有問題)
7.表單序列化
在編寫代碼之前,必須先搞清楚在表單提交期間,瀏覽器是怎樣將數據發送給服務器的。
①對錶單字段的名稱和值進行 URL 編碼,使用合號(&)分隔
②不發送禁用的表單字段
③只發送勾選的複選框和單選按鈕
④不發送 type 爲“reset” 和 “button” 的按鈕
⑤多選選擇框中的每個選中的值單獨一個條目
⑥在單擊提交按鈕提交表單的情況下,也會發送提交按鈕;否則,不發送提交按鈕。也包括 type 爲 “image” 的 <input> 元素 ?????
⑦<select> 元素的值,就是選中的 <option> 元素的 value 特性的值。如果 <option> 元素沒有 value 特性,則是 <option>元素的文本值