javascript中attribute和property的區別詳解

來源:互聯網
上載者:User

DOM元素的attribute和property很容易混倄在一起,分不清楚,兩者是不同的東西,但是兩者又聯絡緊密。很多新手朋友,也包括以前的我,經常會搞不清楚。

attribute翻譯成中文術語為“特性”,property翻譯成中文術語為“屬性”,從中文的字面意思來看,確實是有點區別了,先來說說attribute。

attribute是一個特性節點,每個DOM元素都有一個對應的attributes屬性來存放所有的attribute節點,attributes是一個類數組的容器,說得準確點就是NameNodeMap,總之就是一個類似數組但又和數組不太一樣的容器。attributes的每個數字索引以名值對(name=”value”)的形式存放了一個attribute節點。
複製代碼 代碼如下:<div class="box" id="box" gameid="880">hello</div>
上面的div元素的HTML代碼中有class、id還有自訂的gameid,這些特性都存放在attributes中,類似下面的形式:
複製代碼 代碼如下:[ class="box", id="box", gameid="880" ]
可以這樣來訪問attribute節點:
複製代碼 代碼如下:
var elem = document.getElementById( 'box' );
console.log( elem.attributes[0].name ); // class
console.log( elem.attributes[0].value ); // box

但是IE6-7將很多東西都存放在attributes中,上面的存取方法和標準瀏覽器的返回結果又不同。通常要擷取一個attribute節點直接用getAttribute方法:
複製代碼 代碼如下:console.log( elem.getAttribute('gameid') ); // 880

要設定一個attribute節點使用setAttribute方法,要刪除就用removeAttribute:

複製代碼 代碼如下:elem.setAttribute('testAttr', 'testVal');
console.log( elem.removeAttribute('gameid') ); // undefined

attributes是會隨著添加或刪除attribute節點動態更新的。
property就是一個屬性,如果把DOM元素看成是一個普通的Object對象,那麼property就是一個以名值對(name=”value”)的形式存放在Object中的屬性。要添加和刪除property也簡單多了,和普通的對象沒啥分別:
複製代碼 代碼如下:
elem.gameid = 880; // 添加
console.log( elem.gameid ) // 擷取
delete elem.gameid // 刪除

之所以attribute和property容易混倄在一起的原因是,很多attribute節點還有一個相對應的property屬性,比如上面的div元素的id和class既是attribute,也有對應的property,不管使用哪種方法都可以訪問和修改。

複製代碼 代碼如下:
console.log( elem.getAttribute('id') ); // box
console.log( elem.id ); // box
elem.id = 'hello';
console.log( elem.getAttribute('id') ); // hello

但是對於自訂的attribute節點,或者自訂property,兩者就沒有關係了。
複製代碼 代碼如下:
console.log( elem.getAttribute('gameid') ); // 880
console.log( elem.gameid ); // undefined
elem.areaid = '900';
console.log( elem.getAttribute('areaid') ) // null

對於IE6-7來說,沒有區分attribute和property:

複製代碼 代碼如下:
console.log( elem.getAttribute('gameid') ); // 880
console.log( elem.gameid ); // 880
elem.areaid = '900';
console.log( elem.getAttribute('areaid') ) // 900

很多新手朋友估計都很容易掉進這個坑中。
DOM元素一些預設常見的attribute節點都有與之對應的property屬性,比較特殊的是一些值為Boolean類型的property,如一些表單元素:

複製代碼 代碼如下:
<input type="radio" checked="checked" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // checked
console.log( radio.checked ); // true

對於這些特殊的attribute節點,只有存在該節點,對應的property的值就為true,如:
複製代碼 代碼如下:
<input type="radio" checked="anything" id="raido">
var radio = document.getElementById( 'radio' );
console.log( radio.getAttribute('checked') ); // anything
console.log( radio.checked ); // true

最後為了更好的區分attribute和property,基本可以總結為attribute節點都是在HTML代碼中可見的,而property只是一個普通的名值對屬性。

複製代碼 代碼如下:
// gameid和id都是attribute節點
// id同時又可以通過property來訪問和修改
<div gameid="880" id="box">hello</div>
// areaid僅僅是property
elem.areaid = 900;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.