attribute 和 property

為了區(qū)別通常將兩個單詞翻譯為 屬性 和 特性

attribute:attribute類型節(jié)點(diǎn)传黄,在JS中有專門處理attribute的函數(shù)(.getAttribute(name) 和 .setAttribute(name, value))沃琅。attribute不只是能夠在HTML文檔上看到的這幾個荚藻,我們還可以自定義attribute加到DOM節(jié)點(diǎn)中。

通過方法 setAttribute 設(shè)置的attribute最終都會反映到元素的attribute類型的節(jié)點(diǎn)中邪财。

property:DOM對象的字段陕壹,和平常使用的obj對象一樣,包含很多字段树埠,這些字段就是property糠馆,取值或者設(shè)置值和普通字段一樣通過 對象.字段 的方式。

容易混淆的是因?yàn)?/strong>:很多attribute節(jié)點(diǎn)還有一個相對應(yīng)的property屬性

另一種說法:有些例如id怎憋、class和title等常用的attribute已經(jīng)被作為property附加在了DOM對象上又碌,也可以取值和賦值,但是自定義的attribute或者自定義的property绊袋,兩者就沒有關(guān)系了

<div id="div1">demo</div>

<script>
    var div = document.getElementById('div1')
    console.log(div.getAttribute('id'))  // div1
    div.id = div2
    console.log(div.getAttribute('id'))  // div2
</script>

上面代碼div的 id attribute可以用 div.id 取到赠橙,通過property更改id后,用getAttribute獲取的id是更新后的id愤炸。

<div class="container"></div>

<script>
    var ct = document.querySelector('.container')

    ct.setAttribute("num", 1)
    ct.num  // undefined

    ct.sum = "2"
    ct.getAttribute("sum")  //null
</script>

對于自定義的attribute和自定義的property,兩者沒有關(guān)系并不能相互取值和影響

區(qū)別:

  1. 去上面的例子掉奄,對一些常見的屬性來說规个,attribute和property共享數(shù)據(jù)凤薛,而且attribute更改了會對property造成影響,反之亦然诞仓。但是兩者的自定義屬性是獨(dú)立數(shù)據(jù)缤苫,即使屬性名字一樣,也互不影響墅拭。但是活玲,IE 67沒有作區(qū)分,依然共享自定義屬性數(shù)據(jù)谍婉。
<input id="test" type="checkbox" checked="checked" sex="male" age="20">
<script>
    var ipt = document.querySelector('#test')
    ipt.getAttribute("sex") // "male"
    ipt.getAttribute("SEX") // "male"
    ipt.sex // undefined
    ipt.getAttribute("age") // "20"
</script>

這里也說明:
1)在HTML里自定義的屬性舒憾,node.property 的方式不能獲取,node.getAttribute() 的方式可以
2)node.getAttribute() 獲取自定義屬性忽略屬性的大小寫
3)node.getAttribute() 獲取自定義屬性得到的值的類型總是字符串

  1. 并不是所有的attribute與對應(yīng)的property名字都一致穗熬,比如attribute的class屬性镀迂,使用property操作的時(shí)候應(yīng)該是className。 ct.className // container
  2. 對于值是true/false的property唤蔗,類似于input的checked attribute等探遵,attribute取得值是HTML文檔字面量值,property是取得計(jì)算結(jié)果妓柜,property改變并不影響attribute字面量箱季,但attribute改變會影響property計(jì)算。
<input id="test" type="checkbox">
<script>
    var ipt = document.querySelector('#test')

    ipt.checked  // false

    ipt.setAttribute('checked', 'checked')
    ipt.getAttribute('checked')  // null
    ipt.checked  // true

    ipt.checked = false
    ipt.getAttribute('checked') // checked
    ipt.checked  // false
</script>

對于button來說棍掐,下面的例子藏雏,HTML中只要出現(xiàn)了disabled 屬性,不管值是什么塌衰,對于 DOM property結(jié)果都是true诉稍, 而對于 attribute 獲取的則是把 HTML 里對應(yīng)屬性的值拿到轉(zhuǎn)換成字符串。

<button id="btn" disabled>點(diǎn)我</button>
<script>
var btn = document.querySelector('#btn');
console.log( btn.disabled );                  // true
console.log( btn.getAttribute('disabled') );  // ""
</script>
<button id="btn" disabled=false>點(diǎn)我</button>
<script>
var btn = document.querySelector('#btn');
console.log( btn.disabled );                  // true
console.log( btn.getAttribute('disabled') );  // "false"
</script>
  1. 對于一些和路徑相關(guān)的屬性最疆,兩者取得值也不盡相同杯巨,同樣是attribute取得是字面量,就是從 HTML 里獲取對應(yīng)屬性的值轉(zhuǎn)化成字符串努酸,而property取得是計(jì)算后的完整路徑服爷,獲取有意義的真實(shí)地址。
