固有屬性與自定義屬性


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框架設計》(這里有源碼)看到,或是以后有空我向大家披露一下!

posted on 2015-09-01 22:16  司徒正美  閱讀(3693)  評論(2編輯  收藏


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM