attribute與property
attribute和property都可以翻譯為屬性,為了以示區別,通常把這兩個字翻譯為屬性與特性。
上面這段HTML語句中有三個節點,分別是Element “div”、attribute “id”、Text “click here”,我們最常見的attribute正式指的attribute類型節點,在JavaScript有專門處理attribute的函數.getAttribute(name) / setAttribute(name,value)。當然attribute不只是我們能夠在HTML文件上看到的這幾個,我們可以自訂attributed加到DOM節點中
property是DOM物件的字段,跟我們平常使用的一些物件一樣,包含很多字段,這些字段就是property,取值或者設定值和普通字段一樣通過」物件.字段「的方式。
看起來attribute和property應該沒什麼關係才對,怎麼會。 。 。 attribute和property容易混倄是因為很多attribute節點還有一個相對應的property屬性,比如上面div的”id“ attribute 同樣可以用t.id取到(實際上絕大部分人都是這樣獲取的),透過property更改id後,用getAttibute取得的id是更新後的id。
1. 於build-in屬性,attribute和property共享數據,attribute更改了會對property造成影響,反之亦然,但是兩者的自定義屬性是獨立的數據,即使name一樣,也互不影響,看起來是下面這張圖,但是IE6、7沒有區分,依然共享自訂屬性資料
2. 並不是所有的attribute與對應的property名字都一致,例如剛才使用的attribute 的class屬性,使用property操作的時候應該是這樣className
4. 对于一些和路径相关的属性,两者取得值也不尽相同,但是同样attribute取得是字面量,property取得是计算后的完整路径
attr和prop
相信看完上面内容,大家就明白为什么jQuery要添加prop方法了,在jQuery API中也有专门解释
Attributes VS. Properties
在一些特殊的情况下,attributes和properties的区别非常大。在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行为。在jQuery1.6中,.prop()方法提供了一中明确的获取property值得方式,这样.attr()方法仅返回attributes。
比如,selectedIndex, tagName, nodeName, nodeType, ownerDocument, defaultChecked, 和defaultSelected应该使用.prop()方法获取/设置值。 在jQuery1.6之前这些不属于attribute的property需要用.attr()方法获取。这几个并没有相应的attibute,只有property。
关于布尔类型 attributes,比如一个这样的HTML标签,它在JavaScript中变量名为elem
elem.checked |
true (Boolean) Will change with checkbox state |
$( elem ).prop( "checked" ) |
true (Boolean) Will change with checkbox state |
elem.getAttribute( "checked" ) |
"checked" (String) Initial state of the checkbox; does not change |
$( elem ).attr( "checked" ) (1.6)
|
"checked" (String) Initial state of the checkbox; does not change |
$( elem ).attr( "checked" ) (1.6.1+)
|
"checked" (String) Will change with checkbox state |
$( elem ).attr( "checked" ) (pre-1.6)
|
true (Boolean) Changed with checkbox state |