JS中DOM元素的attribute与property属性示例详解


Posted in Javascript onSeptember 04, 2018

一、'表亲戚':attribute和property

为什么称attribute和property为'表亲戚'呢?因为他们既有共同处,也有不同点.

attribute 是 dom 元素在文档中作为 html 标签拥有的属性;

property 是 dom 元素在 js 中作为对象拥有的属性。

从定义上可以看出:

  • 对于 html 的标准属性来说,attribute 和 property 是同步的,是会自动更新的
  • 但是对于自定义的属性来说,他们是不同步的.(自定义属性不会自动添加到property)
  • property 的值可以改变;attribute 的值不能改变

二、 两者输出形式

1、分别打印两个值

打印attribute属性

//html
<div class="divClass" id="divId" ></div>

//js
window.onload = function(){
 var divId = document.getElementById('divId');
 console.log(divId.attributes);
}

JS中DOM元素的attribute与property属性示例详解

可以看见attributes对应的值,我们打印一下:

console.log(divId.attributes[0]); //打印 class="divClass"
console.log(divId.attributes.class) //打印 class="divClass"

console.log(divId.getAttribute('class')) //打印divClass
console.log(divId.getAttribute('id')) //打印divId

发现上面两组值是相等的.

虽然都可以取值,但《js高级程序设计》中提到,为了方便操作,建议大家用setAttribute()和getAttribute()来操作即可。

打印property

html自带的dom属性会自动转换成property,但是自定义的属性没有这个'权利'

直接把div标签当作对象,用'.'输出即是property属性

但是注意!property是不能输出自定义属性的

<div class="divClass" id="divId" addUserDefine="zidingyi"></div>

console.log(divId.class);  //打印 divClass
console.log(divId.addUserDefine) //打印 undefined

JS中DOM元素的attribute与property属性示例详解

打开Elements的properties可以看到,dom存在的属性,property同样继承了,而addUserDefine却没有出现在property中

property:

var obj = {};
Object.defineProperty(obj,'name',{
 value:'Property'
})

console.log(obj.name) //打印 Property

三、用例子解析两者赋值

如果我们修改了property的值

//html
<input value="initValue" id="ipt"/>

//js
window.onload = function(){
 var ipt = document.getElementById('ipt');

 ipt.value = 'changeValue'
 console.log(ipt.value);
 console.log(ipt.getAttribute('value'));
}

猜一下结果??

答案是:

console.log(ipt.value);   //changeValue
console.log(ipt.getAttribute('value'));  //initValue

我们再来看看input的值

JS中DOM元素的attribute与property属性示例详解

难以置信?

我们再来看看从修改attribute入手

//html
<input value="initValue" id="ipt"/>

//js
window.onload = function(){
 var ipt = document.getElementById('ipt');

 ipt.setAttribute('value','changeValue')
 console.log(ipt.value);
 console.log(ipt.getAttribute('value'));

}

输出:

console.log(ipt.value);   //changeValue
console.log(ipt.getAttribute('value'));  //changeValue

总结如下:

  • property比attribute'霸道',估计是'表哥'
  • property和attribute两者是属于单方面通信,即:

1.property能够从attribute中得到同步;

2.attribute不会同步property上的值;

再??乱痪?

对属性Property可以赋任何类型的值,而对特性Attribute只能赋值字符串!

//js
var obj = {
 value : false,
}

var ipt = document.getElementById('ipt');

obj.value = true;  //property更改
ipt.setAttribute('value',true) //attribute更改

console.log(typeof obj.value); //boolean
console.log(obj.value)   //true

console.log(typeof ipt.value) //string
console.log(ipt.value);   //true

小结

分析了这么多,对property和attribute的区别理解也更深了,在这里总结一下:

创建

  • DOM对象初始化时会在创建默认的基本property;
  • 只有在HTML标签中定义的attribute才会被保存在property的attributes属性中;
  • attribute会初始化property中的同名属性,但自定义的attribute不会出现在property中;
  • attribute的值都是字符串;

数据绑定

  • attributes的数据会同步到property上,然而property的更改不会改变attribute;
  • 对于value,class这样的属性/特性,数据绑定的方向是单向的,attribute->property;
  • 对于id而言,数据绑定是双向的,attribute<=>property;
  • 对于disabled而言,property上的disabled为false时,attribute上的disabled必定会并存在,此时数据绑定可以认为是双向的;

使用

  • 可以使用DOM的setAttribute方法来同时更改attribute;
  • 直接访问attributes上的值会得到一个Attr对象,而通过getAttribute方法访问则会直接得到attribute的值;
  • 大多数情况(除非有浏览器兼容性问题),jQuery.attr是通过setAttribute实现,而jQuery.prop则会直接访问DOM对象的property;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
使用Firebug对js进行断点调试的图文方法
Apr 02 Javascript
javascript笔记 String类replace函数的一些事
Sep 22 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
Jul 15 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
js+html5通过canvas指定开始和结束点绘制线条的方法
Jun 05 Javascript
JS实现的简单标签点击切换功能示例
Sep 21 Javascript
Vue实现自定义下拉菜单功能
Jul 16 Javascript
谈谈为什么你的 JavaScript 代码如此冗长
Jan 30 Javascript
vue使用video.js进行视频播放功能
Jul 18 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
Apr 09 Javascript
vue特效之翻牌动画
Apr 20 Vue.js
js面向对象编程OOP及函数式编程FP区别
Jul 07 Javascript
JavaScript使用indexOf()实现数组去重的方法分析
Sep 04 #Javascript
关于vue v-for 循环问题(一行显示四个,每一行的最右边那个计算属性)
Sep 04 #Javascript
原生JS实现获取及修改CSS样式的方法
Sep 04 #Javascript
微信小程序canvas拖拽、截图组件功能
Sep 04 #Javascript
mpvue写一个CPASS小程序的示例
Sep 04 #Javascript
Vue表单及表单绑定方法
Sep 04 #Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 #Javascript
You might like
php下防止单引号,双引号在接受页面转义的设置方法
2008/09/25 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
PHP高级编程实例:编写守护进程
2014/09/02 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
5款Javascript颜色选择器
2009/10/25 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
初探nodeJS
2017/01/24 NodeJs
js中let和var定义变量的区别
2018/02/08 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
vue.js的双向数据绑定Object.defineProperty方法的神奇之处
2019/01/18 Javascript
微信小程序在其他页面监听globalData中值的变化
2019/07/15 Javascript
[02:46]解说DC:感谢430陪伴我们的DOTA2国际邀请赛岁月
2016/06/29 DOTA
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
[04:40]DOTA2-DPC中国联赛1月26日Recap集锦
2021/03/11 DOTA
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
python创建文件时去掉非法字符的方法
2018/10/31 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
结束运行python的方法
2020/06/16 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
巴西本土电商平台:Americanas
2020/06/21 全球购物
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
2014学雷锋活动总结
2014/03/09 职场文书
毕业评语大全
2014/05/04 职场文书
质量标语大全
2014/06/12 职场文书
2014党支部对照检查材料思想汇报
2014/10/05 职场文书
2015年行政部工作总结
2015/04/28 职场文书
机关干部纪律作风整顿心得体会
2016/01/23 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
使用numpy实现矩阵的翻转(flip)与旋转
2021/06/03 Python
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL