ChatGPT解决这个技术问题 Extra ChatGPT

HTML中的属性和属性有什么区别?

在 jQuery 1.6.1 中进行更改之后,我一直在尝试定义 HTML 中的属性和属性之间的区别。

查看 jQuery 1.6.1 release notes 上的列表(靠近底部),似乎可以将 HTML 属性和属性分类如下:

属性:所有具有布尔值或 UA 计算的值,例如 selectedIndex。

属性:可以添加到既不是布尔值也不包含 UA 生成值的 HTML 元素的“属性”。

想法?

.prop() vs .attr() 的可能重复项

u
user664833

在编写 HTML 源代码时,您可以在 HTML 元素上定义属性。然后,一旦浏览器解析了你的代码,就会创建一个对应的 DOM 节点。该节点是一个对象,因此它具有属性。

例如,这个 HTML 元素:

<input type="text" value="Name:">

有 2 个属性(typevalue)。

浏览器解析此代码后,将创建一个 HTMLInputElement 对象,该对象将包含数十个属性,例如:accept、accessKey、align、alt、attributes、autofocus、baseURI、checked、childElementCount、childNodes、children、classList、类名、客户端高度等。

对于给定的 DOM 节点对象,属性是该对象的属性,属性是该对象的 attributes 属性的元素。

当为给定的 HTML 元素创建 DOM 节点时,它的许多属性都与具有相同或相似名称的属性相关,但它不是一对一的关系。例如,对于这个 HTML 元素:

<input id="the-input" type="text" value="Name:">

相应的 DOM 节点将具有 idtypevalue 属性(以及其他属性):

id 属性是 id 属性的反射属性:获取属性读取属性值,设置属性写入属性值。 id 是一个纯粹的反射属性,它不会修改或限制值。

type 属性是 type 属性的反射属性:获取属性读取属性值,设置属性写入属性值。 type 不是纯粹的反射属性,因为它仅限于已知值(例如,输入的有效类型)。如果你有 ,那么 theInput.getAttribute("type") 给你 "foo" 但 theInput.type 给你 "text"。

相反, value 属性不反映 value 属性。相反,它是输入的当前值。当用户手动更改输入框的值时,value 属性会反映这种变化。因此,如果用户在输入框中输入“John”,那么: theInput.value // 返回“John” 而: theInput.getAttribute('value') // 返回“Name:” value 属性反映了当前的文本内容在输入框内,而 value 属性包含 HTML 源代码中 value 属性的初始文本内容。因此,如果您想知道文本框中当前的内容,请阅读该属性。但是,如果您想知道文本框的初始值是什么,请阅读属性。或者你可以使用 defaultValue 属性,它是 value 属性的纯粹反映: theInput.value // 返回 "John" theInput.getAttribute('value') // 返回 "Name:" theInput.defaultValue // 返回 "Name :"

有几个属性直接反映了它们的属性(relid),有些是名称略有不同的直接反映(htmlFor 反映了 for 属性,className 反映了 class 属性),许多反映其属性但有限制/修改(srchrefdisabledmultiple)等。 The spec 涵盖了各种反射。


嘿 Sime,我猜这很模棱两可,尤其是如果您在这里查看:w3.org/TR/html4/index/attributes.html,并且没有明确的答案。一个基本上需要遵循 jQuery 博客摘要中所述的内容,即便如此,如果您在需要使用 attr 时错误地使用 prop
@oss 您的链接是指 HTML 属性列表。该列表并不模棱两可 - 这些是属性。
有没有关于这种关系的文件? @ŠimeVidas
我在哪里可以找到属性的完整属性列表(如 for -> htmlFor)以及类似地从属性中获取初始值但不反映它的属性列表(input.value)。我希望这会在像 github.com/Matt-Esch/virtual-dom 这样的库的源代码中的某个地方,但它并没有真正记录在案。
@Pim 我自己没有读过,但是这个由 4 部分组成的系列文章似乎是一个很好的资源:twitter.com/addyosmani/status/1082177515618295808
G
Gourav Pokharkar

看了Sime Vidas的回答后,又搜索了一番,在angular docs里找到了一个非常直截了当、通俗易懂的解释。

HTML 属性与 DOM 属性 -------------------

