资讯专栏INFORMATION COLUMN

jQuery 的 attr 与 prop 的区别

kk_miles / 2749人阅读

摘要:先提出问题对于这类值是的属性,用的或方法进行读取或设置值是有区别的。因此,如果你想知道文本框的当前值,则读取。的值并不会随着的状态而作出相应改变,而会。为对象设置值的安全做法避免内存泄漏是使用。参考翻译地址的与的区别

先提出问题:对于 checked 这类值是 true/false 的属性,用 jQuery 的 attr 或 prop 方法进行 读取或设置值是有区别的。

在看 jQuery 文档前,我们先看看 attribute 与 property 是什么:

先搞懂 attribute 与 property

当编写 HTML 源码时,你能在 HTML 元素里定义 attributes。然后,一旦浏览器解析你的代码,该 HTML 元素相应的 DOM 节点就会被创建。该节点是一个对象,因此它就拥有 properties。
因此,我们知道:attributes 是 HTML 元素(标签)的属性,而 properties 是 DOM 对象的属性。

例如,下面这个 HTML 元素:


拥有两个 attributes。

一旦浏览器解析该代码,HTMLInputElement 对象就会被创建,并且该对象会拥有很多 peoperties,如:accept、accessKey、align、alt、attributes、autofocus、baseURI、checked、childElementCount、ChildNodes、children、classList、className、clientHeight 等等。

对于某个 DOM 节点对象,properties 是该对象的所有属性,而 attributes 是该对象对应元素(标签)的属性。

当一个 DOM 节点为某个 HTML 元素所创建时,其大多数 properties 与对应 attributes 拥有相同或相近的名字,但这并不是一对一的关系。例如,下面这个 HTML 元素:


其对应 DOM 节点会拥有如下properties: id、type 和 value:

id property是 id attribute 的映射:获取该 property 即等于读取其对应的 attribute 值,而设置该 property 即为 attribute 赋值。id 是一个纯粹的映射 property,它不会修改或限制其值。

type property 是 type attribute 的映射:获取该 property 即等于读取其对应的 attribute 值,而设置该 property 即为 attribute 赋值。但 type 并不是一个纯粹的映射 property,因为它的值被限制在已知值(即 input 的合法类型,如:text、password)。如果你有 ,然后 theInput.getAttribute("type") 会返回 "foo",而 theInput.type 会返回 "text"

相比之下,value property 并不会映射 value attribute。取而代之的是 input 的当前值。当用户手动更改输入框的值,value property 会反映该改变。所以,如果用户在 input 输入 John,然后:

theInput.value // 返回 "John"
然而:
theInput.getAttribute("value") // 返回 "Name:"

value property 反映了 input 的当前文本内容,而 value attribute 则是在 HTML 源码 value 属性所指定的初始文本内容。

因此,如果你想知道文本框的当前值,则读取 property。而如果你想知道文本框的初始值,则读取 attribute。或者你也可以利用 defaultValue property,它是 value attribute 的纯粹映射。

theInput.value                 // returns "John"
theInput.getAttribute("value") // returns "Name:"
theInput.defaultValue          // returns "Name:"

有几个 properties 是直接反映它们 attribute(rel、id),而有一些则用稍微不同的名字进行直接映射(htmlFor 映射 for attribute,className 映射 class attribute)。很多 property 所映射的 attribute 是带有限制/变动的(src、href、disabled、multiple)。该 规范 涵盖了各种各样的映射。

再看看 attr() 与 prop() 的区别

上述能让我们理清了 attribute 与 property 之间的区别,下面根据 jQuery 文档 对 attr() 与 prop() 方法进行比较:

自 jQuery 1.6 版本起,attr() 方法对于未设置的 attributes (即标签中没写该 attributes)都会返回 undefined。对于检索和改变 DOM 的 properties,如表单元素的 checked、selected 或 disabled 状态,应使用 .prop() 方法。

Attributes vs. Properties

attributes 与 properties 之间的差异在特定情况下会变得尤为重要。在 jQuery 1.6 前,.attr() 方法在检索一些 attributes 时,有时会把 property 考虑进去,这会导致不一致的行为。在 jQuery 1.6 版本之后,.prop() 方法提供了一种明确检索 property 值的方式,而 .attr 只会检索 attributes。

例如,selectedIndex、tagName、nodeName、nodeType、ownerDocument、defaultChecked 和 defaultSelected 能被 .prop() 检索与设置。在 jQuery 1.6 之前,这些 properties 都是通过 .attr() 检索的,但检索这些属性并不应属于 attr 方法职责内 。这些属性并没有对应的 attributes,只有 properties 本身。

