我认为蒂姆说得不错,但让我们退后一步:
DOM元素是一个对象,是内存中的事物。像OOP中的大多数对象一样,它具有属性。它还单独具有在元素上定义的属性的映射(通常来自浏览器读取以创建元素的标记)。元素的一些属性从具有相同或相似名称的属性中获取其初始值( 从“value”属性获取其初始值; 从“href”属性获取其初始值,但它的值并不完全相同; 从“类”属性)。其他属性以其他方式获取其初始值:例如,该属性根据其父元素的内容获取其值;元素始终具有属性,无论它是否具有“style”属性。value
href
className
parentNode
style
让我们在以下页面中考虑这个锚点:http://example.com/testing.html
<a href='foo.html' class='test one' name='fooAnchor' id='fooAnchor'>Hi</a>
一些免费的ASCII艺术(并省略了很多东西):
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| HTMLAnchorElement |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
| href: "http://example.com/foo.html" |
| name: "fooAnchor" |
| id: "fooAnchor" |
| className: "test one" |
| attributes: |
| href: "foo.html" |
| name: "fooAnchor" |
| id: "fooAnchor" |
| class: "test one" |
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+
请注意,属性和特性是不同的。
现在,尽管它们是不同的,但由于所有这些都是不断发展的,而不是从头开始设计的,因此,如果您设置了它们,许多属性会写回它们派生的属性。但并非所有人都这样做,正如您从上面所看到的,映射并不总是直接的“传递值”,有时涉及解释。href
当我谈论属性是对象的属性时,我不是在抽象地谈论。以下是一些非 jQuery 代码:
var link = document.getElementById('fooAnchor');
alert(link.href); // alerts "http://example.com/foo.html"
alert(link.getAttribute("href")); // alerts "foo.html"
(这些值与大多数浏览器一样;有一些变化。
该对象是真实的对象,您可以看到访问其上的属性和访问属性之间存在真正的区别。link
正如Tim所说,绝大多数时候,我们都希望与物业合作。部分原因是它们的值(甚至是它们的名称)在浏览器之间往往更加一致。我们通常只想在没有与它相关的属性(自定义属性)时使用属性,或者当我们知道对于该特定属性,属性和属性不是1:1(如上面的“href”)时。href
标准属性在各种 DOM 规范中列出:
这些规范具有出色的索引,我建议将指向它们的链接放在手边;我一直在使用它们。
例如,自定义属性将包括您可能放在元素上以向代码提供元数据的任何属性(现在,只要您坚持使用前缀,该属性自HTML5起就有效)。(最新版本的jQuery允许您通过该函数访问元素,但该函数不仅仅是属性的访问器[它的作用更多,也不小于此];除非您确实需要其功能,否则我会使用该函数与属性进行交互。data-xyz
data-
data-xyz
data
data-xyz
attr
data-xyz
该函数曾经有一些复杂的逻辑,围绕着获取他们认为你想要的东西,而不是从字面上获取属性。它把这些概念混为一谈。移动到并意味着将它们去混淆。简而言之,在v1.6.0中,jQuery在这方面走得太远了,但是功能很快就被添加回去,以处理人们在技术上应该使用时使用的常见情况。attr
prop
attr
attr
attr
prop