前言
本文章源自《JavaScript知识小册》专栏,感兴趣的话还请关注点赞收藏.
上一篇文章:《带你玩转JavaScript中的Callback Function、Promise、async/await》
下一篇文章《JavaScript中你所不知道的普通属性和排序属性》
准备
新建简单的HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="shortcut icon" href="static/favicon.ico"/>
<style type="text/css">
.red {
color: red;
}
</style>
</head>
<body>
<h1>JavaScript</h1>
<div id="div1">div1</div>
<div>div2</div>
<div>div3</div>
</body>
</html>
页面展示如下
DOM Property
在使用JavaScript
操作DOM对象
时,会有一个property
的概念。字面意思即属性
。其实本质上只是代表了获取一个DOM元素,然后可以通过修改JS属性的方式来操作这个DOM对象的属性,它其实是一种形式。
比如说现在要修改id
为div1
的这个DOM对象
的fontSize
属性调整字体大小,那么只需要获取DOM对象
,然后通过DOM对象.style.fontSize=xxx
的形式来修改,这个时候其实就是通过JavaScript
修改DOM对象
的property(属性)
来达到想要的效果。
const div1 = document.getElementById('div1')
console.log(div1.style.fontSize) // 输出原先的fontSize,因为没有人为设置,所以输出空字符
div1.style.fontSize = '60px' // 修改div1 DOM对象的fontSize属性(property)为60px
console.log(div1.style.fontSize) // 输出60px
fontSize property
修改完毕后,前端相应的字体大小也发生变化
除了修改fontSize
这种CSS属性
外,还可以修改DOM对象
的CSS类名
加上CSS
代码
<style type="text/css">
.red {
color: red;
}
</style>
const div1 = document.getElementById('div1')
console.log(div1.style)
console.log(div1.style.fontSize)
div1.style.fontSize = '60px'
console.log(div1.style.fontSize)
div1.className = 'red' // 设置DOM对象的className属性
页面相应发生变化
可以看到property
其实不是什么特别的API,只是一种形式,比如获取DOM对象
后修改style.width
、style.fontSize
、style.height
、className
等等,这些都是在操作DOM对象
的property
,以修改页面元素的显示效果。
如果操作的是DOM对象
原本不存在的property
,那么不会有任何变化,HTML
结构不会受影响。
div1.clazzName = 'ddiv' // 添加DOM对象原本不存在的property
console.log(div1.clazzName) // 输出ddiv,但实际上网页渲染不会有任何变化
attribute
attribute
跟property
一样有属性
的意思。只不过对attribute
的操作,会真正作用到DOM结构树
中,是可以被看到的。
比如设置style="font-size:100px;"
(行内样式),用设置attribute
的形式如下
const div1 = document.getElementById('div1')
div1.setAttribute('fontSize', "100px")
并且可以看到DOM树
的div1
节点,是有style
这个属性的
再设置一个自定义的node-name
属性
div1.setAttribute('node-name', 'div1')
不会像property
那样设置自定义属性基本不会实际影响到DOM节点
,而是实际地在div1
这个标签节点上有node-name
这个属性存在。
总结
property
是通过JS
修改DOM对象
的属性,不会体现到HTML
结构中,而修改attribute
则是会实际对DOM元素
的HTML属性
产生影响,会体现在HTML
结构中。当然实际上修改两者,都有可能触发DOM的重新渲染
。