对于值为布尔值的 attributes ,考虑到一个 DOM 元素是通过 HTML 标签 读取属性 返回值 描述 elem.checked true (Boolean) 会随着 checkbox 状态作出相应改变 $(elem).prop("checked") true (Boolean) 会随着 checkbox 状态作出相应改变 elem.getAttribute("checked") "checked" (String) checkbox 的初始状态;并且不会随着 checkbox 的状态而改变。 $(elem).attr("checked") (1.6) "checked" (String) checkbox 的初始状态;并且不会随着 checkbox 的状态而改变。 $(elem).attr("checked") (1.6.1+) "checked" (String) 会随着 checkbox 状态而作出相应改变(与jQuery文档描述不一样,我用jQuery 1.12.1 测试,都是返回 “checked”,并不会随着checkbox的改变而改变)。 $(elem).attr("checked") (1.6之前版本) true (Boolean) true (Boolean) 会随着 checkbox 状态作出相应改变。

根据 W3C forms(表单) 规范,checked 是一个值为 boolean 的 attribute,这意味着当该 attribute 存在(无论值是什么),其对应的 property 都是 true。例如,该 attribute 没赋值或设为空字符串,甚至设为 "false"。这同样适用于所有值为 boolean 的 attributes。

然而,对于 checked attribute 最重要的概念是记住它并不是对应 checked property。该 attribute 实际上是对应 defaultChecked property,并仅在初次设置 checkbox 值时使用。checked attribute 的值并不会随着 checkbox 的状态而作出相应改变,而 checked property 会。因此,为了兼容不同浏览器,当判断一个 checkbox 是否被选择时应该使用 property

if (elem.checked)
if ($(elem).prop("checked"))
if ($(elem).is(":checked"))

这同样适用于其它动态 attributes,如 selected 和 value。

其他说明:
在 IE9 之前的版本,如果使用 .prop() 为 DOM 元素的 property 设置的值不是一个简单的原始值(number、string 或 boolean),且该 property 在 DOM 元素从 document 移除前未被移除(使用 .removeProp()),则会导致内存泄漏。为 DOM 对象设置值的安全做法(避免内存泄漏)是使用 .data()

参考(翻译):
jQuery API Documentation:http://api.jquery.com/prop/
Properties and Attributrs in HTML:http://stackoverflow.com/questions/6003819/properties-and-attributes-in-html

Github 地址: jQuery 的 attr 与 prop 的区别

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78826.html

相关文章

  • jQueryattr()和prop()区别

    摘要:需求很简单的,一个非常简单的复选框的使用。与的区别复选框设置设置自定义自定义设置类型设置类型支持类型在这里温馨提示提示一下,当我们设置这个属性时,再用获取的时候,控制提示。 问题引入 昨天接到了一个活,里面有一个小需求,在写的过程中遇到了一个小问题。虽然这个问题并不是很复杂的东西,但却是一个比较细节的问题。相信不少新手前端会遇到。下面我先描述一下我这个遇到的这个需求。 showImg(...

    mo0n1andin 评论0 收藏0
  • jQueryattr()和prop()方法一些区别理解

    摘要:后来了一番不知怎么搜索的又发现了一个和区别的一些解释。操作对象不同在中表示文档节点属性,而则表示对象属性。函数主要依赖的是对象的和两个方法。 昨天在开发的时候同事帮忙写了一小段JS代码,取数据的时候用到了以前都没用过的$(this).data(xxx)的这种形式,后来看了手册才知道在HTML5中可以对元素进行自定义属性。格式类似于data-xxx=value,然后可以用JQ中的....

    iKcamp 评论0 收藏0
  • jqueryattrprop区别

    摘要:今天研究前端的给固有属性加值是出现错误,搜索了下,找到了原因,就是中和的区别。下面和大家分享下在高版本的引入方法后,什么时候该用什么时候用它们两个之间有什么区别这些问题就出现了。关于它们两个的区别,网上的答案很多。 今天研究前端jquery的attr给固有属性加值是出现错误,搜索了下,找到了原因,就是:jquery中attr和prop的区别。下面和大家分享下: 在高版本的jquery引...

    ad6623 评论0 收藏0
  • jqueryattr()和prop()区别

    摘要:在中新加了一个方法,查看文档可以看到一句话获取在匹配的元素集中的第一个元素的属性值。这种情况适用于多选项全选和反选的情况。 在jquery1.6中新加了一个方法prop(),查看jquery文档可以看到一句话:获取在匹配的元素集中的第一个元素的属性值。 大家都知道有的浏览器只要写disabled,checked就可以了,而有的要写成disabled = disabled,checked...

    刘德刚 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<