<a id="test2" href="#">test2</a>
<script>
    var a = document.getElementById('test2')
    console.log(a.getAttribute('href'))  // "#"
    console.log(a.href)  // "file:///C:/Users/.../demo.html#"
</script>
  1. 對于input 的 value获诈, 改變 property 不會同步到 atttribute 上仍源,改變 attribute也不會同步到 value上, attribute對應(yīng) HTML舔涎, property 對應(yīng) DOM笼踩。
<input id="test" type="text" sex="male" age="20" value="這是一個textInput">
<script>
    var ipt = document.querySelector('#test')
    ipt.value = "this is a textInput"
    console.log(ipt.value)   // "this is a textInput"
    console.log(ipt.getAttribute('value'))   // "這是一個textInput"

    ipt.setAttribute('value', 'It is textInput')
    console.log(ipt.value)   // "this is a textInput"
    console.log(ipt.getAttribute('value'))   // "It is textInput"
    console.log( document.body.innerHTML )   // <input id="test" type="text" sex="male" age="20" value="It is textInput">
</script>

如果你只是想獲取非自定義的屬性,比如 id亡嫌、name嚎于、src掘而、href 、checked... 用 property 的方式比較符合日常習(xí)慣于购,如果需要獲取自定義屬性那只能使用 getAttribute袍睡。

attr( )和prop( )區(qū)別

在一些特殊的情況下,attributes和properties的區(qū)別非常大肋僧。在jQuery1.6之前斑胜,.attr()方法在獲取一些attributes的時(shí)候使用了property值,這樣會導(dǎo)致一些不一致的行為嫌吠。在jQuery1.6中止潘,.prop()方法提供了一中明確的獲取property值得方式,這樣.attr()方法僅返回attributes居兆。

比如覆山,selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, 和defaultSelected應(yīng)該使用.prop()方法獲取/設(shè)置值。 在jQuery1.6之前這些不屬于attribute的property需要用.attr()方法獲取泥栖。這幾個并沒有相應(yīng)的attibute簇宽,只有property。

然而關(guān)于checked 屬性需要記住的最重要的一點(diǎn)是:它和checked property并不是一致的吧享。實(shí)際上這個attribute和defaultChecked property一致魏割,而且只應(yīng)該用來設(shè)置checkbox的初始值。checked attribute并不隨著checkedbox的狀態(tài)而改變钢颂,但是checked property卻跟著變钞它。因此瀏覽器兼容的判斷checkebox是否被選中應(yīng)該使用property

if ( elem.checked )
if ( $( elem ).prop( "checked" ) )
if ( $( elem ).is( ":checked" ) )

這對其它一些類似于selected、value這樣的動態(tài)attribute也適用殊鞭。

在IE9之前版本中遭垛,如果property沒有在DOM元素被移除之前刪除,使用.prop()方法設(shè)置DOM元素property(簡單類型除外:number操灿、string锯仪、boolean)的值會導(dǎo)致內(nèi)存泄露。為了安全的設(shè)置DOM對象的值趾盐,避免內(nèi)存泄露庶喜,可以使用.data()方法。

附上使用場景如下:


使用場景

參考:
若愚:button.disabled 和 button.getAttribute('disabled') 有什么區(qū)別救鲤?
謙行:jQuery的attr與prop

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末久窟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子本缠,更是在濱河造成了極大的恐慌斥扛,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹锹,死亡現(xiàn)場離奇詭異犹赖,居然都是意外死亡队他,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門峻村,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锡凝,你說我怎么就攤上這事粘昨》谋祝” “怎么了檀夹?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長截珍。 經(jīng)常有香客問我锚扎,道長吞瞪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任驾孔,我火速辦了婚禮芍秆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘翠勉。我一直安慰自己妖啥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布对碌。 她就那樣靜靜地躺著荆虱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朽们。 梳的紋絲不亂的頭發(fā)上怀读,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音骑脱,去河邊找鬼菜枷。 笑死,一個胖子當(dāng)著我的面吹牛惜姐,可吹牛的內(nèi)容都是我干的犁跪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼歹袁,長吁一口氣:“原來是場噩夢啊……” “哼坷衍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起条舔,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤枫耳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后孟抗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迁杨,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钻心,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铅协。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捷沸。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狐史,靈堂內(nèi)的尸體忽然破棺而出痒给,到底是詐尸還是另有隱情,我是刑警寧澤骏全,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布苍柏,位于F島的核電站,受9級特大地震影響姜贡,放射性物質(zhì)發(fā)生泄漏试吁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一楼咳、第九天 我趴在偏房一處隱蔽的房頂上張望熄捍。 院中可真熱鬧,春花似錦爬橡、人聲如沸治唤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宾添。三九已至,卻和暖如春柜裸,著一層夾襖步出監(jiān)牢的瞬間缕陕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工疙挺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扛邑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓铐然,卻偏偏與公主長得像蔬崩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子搀暑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354