attribute和property的区别

263 阅读3分钟

attribute和property的区别

在 Web 开发中,attributeproperty 是两个容易混淆的概念,它们都与 HTML 元素的特性相关,但它们的来源、行为和用途有显著区别。

1. 核心区别

特性Attribute(属性)Property(特性)
定义HTML 标签上的特性(写在 HTML 中)DOM 对象上的特性(通过 JavaScript 访问)
来源HTML 标签DOM 对象
数据类型始终是字符串可以是任意类型(字符串、布尔值、数字等)
同步性初始同步,后续可能不同步动态更新,可能影响 attribute
示例<input type="text" value="Hello">input.value = "World"

2. 详细对比

(1) Attribute

  • 定义:HTML 标签上的特性,写在 HTML 中。
  • 访问方式
    • JavaScript:element.getAttribute()element.setAttribute()
    • HTML:直接在标签中定义。
  • 数据类型:始终是字符串。
  • 同步性:初始时与 property 同步,后续可能不同步。

示例

<input id="input" type="text" value="Hello">
const input = document.getElementById('input');
console.log(input.getAttribute('value')); // 输出:Hello

(2) Property

  • 定义:DOM 对象上的特性,通过 JavaScript 访问。
  • 访问方式:直接通过 DOM 对象访问。
  • 数据类型:可以是任意类型(如布尔值、数字、对象等)。
  • 同步性:动态更新,可能影响 attribute。

示例

const input = document.getElementById('input');
console.log(input.value); // 输出:Hello
input.value = 'World'; // 修改 property
console.log(input.value); // 输出:World
console.log(input.getAttribute('value')); // 输出:Hello(未同步)

3. 同步性与不同步性

(1) 初始同步

  • 当页面加载时,HTML 标签的 attribute 会同步到 DOM 对象的 property。

    <input id="input" type="text" value="Hello">
    
    const input = document.getElementById('input');
    console.log(input.value); // 输出:Hello(初始同步)
    

(2) 后续不同步

  • 修改 property 不会自动更新 attribute,反之亦然。
    input.value = 'World'; // 修改 property
    console.log(input.value); // 输出:World
    console.log(input.getAttribute('value')); // 输出:Hello(未同步)
    

(3) 特殊情况

  • 某些 attribute 和 property 是实时同步的,如 idclass
    input.setAttribute('class', 'new-class');
    console.log(input.className); // 输出:new-class(同步)
    

4. 常见用例

(1) 获取和设置 attribute

// 获取 attribute
const type = input.getAttribute('type'); // 输出:text

// 设置 attribute
input.setAttribute('placeholder', '请输入');

(2) 获取和设置 property

// 获取 property
const value = input.value; // 输出:Hello

// 设置 property
input.value = 'World';

(3) 布尔 attribute

  • 布尔 attribute(如 disabledchecked)在 HTML 中只需存在即可生效。
  • 对应的 property 是布尔值。

示例

<input id="checkbox" type="checkbox" checked>
const checkbox = document.getElementById('checkbox');
console.log(checkbox.getAttribute('checked')); // 输出:空字符串
console.log(checkbox.checked); // 输出:true

5. 注意事项

  1. 数据类型差异

    • attribute 始终是字符串。
    • property 可以是任意类型。
    input.setAttribute('maxlength', '10'); // attribute 是字符串
    console.log(typeof input.maxLength); // 输出:number(property 是数字)
    
  2. 性能差异

    • 操作 property 通常比操作 attribute 更快,因为 property 直接访问 DOM 对象。
  3. 自定义 attribute

    • 自定义 attribute 不会自动映射到 property。
    • 使用 data-* 属性存储自定义数据。
    <div id="myDiv" data-custom="123"></div>
    
    const div = document.getElementById('myDiv');
    console.log(div.dataset.custom); // 输出:123
    

总结

场景使用 Attribute使用 Property
获取初始值getAttribute()直接访问 property
设置值setAttribute()直接赋值 property
数据类型始终是字符串可以是任意类型
同步性初始同步,后续可能不同步动态更新,可能影响 attribute
布尔值处理存在即生效布尔值(true/false

理解 attribute 和 property 的区别有助于更好地操作 DOM 元素,避免因数据类型和同步性问题导致的错误。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github