我认为蒂姆说得很好,但让我们后退一步:
DOM元素是一个对象,一个内存中的东西。与OOP中的大多数对象一样,它具有财产。另外,它还有一个在元素上定义的属性映射(通常来自浏览器为创建元素而读取的标记)。一些元素的财产从具有相同或相似名称的属性中获取初始值(value从“value”属性中获取其初始值;href从“href”属性中获得其初始值,但它不是完全相同的value;className从“class”属性中)。其他财产以其他方式获取其初始值:例如,parentNode属性根据其父元素的内容获取其值;元素始终具有style属性,无论它是否具有“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"
(这些值与大多数浏览器相同;存在一些差异。)
链接对象是一个真实的对象,您可以看到访问它上的属性和访问属性之间存在真正的区别。
正如蒂姆所说,大多数时候,我们都想与财产合作。这部分是因为它们的值(甚至它们的名称)在浏览器之间趋于一致。我们通常只希望在没有与属性相关的属性(自定义属性)时使用属性,或者当我们知道特定属性的属性和属性不是1:1时(如上面的href和“href”)。
各种DOM规范中列出了标准财产:
DOM2 HTML(大部分已过时,请参见HTML规范)DOM2核心(过时)DOM3核心(过时)域4
这些规范有很好的索引,我建议将链接放在手边;我一直在用。
例如,自定义属性将包括任何数据xyz属性,您可以将这些属性放在元素上,以向代码提供元数据(现在,这在HTML5中是有效的,只要您坚持数据前缀)。(jQuery的最新版本允许您通过数据函数访问数据xyz元素,但该函数不仅仅是数据xyz属性的访问器[它做的更多也更少];除非您实际需要它的功能,否则我会使用attr函数与数据xyz特性交互。)
attr函数过去有一些复杂的逻辑来获得他们认为你想要的东西,而不是从字面上获得属性。它将这些概念混为一谈。移动到prop和attr是为了将它们分开。简而言之,在v1.6.0中,jQuery在这方面做得太过火了,但功能很快被添加回attr,以处理人们在技术上应该使用prop时使用attr的常见情况。