javascript有兩個很相近的東西,property與attribute,懶一點的人都翻譯成“屬性”。 如果專業點,則區別為“屬性”與“特性”。我認為叫做固有屬性與自定義屬性比較好一點。
property是來自於原型鏈,所有HTML元素,都是HTMLElemenet的實例,HTMLElement再往上走,就是 Element,再往上走就是Node,每一級原型都有屬性。就算你沒有在標簽內顯式定義這些屬性,它們都存在。 比如title, id, class, lang, dir等等,你沒有定義它們,它們就默認是一個空字符串。不同的標簽都有自己獨特 的固有屬性,比如A標簽的href,表單元素的tabindex標簽。
attributes是通過setAttribute設置,或者你<div aaa=bbb></div>這樣添加的非固有屬性外的屬性,它們沒有顯式定義是為undefined, 顯式定義了,它的值肯定是一個字符串(固有屬性沒有這限制,比如tabindex的值為數字,option的selected為布爾, form的elements為一個類數組,五花八門的)
property在標簽中是存在映射,比如class,它會轉換為className, for轉換為forHtml, tab index轉換為tabIndex, bgcolor轉換bgColor....
而attribute則不存在映射,但只要你定義在
<!doctype hmtl> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>attribute</title> </head> <body> <div> <div aaa="1" aAa="2" aaA="3">11</div> </div> </body> </html>
最后瀏覽器會解析成這樣
<!doctype hmtl> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>attribute</title> </head> <body> <div> <div aaa="1" >11</div> </div> </body> </html>
細節處見功力,只要你能區別開property與attribute,你就能窺探到DOM世界的龐然大廈。一個標簽不是你想象中的那么簡單,一個DIV標簽是有七層原型鏈!
HTMLDivElement , HTMLElement, Element, Node, EventTarget, Function, Object
每個瀏覽器在設計這些時,事先也沒有打交道,於是一大堆兼容性問題在里面。IE在向W3C靠攏過程中,其屬性系統發生了三次重大的轉變。這些故事可以從我的書《javascript框架設計》(這里有源碼)看到,或是以后有空我向大家披露一下!