Javascript高級程序設計第十四章(表單)

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>元素的文本值

 




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章