爲了在翻譯上顯示出區別,Attribute通常被翻譯爲特性,Property被譯爲屬性。
在使用上面,Angular已經代表態度javascript
Template binding works with properties and events, not attributes.
模板綁定是經過 property 和事件來工做的,而不是 attribute。
jQuery中的prop()
和attr()
如何選擇,衆說紛紜... php
兩種主流觀點:html
setAttribute()
,理由是property會出現class映射過去爲className,名稱不統一的問題。引用Angular文檔中的一段話去歸納二者的關係和區別:java
HTML attribute 與 DOM property 的對比
attribute 是由 HTML 定義的。property 是由 DOM (Document Object Model) 定義的。
少許 HTML attribute 和 property 之間有着 1:1 的映射,如id。
有些 HTML attribute 沒有對應的 property,如colspan。
有些 DOM property 沒有對應的 attribute,如textContent。
廣泛原則:chrome
幾個有表明性的映射表瀏覽器
HTML attribute | DOM property |
---|---|
id | id |
class | className |
checked = 'checked' | checked 值爲true |
爲何說是廣泛原則呢?在低版本的ie中,操做DOM property中的value,attribute中的value也發生了改變。徹底不講道理 - -post
<input type="text" value="123" id="myInput">
更改HTML attributespa
myInput.setAttribute('value', 'test Attr');
瀏覽器 | myInput.getAttribute('value') | myInput.value |
---|---|---|
chrome ie11 ff | test Attr | test Attr |
ie8 | test Attr | test Attr |
更改DOM property翻譯
document.getElementById('myInput').value = 'test property';
瀏覽器 | myInput.getAttribute('value') | myInput.value |
---|---|---|
chrome ie11 ff | 123 | test property |
ie8 | test property (廣泛原則下應該爲123) | test property |
prop()
和attr()
的選擇prop()
採用的是更改DOM property的方式,基本上對應更改DOM屬性。原生DOM | jQuery | 操做 |
---|---|---|
element.value | $element.prop( name[,value]) | 讀寫 |
delete element.propertyName | $element.removeProp( propertyName ) | 刪除 |
attr()
採用的是更改HTML attribute的方式,基本上對應DOM中提供的三個操做attribute的方法。原生DOM | jQuery | 操做 |
---|---|---|
element.getAttribute(name) | $element.attr(name) | 讀 |
element.setAttribute(name,value) | $element.attr(name ,value) | 寫 |
delete element.removeAttribute(name) | $element.removeAttr( name ) | 刪除 |
attr()
(data-*
等除外)。<form action="test.php" user-my-name="nilinli" method="post"></form>
$('form').attr('user-my-name'); // nilinli $('form').attr('action'); // test.php
prop()