在jQuery 1.6.1中进行更改之后,我一直试图定义HTML中的属性和属性之间的差异。
查看jQuery 1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类:
属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。
属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。
有什么想法吗?
在jQuery 1.6.1中进行更改之后,我一直试图定义HTML中的属性和属性之间的差异。
查看jQuery 1.6.1发行说明中的列表(在底部附近),似乎可以对HTML属性和属性进行如下分类:
属性:所有具有布尔值或UA计算得出的值,例如selectedIndex。
属性:可以添加到既不是布尔也不包含UA生成值的HTML元素中的“属性”。
有什么想法吗?
Answers:
编写HTML源代码时,可以在HTML元素上定义属性。然后,一旦浏览器解析了您的代码,就会创建一个对应的DOM节点。该节点是一个对象,因此具有属性。
例如,此HTML元素:
<input type="text" value="Name:">
有2个属性(type
和value
)。
浏览器解析此代码后,将创建一个HTMLInputElement对象,该对象将包含许多属性,例如:accept,accessKey,align,alt,attributes,autofocus,baseURI,checked,childElementCount,childNodes,childNodes,classList,className, clientHeight等
对于给定的DOM节点对象,属性是该对象的属性,属性是该对象的属性的元素attributes
。
当为给定的HTML元素创建DOM节点时,其许多属性与具有相同或相似名称的属性相关,但不是一对一的关系。例如,对于此HTML元素:
<input id="the-input" type="text" value="Name:">
相应的DOM节点将具有id
,type
和value
属性(以及其他属性):
的id
属性是一个反射属性的id
属性:获取属性读取的属性值,并且设置属性写入的属性值。id
是一个纯反射属性,它不会修改或限制该值。
的type
属性是一个反射属性的type
属性:获取属性读取的属性值,并且设置属性写入的属性值。type
不是纯反射属性,因为它仅限于已知值(例如,输入的有效类型)。如果你有<input type="foo">
,那么theInput.getAttribute("type")
给你"foo"
但theInput.type
给你"text"
。
相反,该value
属性不能反映该value
属性。相反,它是输入的当前值。当用户手动更改输入框的值时,该value
属性将反映此更改。因此,如果用户"John"
在输入框中输入内容,则:
theInput.value // returns "John"
而:
theInput.getAttribute('value') // returns "Name:"
该value
属性反映输入框内的当前文本内容,而该value
属性包含HTML源代码中属性的初始文本内容value
。
因此,如果您想知道文本框中当前包含的内容,请阅读属性。但是,如果您想知道文本框的初始值是什么,请阅读属性。或者,您可以使用defaultValue
属性,它是对value
属性的纯粹反映:
theInput.value // returns "John"
theInput.getAttribute('value') // returns "Name:"
theInput.defaultValue // returns "Name:"
有几个属性,可直接反映他们的属性(rel
,id
),有些是用稍微不同的名称直接反射(htmlFor
反映for
属性,className
体现了class
属性),许多反映他们的属性,但有限制/修改(src
,href
,disabled
,multiple
)等上。该规范涵盖了各种反射。
for
-> htmlFor
),类似地,可以从属性中获取其初始值但不反映其初始值的属性列表(input.value
)。我希望这可以在github.com/Matt-Esch/virtual-dom之类的库的源代码中找到,但实际上并没有记录。
阅读Sime Vidas的答案后,我进行了更多搜索,并在Angular文档中找到了非常简单易懂的解释。
HTML属性与DOM属性
属性由HTML定义。属性由DOM(文档对象模型)定义。
一些HTML属性具有1:1到属性的映射。
id
就是一个例子。一些HTML属性没有相应的属性。
colspan
就是一个例子。某些DOM属性没有相应的属性。
textContent
就是一个例子。许多HTML属性似乎可以映射到属性...但是并不是您想的那样!
在您掌握以下一般规则之前,最后一类令人困惑:
属性初始化 DOM属性,然后完成。属性值可以改变;属性值不能。
例如,当浏览器渲染时
<input type="text" value="Bob">
,它将创建一个具有value
初始化为“ Bob” 的属性的相应DOM节点。当用户在输入框中输入“ Sally”时,DOM元素
value
属性将变为“ Sally”。但是,如果您向输入元素询问该属性,则HTMLvalue
属性保持不变:input.getAttribute('value')
返回“ Bob”。HTML属性
value
指定初始值;DOMvalue
属性是当前值。
该
disabled
属性是另一个特殊的示例。默认情况下,按钮的disabled
属性是false
默认设置,因此该按钮处于启用状态。当您添加disabled
属性时,仅其存在就将按钮的disabled
属性初始化为,true
因此该按钮被禁用。添加和删除
disabled
属性将禁用并启用该按钮。该属性的值无关紧要,这就是为什么您不能通过编写来启用按钮的原因<button disabled="false">Still Disabled</button>.
设置按钮的
disabled
属性将禁用或启用按钮。财产的价值至关重要。HTML属性和DOM属性即使名称相同,也不相同。
colspan
属性具有colSpan
属性。...那么,哪个属性现在没有相关属性?
答案已经解释了如何不同地处理属性和属性,但是我真的想指出 这是疯狂。即使在某种程度上是规格。
疯狂的是,有些属性(例如id,class,foo,bar)仅在DOM中保留一种值,而某些属性(例如checked,selected)保留两个值;也就是“加载时”的值和“动态状态”的值。(不是DOM应该代表状态)文档?)
绝对重要的是,两个输入字段(例如,文本和复选框)的 行为必须完全相同。如果文本输入字段没有保留单独的“加载时”值和“当前动态”值,那么为什么要选中该复选框?如果该复选框的checked属性确实有两个值,为什么它的class和id属性没有两个值?如果您希望更改文本 * input *字段的值,并且希望DOM(即“序列化表示形式”)发生更改并反映此更改,那么为什么您不希望从输入字段获得相同的内容呢?键入复选框 在检查的属性?
对我来说,“这是布尔属性”的区分只是没有任何意义,或者至少不是充分的理由。
checked
属性由表示defaultChecked
属性(同样用于文本输入的value
属性由表示defaultValue
属性)。需要第二个属性checked
来表示是否选中该复选框,因为这是复选框功能的固有部分:它是交互式的,用户可以更改(如果存在表单重置按钮,则重置为默认值)。 ,以某种其他属性(例如id
不是)的方式。它是一个布尔属性,这与事实无关。
很好,这些是由w3c指定的。什么是属性,什么是属性 http://www.w3.org/TR/SVGTiny12/attributeTable.html
但目前attr和prop并没有太大不同,几乎相同
但是他们更喜欢道具
首选用法摘要
.prop()方法应用于布尔属性/属性以及html中不存在的属性(例如window.location)。所有其他属性(您可以在html中看到的属性)都可以并且应该继续使用.attr()方法进行操作。
好吧,实际上,如果您使用attr或prop或同时使用attr和prop都不需要更改某些东西,但是两者都可以工作,但是我在自己的应用程序中看到prop在atrr没起作用的地方工作了,所以我使用了我的1.6 app prop =)
在评估HTML的区别之前,让我们先看一下这些单词的定义:
英文定义:
在HTML上下文中:
当浏览器解析HTML时,它将创建一个树数据结构,该结构基本上是HTML的内存中表示形式。树数据结构包含HTML元素和文本的节点。与此相关的属性和属性如下所示:
同样重要的是要认识到这些属性的映射不是1到1。换句话说,并不是我们在HTML元素上提供的每个属性都具有相似的命名DOM属性。
此外具有不同DOM元素的不同属性。例如,<input>
元素的值属性不存在于<div>
属性中。
让我们看下面的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>
然后,我们<div>
在JS控制台中检查:
console.dir(document.getElementById('foo'));
我们看到以下DOM属性(chrome devtools,未显示所有属性):
class
在JS中为reserved关键字)。但是实际上有2个属性,classList
和className
。