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 相关文章推荐
js实现单一html页面两套css切换代码
Apr 11 Javascript
javascript中的Base64、UTF8编码与解码详解
Mar 18 Javascript
Javascript类型转换的规则实例解析
Feb 23 Javascript
基于jquery实现无限级树形菜单
Mar 22 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
Jul 04 Javascript
Bootstrap CSS组件之按钮下拉菜单
Dec 17 Javascript
几种tab切换详解
Feb 03 Javascript
微信小程序实现滑动删除效果
May 19 Javascript
javaScript动态添加Li元素的实例
Feb 24 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
Apr 26 Javascript
es6数组之扩展运算符操作实例分析
Apr 25 Javascript
Vue.js中v-bind指令的用法介绍
Mar 13 Vue.js
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程序员最常犯的11个MySQL错误小结
2010/11/20 PHP
php 网上商城促销设计实例代码
2012/02/17 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
js获取微信版本号的方法
2015/05/12 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
vuex + axios 做登录验证 并且保存登录状态的实例
2018/09/16 Javascript
Vue监听一个数组id是否与另一个数组id相同的方法
2018/09/26 Javascript
微信小程序实现滚动Tab选项卡
2020/11/16 Javascript
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python检测是文件还是目录的方法
2015/07/03 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
python获取指定时间差的时间实例详解
2017/04/11 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
python使用循环打印所有三位数水仙花数的实例
2018/11/13 Python
python如何读取bin文件并下发串口
2019/07/05 Python
python retrying模块的使用方法详解
2019/09/25 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
Python读写锁实现实现代码解析
2020/11/28 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
使用CSS3编写灰阶滤镜来制作黑白照片效果的方法
2016/05/09 HTML / CSS
LINUX下线程,GDI类的解释
2016/12/14 面试题
优秀员工自荐书
2013/12/19 职场文书
高级销售求职信
2014/02/21 职场文书
租房协议书范本
2014/04/09 职场文书
大学运动会加油稿
2015/07/22 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
什么是检讨书?检讨书的格式及范文
2019/11/05 职场文书
深入理解go缓存库freecache的使用
2022/02/15 Golang