当前位置: 首页 > Web前端 > HTML

DOM元素属性(property)和特性(attribute)

时间:2023-04-02 16:58:04 HTML

从jQuery的prop()和attr()方法来看,jQuery中获取DOM元素属性的方法有两种:prop()和attr(),看样子是他们可以互相替换,但是如果你不知道这两个方法得到的“属性”是什么,有时会出现混淆的结果。在官方文档中,用下面的例子来说明两者的区别:prop("checked")true(Boolean)会随着复选框的变化而改变stateelem.getAttribute("checked")"checked"(String)复选框的初始状态;不改变$(elem).attr("checked")(1.6)"checked"(String)复选框的初始状态;不改变$(elem).attr("checked")(1.6.1+)"checked"(String)将随着复选框状态改变$(elem).attr("checked")(pre-1.6)true(Boolean)Changedwithcheckboxstate我们可以看到使用prop()相当于直接使用DOM元素对象的属性,attr()相当于使用getAttribute()或setAttribute()方法(1.6前后效果是特殊的,将在下面解释)。这两种不同的实现方式决定了这两种方法获取的值是不同的,这就涉及到DOM元素属性(properties)和属性(attributes)的区别。属性(property)和特性(attribute)我们知道DOM的实现是将一个HTML文档映射成一棵DOM树,而DOM树上的每个节点其实就是一个javascript对象。因此,DOM元素的属性与普通对象的属性是一样的。它们只是DOM对象(javascript对象)的属性。我们可以直接通过获取和设置它们。或DOM对象上的[],例如:

varformItem=document.querySelector('[name=from-item]');console.log(formItem.value);/*value0*/formItem.value='value1';/*文本框显示“value1”,但此时HTML中的value属性仍然是“value0”*/console.log(formItem.value);/*value1*/同时除了DOM元素节点之外,还有其他类型的节点,比如文本节点,注释节点,还有我们要讨论的特征节点(Attr节点)等;这些节点当然也是DOM树上的一个js对象。操作属性节点,可以在DOM元素上实现getAttribute()、setAttribute()、removeAttribute()等方法,或者使用attributes属性获取一组属性节点,然后操作:console.log(formItem.getAttribute('价值'));/*value0,不受上面属性设置的影响,页面加载后仍然保持html中的值*/formItem.setAttribute('value','value2');/*文本框仍然显示“value1”,但是此时HTML中的value属性已经变成了“value2”*/console.log(formItem.getAttribute('value'));/*value2*/console.log(formItem.value);/*value1,notwiththeattribute*/在上面的例子中,要区分两点:attributes和characteristics不是一一对应的:Attr节点对应于每个HTML标签中的characteristic,其中一些characteristics可能不作为DOM元素的Attributes内置,例如HTML5data-*属性和其他自定义属性;而DOM元素的属性不一定都是HTML中的属性,比如一些DOM元素的操作方法,即使属性节点名与DOM元素的属性名一致,这两者的操作和行为是同样不同的是:DOM元素的属性是由DOM对象原生实现的,符合一般对象属性的行为;这些属性操作与同名的HTML属性节点无关,但可以覆盖显示的HTML属性节点的设置。对属性节点的操作都是针对HTML文档上的属性;对属性的操作不会改变同名属性的值,只会改变HTML文档的内容,所以我们可以得到属性与属性的根本区别:DOM元素的属性(property)是对象拥有的属性,属性(attribute)是HTML中元素拥有的属性节点。property是对象属性,本身不操作特征节点,但是可以覆盖HTML中同名特征的效果,是js操作;attribute是DOM节点对象,仅用于获取和设置HTML特性,是文本操作。使用通过上面的讨论,既然properties和characteristics有着根本的区别,那么说明它们的应用场景是不一样的,不能混为一谈:property的操作是一个纯js操作,用来获取和设置一些本地特征;并且对于onclick等事件属性,可以得到一个处理函数,对于style属性,可以得到一个对象。属性操作是文本操作,用于获取和设置HTML文档中的属性内容。注意,这些内容都是字符串的形式;同时,它可以操作的属性也不仅仅局限于原本的属性。对于一些扩展属性如data-*也可以进行操作。回到开头给出的jQuery例子,elem.checked可以返回一个布尔值,因为它是一个属性操作。但是,elem.getAttribute("checked")是针对HTML特性的文本操作,因此它返回一个字符串。当然,这个字符串的值可能不是“checked”的,而是由HTML中指定的值决定的。至于为什么attr方法在jQuery1.6之前、1.6本身和1.6之后的版本中会出现各种不一致的行为?首先,prop方法是在1.6版本之后引入的。之前只有attr的时候,这个方法没有严格区分返回的属性是不是feature;但是从1.6版本开始,会明确attr返回的是feature,prop负责处理attribute。同时,1.6之后,考虑到向后兼容,attr的返回特性会随着属性的变化而变化,但返回的字符串只能是“特性形式”。