細說HTML元素的ID和Name屬性的區別

可以說幾乎每個做過Web開發的人都問過,到底元素的ID和Name有什麼區別阿?為什麼有了ID還要有Name呢?!
而同樣我們也可以得到最classical的答案:ID就像是一個人的身份證號碼,而Name就像是他的名字,ID顯然是唯一的,而Name是可以重複的。

  上周我也遇到了ID和Name的問題,在頁面裡輸入了一個input type="hidden",只寫了一個ID='SliceInfo',賦值後submit,在後台用 Request.Params["SliceInfo"]卻怎麼也去不到值。後來恍然大悟因該用Name來標示,於是在input裡加了個 Name='SliceInfo',就一切ok了。

  第一段裡對於ID和Name的解答說的太籠統了,當然那個解釋對於ID來說是完全對的,它就是Client端HTML元素的Identity。而Name其實要複雜的多,因為Name有很多種的用途,所以它並不能完全由ID來代替,從而將其取消掉。

實際用途有:

用途1: 作為可與伺服器交互資料的HTML元素的伺服器端的標示,比如input、select、textarea、和button等。我們可以在伺服器端根據其Name通過Request.Params取得元素送出的值。
用途2: HTML元素Input type='radio'分組,我們知道radio button控件在同一個分組類,check操作是mutex的,同一時間只能選中一個radio,這個分組就是根據相同的Name屬性來實現的。
用途3: 建立頁面中的錨點,我們知道<a href="URL">link</a>是獲得一個頁面超級連結,如果不用href屬性,而改用Name,如:<a name="PageBottom"></a>,我們就獲得了一個頁面錨點。
用途4: 作為對象的Identity,如Applet、Object、Embed等元素。比如在Applet對像實例中,我們將使用其Name來引用該對象。
用途5: 在IMG元素和MAP元素之間關聯的時候,如果要定義IMG的熱點區域,需要使用其屬性usemap,使usemap="#name"(被關聯的MAP元素的Name)。
用途6: 某些特定元素的屬性,如attribute,和param。例如為Object定義參數<PARAM NAME = "appletParameter" VALUE = "value">。

  顯然這些用途都不是能簡單的使用ID來代替掉的,所以HTML元素的ID和Name的卻別並不是身份證號碼和姓名這樣的區別,它們更本就是不同作用的東西。

  當然HTML元素的Name屬性在頁面中也可以起那麼一點ID的作用,因為在DHTML對像樹中,我們可以使用document.getElementsByName來取得一個包含頁面中所有指定Name元素的對象數組。

  在這裡順便說一下,要是頁面中有n(n>1)個HTML元素的ID都相同了怎麼辦?在DHTML對像中怎麼引用他們呢?如果我們使用ASPX頁面,這樣的情況是不容易發生的,因為aspnet進程在處理aspx頁面時根本就不允許有ID非唯一,這是頁面會被拋出異常而不能被正常的render。要是不是動態頁面,我們硬要讓ID重複那IE怎麼搞呢?
這個時候我們還是可以繼續使用document.getElementById取得對象,只不過我們只能取得ID重複的那些對像中在HTML Render時第一個出現的對象。而這時重複的ID會在引用時自動變成一個數組,ID重複的元素按Render的順序依次存在於數組中

 

 


部分狀況下 id 和 name 是可以互通的,所以常常會讓人搞混,
但是其根本的定義可以讓我們很容易分辨其差別:

name 是識別網頁上某個控制項的名稱,
這些控制項多半都是 Windows 或 IE 內建的物件,
例如 Frame(其實就是 IE 瀏覽器物件)、TextArea(系統內建物件)、
URI 物件(IE 內建物件)等等。牽涉到 name 的動作,
多半都是資料的傳輸或是連結的開啟等等。

id 是識別網頁上某個 DHTML 物件的名稱,
對象是所有的 HTML 元件。牽涉到 id 的動作,
多半是做動態效果的控制之用。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 avrilnote 的頭像
    avrilnote

    Avril Note

    avrilnote 發表在 痞客邦 留言(1) 人氣()