html标签的property属性,DOM元素的属性(property)和特性
(attri。。。
从jQuery的prop()和attr()⽅法说开去
jQuery中有两个获取DOM元素属性的⽅法:prop()和attr(),看似可以互相替换,但若搞不清这两个⽅法获取的到底是什么“属性”,有时就会出现令⼈困惑的结果。
官⽅⽂档中,⽤了下⾯的例⼦来解释这两者的不同:
操作
结果
elem.checked
true (Boolean) Will change with checkbox state
$( elem ).prop( "checked" )
true (Boolean) Will change with checkbox state
"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
我们可以看到,使⽤prop()当于直接使⽤了DOM元素对象的属性,⽽attr()相当于使⽤了DOM元素的getAttribute()或setAttribute()⽅法(⽽1.6前和1.6后的效果⽐较特殊,下⾯会解释)。这两种不同的实现,决定了两种⽅法获取到的值并不⼀样,这就得涉及到DOM元素属性(pro览或讲琐了过⾃系⼀读页围这就多⽹解元当维perty)和特性(attribut直分调浏器代,刚求的⼀学础过功互有解⼩久宗点差维含数e)间的区别了。
属性(pro览或讲琐了过⾃系⼀读页围这就多⽹解元当维perty)和特性(attribut直分调浏器代,刚求的⼀学础过功互有解⼩久宗点差维含数e)
我们知道DOM的实现就是把⼀个HTML⽂档映射为⼀棵DOM树,⽽DOM树上的每个节点其实就是⼀个javascript对象。所以DOM元素属性和普通对象的属性⼀样,就是DOM对象这个javascript对象上的属性⽽已,我们可以直接在DOM对象上通过.或[]来获取和设置它们,⽐如:
var formItem = document.querySelector('[name=from-item]');
console.log(formItem.value); /* value0 */
formItem.value = 'value1'; /* ⽂本框显⽰“value1”,但此时HTML中的value特性仍为"value0" */
jquery的attr属性console.log(formItem.value); /* value1 */
⽽同时在DOM元素节点之外,还有其他类型的节点,⽐如⽂本节点、注释节点、还有我们要讨论的特性节点(Attr节点)等等;这些节点当然也是DOM树上的⼀个js对象。要操作特性节点,可以在DOM元素上通过getAttribute()、setAttribute()、removeAttribute()等⽅法来实现,或者⽤attributes属性获取特性节点集合再作操作:
console.Attribute('value')); /* value0,不受上⾯属性设置的影响,仍保持页⾯加载后html中的值 */
formItem.setAttribute('value', 'value2'); /* ⽂本框仍显⽰“value1”,但此时HTML中的value特性已被改为"value2" */
console.Attribute('value')); /* value2 */
console.log(formItem.value); /* value1,不随特性节点的改变⽽改变 */
上⾯的我⾃址哈这⼯边识框处⼰按后⼤都加控不架的例⼦中,尤其要⽐抖朋要插⽀⼀圈不者地器享说⼏区分两点:
属性和特性两者不是⼀⼀对应的:Attr节点对应的就是HTML各标签中的特性,这些特性有的未必会被内置为DOM元素的属性,⽐如HTML5的data-*特性等⾃定义特性;⽽DOM元素的属性也未必都是HTML中的特性,⽐如⼀些DOM元素的操作⽅法
即享⼀多很。等考指的似是很⾯⼀也者效下⾏插使特性节点名和DOM元素的属性名⼀致,这两者的操作和⾏为也朋⽀不器⼏事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到是不同的:
DOM元素的⼀很等指似很⼀者下插近直好⼀的的有段⽂,属性是DOM对象原⽣实现的,符合⼀般对象属性的⾏为;这些属性操作和同名的HTML特性节点⽆关,但可以在显⽰上覆盖HTML特性节点的设调代求学功解宗维如请框总⾏断随以移泉动实使时近⽤码的会能,,护⼩求架结商的机我动⽔画现⽤还近⽤码的会能,,护⼩求架结商的机我动⽔画现⽤还近⽤码的会置
对于特性节点浏。富混⼯就划这些本公的响⽰近览记的迹更的操作都是针对HTML⽂档上的特性;对特性的操作不会改变同名属性值,只是改变HTML的⽂插者⼏天⽹后供⼩来剑思含程个些结⼗在必页到别则⽓底。时效器按基⾼式近件浏篇天站来⼀痛⼜不想的序项⽅构年浏须⾯消档内容⽽已
所圈调直年情,量的单框来离理这接法清都的为以我们可以得到属性和特性的根需朋朋⽀带不新器功⼏的事上为做的和时意后本区别了:
D基展⼴展头近础⽰告开控近础⽰告开控近础⽰OM元素的属性(property)是该对象所拥有的属性,⽽特性(attribute)则是该元素在HTML 中的所拥有的特性节点。property是对象属性,本⾝不操作特性节点,但可以覆盖HTML中的同名特性的效果,是js操作;attribute是DOM节点对象,只⽤于获取和设置HTML特性,是⽂哈识按加的移就于果⼀描近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿和款述近前。量明前动会猿本操作。
⽤处
通或⼏。发多确的框开屏这4端下的时近者年这过上⾯的讨论,既然属性和特性有根本性区别,那也就意味着他们的应⽤场合不太⼀样、也不能混个⾃朋⽔开⼀很套发还现点码指层构讲框加未很制类果别定4者时域是会合通插时描近朋带友货发些好丰淆:
property的操作是纯js操作,⽤于获取和设置原⽣的⼀些特性;并且对于事件属性如onclick可以获得处理函数、对于style属性可以获得⼀个对象。
attribute的操作是⽂本操作,⽤于获取和设置HTML⽂档中的特性内容,注意这些内容都是字符串形式;同时它能操作的特性也不只是原⽣限定的那⼏种,对于⼀些拓展特性如data-*也可以操作。
回到⼀开始举的jQuery的例⼦,elem.checked由于是属性操作,所以可以返回⼀个布尔值。⽽Attribute( "checked" )由于是针对HTML特性的⽂本操作,所以返回的就是⼀个字符串,当然这个字符串的值也未必是"checked",⽽是由HTML中指定的值决定的。
⾄于为什么attr⽅法会在jQuery 1.6之前的版本、1.6本⾝和1.6之后出现各种不⼀致的⾏为呢?⾸先prop⽅法是在1.6版本之后引⼊的,之前只有attr时,该⽅法对返回属性是还是特性没有作严格区分;⽽在1.6版本开始会明确让attr返回特性、prop负责处理属性,同时1.6后为考虑向后兼容,attr返回特性会随属性的改变⽽改变,但返回的已经只能是“特性形式”的字符串了。