2015-06-02 66 views
0

我最近發現了在Javascript中設置自定義DOM屬性的兩種方法之間的一個非常基本的區別。區別在於HTML5選擇器API如何與這些屬性進行交互(即,在document.querySelector()和朋友中)。爲什麼document.querySelector()會忽略直接指定的屬性?

<button id="b3">View</button> 

<script> 
document.getElementById('b3').shape = 'square'; 
console.log(document.querySelector('*[shape]')); // FAIL: returns null 

document.getElementById('b3').setAttribute('shape','square'); 
console.log(document.querySelector('*[shape]')); // WORKS: returns element 
</script> 

所以基本上,如果你申請屬性的元素,而無需使用.setAttribute()那麼以後您將無法通過選擇屬性名稱的元素。

順便說一句。此行爲是跨瀏覽器這讓我覺得這可能是由標準來解決一致的,但我不能看到它:

選擇器API標準不似乎在乎:

選擇器允許表示元素的屬性。當使用 選擇器作爲表達式來匹配元素時,如果 元素的屬性與 屬性選擇器所表示的屬性匹配,則必須將 屬性選擇器視爲匹配元素。

整個屬性匹配規則似乎歸結爲「如果元素具有屬性」,你會覺得someElement.someAttribute = something滿足「具有屬性」,但爲準則,不管是什麼原因它不。

我的問題基本上是爲什麼區別?在所有主流瀏覽器(IE11,FF38和Chrome 43)中,它實際上是標準的一部分還是僅僅是一個相同的實現問題?

+1

這可能是有趣的:https://stackoverflow.com/questions/19246714/html-attributes-vs-properties(以及它的重複) –

回答

2

的原因很簡單 - getElementById和所有那些類型的返回Element對象(見規格:http://www.w3schools.com/jsref/met_document_getelementbyid.asp

這意味着你的對象上設置屬性shape。然後你嘗試做一個查詢選擇器,但是你沒有修改被查詢的html。他們是不同的東西。

+0

你是說,除非在DTD中聲明元素[keyname]它是在默認情況下不作爲DOM屬性處理,或者只是一切都是Element引用的屬性(那麼什麼是'id')? – SpliFF

+0

快速回答是,.setAttribute()設置DOM屬性,而.shape =設置對象的shape屬性。 –

+0

快速回復似乎不完整。如果我做'element.id ='something''當然是設置一個屬性,而不是一個屬性? setAttribute()是否修改DTD或什麼? – SpliFF

相關問題