属性由 HTML 定义。属性由 DOM(文档对象模型)定义。一些 HTML 属性与属性具有 1:1 的映射关系。 id 就是一个例子。一些 HTML 属性没有相应的属性。 colspan 就是一个例子。一些 DOM 属性没有对应的属性。 textContent 就是一个例子。许多 HTML 属性似乎映射到属性……但不是您想象的那样!最后一类是令人困惑的,除非你掌握了这个一般规则:属性初始化 DOM 属性,然后它们就完成了。属性值可以改变;属性值不能。例如,当浏览器渲染 时,它会创建一个对应的 DOM 节点,其 value 属性初始化为“Bob”。当用户在输入框中输入“Sally”时,DOM 元素值属性变为“Sally”。但是当您向输入元素询问该属性时,HTML value 属性保持不变:input.getAttribute('value') 返回“Bob”。 HTML 属性值指定初始值; DOM value 属性是当前值。

disabled 属性是另一个特殊的例子。默认情况下,按钮的 disabled 属性为 false,因此该按钮处于启用状态。当您添加 disabled 属性时,它的存在单独将按钮的 disabled 属性初始化为 true,因此按钮被禁用。添加和删除 disabled 属性会禁用和启用按钮。属性的值无关紧要,这就是为什么您不能通过编写 来启用按钮的原因。设置按钮的 disabled 属性可禁用或启用按钮。财产的价值很重要。 HTML 属性和 DOM 属性不是一回事,即使它们具有相同的名称。


此示例不正确:colspan 属性具有 colSpan 属性。 ... 那么,现在哪个属性没有相关属性?
s
sibidiba

答案已经解释了如何以不同方式处理属性和属性,但我真的想指出这是多么疯狂。即使它在某种程度上是规范。

太疯狂了,让某些属性(例如 id、class、foo、bar)在 DOM 中只保留一种值,而某些属性(例如,checked、selected)保留两种值;即“加载时”的值和“动态状态”的值。 (难道 DOM 不应该完全代表文档的状态吗?)

绝对必要的是,两个输入字段(例如文本和复选框)的行为方式完全相同。如果文本输入字段不保留单独的“加载时”值和“当前,动态”值,为什么要勾选复选框?如果复选框的选中属性确实有两个值,为什么它的 class 和 id 属性没有两个值?如果您希望更改文本 *input* 字段的值,并且您希望 DOM(即“序列化表示”)发生变化并反映这种变化,那么您到底为什么不希望从输入字段在选中的属性上键入复选框?

“它是一个布尔属性”的区分对我来说没有任何意义,或者至少不是一个充分的理由。


这不是答案,但我同意你的看法;这太疯狂了。
这并不疯狂。你误会了。 checked 属性由 defaultChecked 属性表示(同样对于文本输入,value 属性由 defaultValue 属性表示)。需要第二个属性 checked 来表示复选框是否被选中,因为这是复选框功能的固有部分:它是交互式的并且可以更改(如果存在表单重置按钮,则重置为默认值)由用户以其他属性(例如 id)没有的方式。这与它是一个布尔属性无关。
@TimDown——谢谢。这真的让我克服了WTF?驼峰。
@TimDown我仍然觉得它是“疯狂的”,因为任何逻辑方法都会使属性名称和属性名称匹配,或者至少没有不相关的属性名称和属性名称匹配(即选中的属性是指 defaultChecked属性,而选中的属性无关)。事实上,每个人一开始都假设的逻辑方法是根本不分离属性和属性。属性不应是不可变的,而应始终反映属性值。两者之间应该没有区别。
如果您了解为什么以这种方式伪造它,那并不是疯了。之所以这样,是因为 forms 有一个 reset 方法,并且该 reset 方法需要从 HTML 属性中读取原始数据。
W
Willem van der Veen

不同的 HTML 属性和属性:

在评估 HTML 中的区别之前,让我们先看看这些词的定义:

英文定义:

属性是指对象的附加信息。

属性描述对象的特征。

在 HTML 上下文中:

当浏览器解析 HTML 时,它会创建一个树形数据结构,它基本上是 HTML 的内存表示。它的树数据结构包含 HTML 元素和文本的节点。与此相关的属性和属性是以下方式:

属性是我们可以放入 HTML 以初始化某些 DOM 属性的附加信息。

属性是在浏览器解析 HTML 并生成 DOM 时形成的。 DOM 中的每个元素都有自己的一组属性,这些属性都是由浏览器设置的。其中一些属性的初始值可以由 HTML 属性设置。每当 DOM 属性发生影响渲染页面的变化时,页面将立即重新渲染

同样重要的是要认识到这些属性的映射不是一对一的。换句话说,并不是我们在 HTML 元素上赋予的每个属性都具有类似的命名 DOM 属性。

