W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
HTML元素包括標(biāo)簽名和若干個鍵值對,這個鍵值對就稱為“屬性”(attribute)。
<a id="test" href="http://www.example.com">
鏈接
</a>
上面代碼中,a
元素包括兩個屬性:id
屬性和href
屬性。
在DOM中,屬性本身是一個對象(Attr
對象),但是實際上,這個對象極少使用。一般都是通過元素節(jié)點對象(HTMlElement
對象)來操作屬性。本節(jié)介紹如何操作這些屬性。
HTML元素對象有一個attributes
屬性,返回一個類似數(shù)組的動態(tài)對象,成員是該元素標(biāo)簽的所有屬性節(jié)點對象,屬性的實時變化都會反映在這個節(jié)點對象上。其他類型的節(jié)點對象,雖然也有attributes
屬性,但是返回的都是null
,因此可以把這個屬性視為元素對象獨有的。
document.body.attributes[0]
document.body.attributes.bgcolor
document.body.attributes['ONLOAD']
注意,上面代碼中,第一行attributes[0]
返回的是屬性節(jié)點對象,后兩行都返回屬性值。
屬性節(jié)點對象有name
和value
屬性,對應(yīng)該屬性的屬性名和屬性值,等同于nodeName
屬性和nodeValue
屬性。
// HTML代碼為
// <div id="mydiv">
var n = document.getElementById('mydiv');
n.attributes[0].name // "id"
n.attributes[0].nodeName // "id"
n.attributes[0].value // "mydiv"
n.attributes[0].nodeValue // "mydiv"
下面代碼可以遍歷一個元素節(jié)點的所有屬性。
var para = document.getElementsByTagName('p')[0];
if (para.hasAttributes()) {
var attrs = para.attributes;
var output = '';
for(var i = attrs.length - 1; i >= 0; i--) {
output += attrs[i].name + '->' + attrs[i].value;
}
result.value = output;
} else {
result.value = 'No attributes to show';
}
HTML元素節(jié)點的標(biāo)準(zhǔn)屬性(即在標(biāo)準(zhǔn)中定義的屬性),會自動成為元素節(jié)點對象的屬性。
var a = document.getElementById('test');
a.id // "test"
a.href // "http://www.example.com/"
上面代碼中,a
元素標(biāo)簽的屬性id
和href
,自動成為節(jié)點對象的屬性。
這些屬性都是可寫的。
var img = document.getElementById('myImage');
img.src = 'http://www.example.com/image.jpg';
上面的寫法,會立刻替換掉img
對象的src
屬性,即會顯示另外一張圖片。
這樣修改HTML屬性,常常用于添加表單的屬性。
var f = document.forms[0];
f.action = 'submit.php';
f.method = 'POST';
上面代碼為表單添加提交網(wǎng)址和提交方法。
注意,這種用法雖然可以讀寫HTML屬性,但是無法刪除屬性,delete
運算符在這里不會生效。
HTML元素的屬性名是大小寫不敏感的,但是JavaScript對象的屬性名是大小寫敏感的。轉(zhuǎn)換規(guī)則是,轉(zhuǎn)為JavaScript屬性名時,一律采用小寫。如果屬性名包括多個單詞,則采用駱駝拼寫法,即從第二個單詞開始,每個單詞的首字母采用大寫,比如onClick
。
有些HTML屬性名是JavaScript的保留字,轉(zhuǎn)為JavaScript屬性時,必須改名。主要是以下兩個。
for
屬性改為htmlFor
class
屬性改為className
另外,HTML屬性值一般都是字符串,但是JavaScript屬性會自動轉(zhuǎn)換類型。比如,將字符串true
轉(zhuǎn)為布爾值,將onClick
的值轉(zhuǎn)為一個函數(shù),將style
屬性的值轉(zhuǎn)為一個CSSStyleDeclaration
對象。
元素節(jié)點提供四個方法,用來操作屬性。
getAttribute()
setAttribute()
hasAttribute()
removeAttribute()
其中,前兩個讀寫屬性的方法,與前一部分HTML標(biāo)簽對象的屬性讀寫,有三點差異。
(1)適用性
getAttribute()
和setAttribute()
對所有屬性(包括用戶自定義的屬性)都適用;HTML標(biāo)簽對象的屬性,只適用于標(biāo)準(zhǔn)屬性。
(2)返回值
getAttribute()
只返回字符串,不會返回其他類型的值。HTML標(biāo)簽對象的屬性會返回各種類型的值,包括字符串、數(shù)值、布爾值或?qū)ο蟆?/p>
(3)屬性名
這些方法只接受屬性的標(biāo)準(zhǔn)名稱,不用改寫保留字,比如for
和class
都可以直接使用。另外,這些方法對于屬性名是大小寫不敏感的。
var image = document.images[0];
image.setAttribute('class', 'myImage');
上面代碼中,setAttribute
方法直接使用class
作為屬性名,不用寫成className
。
Element.getAttribute
方法返回當(dāng)前元素節(jié)點的指定屬性。如果指定屬性不存在,則返回null
。
// HTML代碼為
// <div id="div1" align="left">
var div = document.getElementById('div1');
div.getAttribute('align') // "left"
Element.setAttribute
方法用于為當(dāng)前元素節(jié)點新增屬性。如果同名屬性已存在,則相當(dāng)于編輯已存在的屬性。
var d = document.getElementById('d1');
d.setAttribute('align', 'center');
下面是對img
元素的src
屬性賦值的例子。
var myImage = document.querySelector('img');
myImage.setAttribute('src', 'path/to/example.png');
Element.hasAttribute
方法返回一個布爾值,表示當(dāng)前元素節(jié)點是否包含指定屬性。
var d = document.getElementById('div1');
if (d.hasAttribute('align')) {
d.setAttribute('align', 'center');
}
上面代碼檢查div
節(jié)點是否含有align
屬性。如果有,則設(shè)置為“居中對齊”。
Element.removeAttribute
方法用于從當(dāng)前元素節(jié)點移除屬性。
// HTML代碼為
// <div id="div1" align="left" width="200px">
document.getElementById('div1').removeAttribute('align');
// 現(xiàn)在的HTML代碼為
// <div id="div1" width="200px">
有時,需要在HTML元素上附加數(shù)據(jù),供JavaScript腳本使用。一種解決方法是自定義屬性。
<div id="mydiv" foo="bar">
上面代碼為div
元素自定義了foo
屬性,然后可以用getAttribute()
和setAttribute()
讀寫這個屬性。
var n = document.getElementById('mydiv');
n.getAttribute('foo') // bar
n.setAttribute('foo', 'baz')
這種方法雖然可以達(dá)到目的,但是會使得HTML元素的屬性不符合標(biāo)準(zhǔn),導(dǎo)致網(wǎng)頁的HTML代碼通不過校驗。
更好的解決方法是,使用標(biāo)準(zhǔn)提供的data-*
屬性。
<div id="mydiv" data-foo="bar">
然后,使用元素節(jié)點對象的dataset
屬性,它指向一個對象,可以用來操作HTML元素標(biāo)簽的data-*
屬性。
var n = document.getElementById('mydiv');
n.dataset.foo // bar
n.dataset.foo = 'baz'
上面代碼中,通過dataset.foo
讀寫data-foo
屬性。
刪除一個data-*
屬性,可以直接使用delete
命令。
delete document.getElementById('myDiv').dataset.foo;
除了dataset
屬性,也可以用getAttribute('data-foo')
、removeAttribute('data-foo')
、setAttribute('data-foo')
、hasAttribute('data-foo')
等方法操作data-*
屬性。
注意,data-
后面的屬性名有限制,只能包含字母、數(shù)字、連詞線(-
)、點(.
)、冒號(:
)和下劃線(_
)。而且,屬性名不應(yīng)該使用A
到Z
的大寫字母,比如不能有data-helloWorld
這樣的屬性名,而要寫成data-hello-world
。
轉(zhuǎn)成dataset
的鍵名時,連詞線后面如果跟著一個小寫字母,那么連詞線會被移除,該小寫字母轉(zhuǎn)為大寫字母,其他字符不變。反過來,dataset
的鍵名轉(zhuǎn)成屬性名時,所有大寫字母都會被轉(zhuǎn)成連詞線+該字母的小寫形式,其他字符不變。比如,dataset.helloWorld
會轉(zhuǎn)成data-hello-world
。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: