[TOC]

一、当浏览器加载页面时,它会“读取” / “解析” HTML并从中生成DOM对象。
二、对于元素节点,大多数标准的HTML特性(attributes)会自动变成DOM对象的属性(properties)

【示例】如果标签是,那么DOM对象就会有body.id=”page”

三、特性——属性映射并不是一一对应的。
四、大多数情况下,最好用DOM属性。仅当DOM属性无法满足开发需求,并且我们真的需要特性时,才使用特性。

【示例】我们需要一个非标准的特性。但是如果它以data-开头,那么我们应该使用dataset。
【示例】我们想要读取HTML中“所写的”值。对应的DOM属性可能不同,例如href属性一直是一个完整的URL,但是我们想要的是“原始的”值。

特性与属性的区别

一、特性(attribute):写在HTML中的内容。
属性(property):DOM对象中的内容

属性 特性
类型 任何值,标准的属性具有规范中描述的类型 字符串
名字 名字(name)是大小写敏感的 名字(name)是大小写不敏感的

DOM属性 property

一、Dom节点是常规的JavaScript对象

| 【示例】```javascript // 在document.body中创建一个新的属性 document.body.myData = { name: ‘Caesar’, title: ‘Imperator’ }; alert(document.body.myData.title); // Imperator

// 添加方法 document.body.sayTagName = function() { alert(this.tagName); }; document.body.sayTagName(); // BODY(这个方法中的 “this” 的值是 document.body)

// 修改内建属性的原型 Element.prototype.sayHi = function() { // 修改Element.prototype为所有元素添加一个新方法 alert(Hello, I'm ${this.tagName}); }; document.documentElement.sayHi(); // Hello, I’m HTML document.body.sayHi(); // Hello, I’m BODY

 |
| --- |

二、DOM属性和方法的行为就像常规的JavaScript对象一样<br />1、它们可用有很多值。<br />2、它们是大小写敏感的(要写成elem.nodeType,而不是elem.NoDeTyPe)
<a name="toQxu"></a>
## DOM属性是多类型的
一、DOM属性不总是字符串类型的。

| 【示例】input.checked属性(对于checkbox的)是布尔型的```javascript
<input id="input" type="checkbox" checked> checkbox

<script>
  alert(input.getAttribute('checked')); // 特性值是:空字符串
  alert(input.checked); // 属性值是:true
</script>

| | —- |

| 【示例】style特性是字符串类型的,但style属性是一个对象```javascript

Hello

 |
| --- |

二、有一种非常少见的情况,即使一个DOM属性是字符串类型的,但它可能和HTML特性也是不同的。

| 【示例】**href** DOM属性一直是一个完整的URL,即使该特性包含一个相对路径或者包含一个#hash```javascript
<a id="a" href="#hello">link</a>
<script>
  // 特性
  alert(a.getAttribute('href')); // #hello

  // 属性
  alert(a.href ); // http://site.com/page#hello 形式的完整 URL
</script>

| | —- |

HTML特性 attribute

一、在HTML中,标签可能拥有特性(attributes)。
二、当浏览器解析HTML文本,并根据标签创建DOM对象时,浏览器会辨别标准的特性并以此创建DOM属性。
1、当一个元素有id货其他标准的特性,那么就会生成对应的DOM属性。但是非标准的特性则不会

| 【示例】```javascript


 |
| --- |

三、一个元素的标准的特性对于另一个元素可能是未知的。

| 【示例】"type"是<input>的一个标准的特性(HTMLInputElement),但对于<body>(HTMLBodyElement)来说则不是。 |
| --- |

| 【示例】```javascript
<body id="body" type="...">
  <input id="input" type="text">
  <script>
    alert(input.type); // text
    alert(body.type); // undefined:DOM 属性没有被创建,因为它不是一个标准的特性
  </script>
</body>

| | —- |

四、如果一个特性不是标准的,那么就没有相对应的DOM属性。
五、HTML特性有以下几个特征
1、它们的名字是大小写不敏感的(id与ID相同)
2、它们的值总是字符串类型的

| 【示例】特性的扩展示例```javascript

1、getAttribute('About'):这里的第一个字母是大写的,但是在HTML中,它们都是小写的。但这没有影响,特性的名称是大小写不敏感的。<br />2、我们可以将任何东西赋值给特性,但是这些东西会变成字符串类型的。<br />3、所有特性,包括我们设置的那个特性,在outerHTML中都是可见的。<br />4、attributes集合时可迭代对象,该对象将所有元素的特性(标准和非标准的)作为name和value属性存储在对象中。 |
| --- |


<a name="HlkBg"></a>
## 访问特性的方法
一、所有特性都可以通过使用以下方法进行访问<br />1、elem.hasAttribute(name)——检查特性是否存在<br />2、elem.getAttribute(name)——获取这个特性值<br />3、elem.setAttribute(name, value)——设置这个特性值<br />4、elem.removeAttribute(name):移除这个特性<br />5、elem.attributes:读取所有特性。属于呢间Attr类的对象的集合,具有name和value属性。

| 【示例】读取非标准的特性```javascript
<body something="non-standard">
  <script>
    alert(document.body.getAttribute('something')); // 非标准的
  </script>
</body>

| | —- |

非标准的特性,dataset

一、有时,非标准的特性常常用于将自定义的数据从HTML传递到JavaScript,或者用于为JavaScript“标记”HTML元素

| 【示例】```javascript

 |
| --- |

二、设置元素的样式

| 【示例】使用order-state特性来设置订单状态```javascript
<style>
  /* 样式依赖于自定义特性 "order-state" */
  .order[order-state="new"] {
    color: green;
  }

  .order[order-state="pending"] {
    color: blue;
  }

  .order[order-state="canceled"] {
    color: red;
  }
</style>

<div class="order" order-state="new">
  A new order.
</div>

<div class="order" order-state="pending">
  A pending order.
</div>

<div class="order" order-state="canceled">
  A canceled
</div>

1、为什么使用特性比使用.order-state-new,.order-state-pending,.order-state-canceled这些样式类要好?
(1)因为特性值更容易管理。我们可以轻松地更改状态```javascript // 比删除旧的或者添加一个新的类要简单一些 div.setAttribute(‘order-state’, ‘canceled’);

2、自定义特性存在的问题<br />(1)我们使用了非标准的特性,之后它被引入到了标准中并有了自己的用途,怎么办?<br />①为了避免冲突,存在data-*特性 |
| --- |

三、所有以"data-"开头的特性均被保留供程序员使用。它们可在dataset属性中使用

| 【示例】如果一个elem有一个名为“data-about”的特性,那么可以通过elem.dataset.about取到它```javascript
<body data-about="Elephants">
<script>
  alert(document.body.dataset.about); // Elephants
</script>

1、像data-order-state这样的多词特性可以以驼峰式进行调用:dataset.orderState | | —- |

四、使用data-*特性是一种合法且安全的传递自定义数据的方式
五、我们不仅可以读取数据,还可以修改数据属性(data-attributes)。然后CSS会更新相应的视图。

属性-特性同步

一、当一个标准的特性被改变,对应的属性也会自动更新,(除了几个特例)反之亦然。

| 【示例】id被修改为特性,我们可以看到对应的属性也发生了变化。反过来也是同样的效果```javascript

1、但是也有例外,如input.value只能从特性同步到属性,反过来则不行。```javascript
<input>

<script>
  let input = document.querySelector('input');

  // 特性 => 属性
  input.setAttribute('value', 'text');
  alert(input.value); // text

  // 这个操作无效,属性 => 特性
  input.value = 'newValue';
  alert(input.getAttribute('value')); // text(没有被更新!)
</script>

| | —- |

【示例】实际中,用户行为可能会导致value的更改,然后在这些操作中,如果我们想从HTML中恢复“原始”值,那么该值就在特性中。