此外,不同的 DOM 元素具有不同的属性。例如,<input> 元素具有 <div> 属性中不存在的 value 属性。

例子:

让我们看下面的 HTML 文档:

 <!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">  <!-- charset is a attribute -->
  <meta name="viewport" content="width=device-width"> <!-- name and content are attributes -->
  <title>JS Bin</title>
</head>
<body>
<div id="foo" class="bar foobar">hi</div> <!-- id and class are attributes -->
</body>
</html>

然后我们在 JS 控制台中检查 <div>

 console.dir(document.getElementById('foo'));

我们看到以下 DOM 属性(chrome devtools,未显示所有属性):

https://i.stack.imgur.com/0b6Hf.png

我们可以看到 HTML 中的属性 id 现在也是 DOM 中的 id 属性。 id 已由 HTML 初始化(尽管我们可以使用 javascript 更改它)。

我们可以看到 HTML 中的 class 属性没有对应的 class 属性(class 是 JS 中的保留关键字)。但实际上有 2 个属性,classList 和 className。


C
Community

嗯,这些是由 w3c 指定的,什么是属性,什么是属性 http://www.w3.org/TR/SVGTiny12/attributeTable.html

但目前 attr 和 prop 并没有太大的不同,几乎相同

但他们更喜欢一些东西的道具

首选用法总结 .prop() 方法应该用于布尔属性/属性以及 html 中不存在的属性(例如 window.location)。所有其他属性(您可以在 html 中看到的属性)可以并且应该继续使用 .attr() 方法进行操作。

好吧,实际上,如果您使用 attr 或 prop 或两者都使用,则不必更改某些内容,两者都可以,但是我在自己的应用程序中看到 prop 在 atrr 没有的地方起作用,因此我采用了我的 1.6 应用程序 prop =)


嘿丹尼尔,我确实读过。似乎有明确的定义将两者分开,因为 Sime 下面提到的一些内容也可以添加到 HTML 元素中,例如 alt.将继续阅读一些 HTML 规范,看看在实践中是否确实有一种方法可以清楚地区分两者。
该文档与 SVG 而不是 HTML 有关。
m
mkamal

更新我的回答这是来自 https://angular.io/guide/binding-syntax 的引用

HTML 属性和 DOM 属性

属性初始化 DOM 属性,您可以配置它们来修改元素的行为,但属性是 DOM 节点的功能。

一些 HTML 属性与属性具有 1:1 的映射关系;例如,身份证。

一些 HTML 属性没有对应的属性;例如,咏叹调-*。

一些 DOM 属性没有对应的属性;例如,文本内容。

请记住,HTML 属性和 DOM 属性是不同的东西,即使它们具有相同的名称。

示例 1:当浏览器呈现时,它会创建一个具有 value 属性的对应 DOM 节点,并将该值初始化为“Sarah”。

<input type="text" value="Sarah">

当用户在 中输入 Sally 时,DOM 元素的 value 属性变为 Sally。但是,如果您使用 input.getAttribute('value') 查看 HTML 属性值,您会看到该属性保持不变——它返回“Sarah”。

HTML 属性值指定初始值; DOM value 属性是当前值。

示例 2:禁用按钮 按钮的 disabled 属性默认为 false,因此该按钮处于启用状态。

添加 disabled 属性时,您将按钮的 disabled 属性初始化为 true ,这将禁用按钮。

<button disabled>Test Button</button>

添加和删除 disabled 属性会禁用和启用按钮。但是,该属性的值是无关紧要的,这就是为什么您不能通过编写 Still Disabled 来启用按钮的原因。

要控制按钮的状态,请改为设置 disabled 属性。

属性和属性比较 虽然您可以在技术上设置 [attr.disabled] 属性绑定,但值不同之处在于属性绑定必须是布尔值,而其对应的属性绑定取决于该值是否为空。考虑以下:

<input [disabled]="condition ? true : false">
<input [attr.disabled]="condition ? 'disabled' : null">

第一行使用 disabled 属性,使用布尔值。第二行使用 disabled 属性检查是否为空。

通常,使用属性绑定而不是属性绑定,因为布尔值易于阅读,语法更短,属性更高效。


这部分是来自 www.coursehero.com 的复制粘贴。如果您复制并粘贴答案,那么让人们知道原始答案的来源。
哇!如果我没有阅读您的评论,我会认为答案非常好。谢谢 :)
抱歉各位,忘了说答案来自angular.io/guide/binding-syntax