前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版

JavaScript中property和attribute的区别

首页2016-07-27 13:50:20Front-End
JavaScript
  • 1. 定义

    • property(元素属性):DOM 节点是一个对象,因此,可以添加自定义的属性以及方法。property 的值可以是任何的数据类型,对大小写敏感。自定义的property不会出现在 html 中,只存在 JavaSctipt 中。
    • attribute(标签属性):attribute 只能是字符串,大小写不敏感,出现在 innerHTML 中,通过类数组attributes可以罗列所有的 attribute。
  • 2. 相同之处

  • 标准 DOM 的 properties(元素属性)与 attributes(标签属性)是同步的。公认的 attributes(标签属性)会添加到DOM对象 property(元素属性)上,如 id、style、className、disabled、checked 等。这时候直接操作 property (el. checked) 或者使用 el.getAttribute() / el.setAttribute() 效果一致。但是参数不一定相同,如:el.className 与 el.getAttribute('class')

  • 3. 不同之处

  • 对于有些标准的特性的操作,el.getAttribute 与 el.property 获取的值存在差异性。如: `href、src、value、style、onclic 等

  • Demo1:el.getAttribute 获取的是 href 的实际值,el.property 获取的是完整的 url

    alEl.href = '/';
    alert(alEl.getAttribute('href'));  // '/'
    alert(alEl.href);  				 // full URL
@前端进阶之旅: 代码已经复制到剪贴板
  • Demo2:el.property 可以从 el.setAttribute 获得同步
inputEl.setAttribute('value', 'hello');
alert(inputEl.value );	 		    // 'hello' -- property changed!
@前端进阶之旅: 代码已经复制到剪贴板
  • Demo3: el.getAttribute 不能从 el.property 获得同步
    inputEl.value = 'bye';
    alert(inputEl.getAttribute('value')); // 'hello' – attribute not changed!
@前端进阶之旅: 代码已经复制到剪贴板
  • Demo4:el.getAttribute 只能获取输入框的原始值,el.property 可以获取输入框修改后值

用户输入 ‘good’,inputEl.value 获得 ‘good’,inputEl.getAttribute(‘value’) 获得原始值 ‘hello’。 可以利用 inputEl.value == inputEl.getAttribute(‘value’) 检验 input 是否变化

  • Demo5:checkbox 未选中时 – el.getAttribute 返回 null,el.property 返回 false

checkbox 选中时 – el.getAttribute 仍返回 null,el.property 返回 ture

alert(checkboxEl.checked); 					//  boolean true
alert(checkboxEl.getAttribute('checked')); 		//  object null
@前端进阶之旅: 代码已经复制到剪贴板
  • Demo6:style – el.getAttribute 返回 string, el.property 返回 object
alert(divEl.style); 					// 'width:200px;height:200px;'
alert(divEl.getAttribute('style') ) 	//  [object CSSStyleDeclaration]
@前端进阶之旅: 代码已经复制到剪贴板
  • 4. 浏览器兼容性上的差别

    • 1) IE<9 浏览器中,el.property 和 el.getAttribute 可以相互访问自定义属性
    • 2) IE<8(包括IE8种的IE7兼容模式),el.property 和 el.getAttribute 相同
    • 因为 attribute 对大小写不敏感,在这种情况下,用 el.getAttribute 访问特性时,浏览器会选择第一次出现的值。
document.body.abba = 1 // assign property (now can read it by getAttribute)
document.body.ABBA = 5 // assign property with another case
// must get a property named 'ABba' in case-insensitive way.
alert( document.body.getAttribute('ABba') ) // 1
@前端进阶之旅: 代码已经复制到剪贴板
  • 5. 优先选择 property

  • 在实际应用中,98% 的 DOM 操作都是使用 properties。

  • 总结:只有两种情形需要使用 attributes :

      1. 自定义的 HTML attributes,因为它并不同步到 DOM property
      1. 访问内置的 HTML attributes(设置的初始值),这些 attribute 不能从 property 同步过来。例如input标签的 value 值
fe

← 绝对定位与相对定位jQuery与原生JS的DOM操作对比 →