持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天
操作元素
修改元素内容
element.innerText
从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉
element.innerHTML
起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
- 来个例子
<body>
<button>
显示时间
</button>
<div>
某个时间
</div>
<script>
var btn = document.querySelector('button');
var div = document.querySelector('div');
btn.onclick = function(){
div.innerText = getDate();
}
function getDate(){
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth()+1;
var day = date.getDate();
return '今天是'+year+'年'+month+'月'+day+'日';
}
</script>
</body>
innerText和innerHTML的区别
- innerText不识别html的标签,而innerHTML识别html标签
- innerText是IE发行,非标准的;innerHTML是W3C发行的,标准的
- innerText会去除空格以及换行,而innerHTML保留空格和换行
常用元素的属性操作
<body>
<button id = 'gy'>甘雨</button>
<button id = 'lh'>神里凌华</button> <br/>
<img src='lh.jpg' alt="" width="300">
<script>
var gy = document.getElementById('gy');
var lh = document.getElementById('lh');
var img = document.querySelector('img');
lh.onclick = function(){
img.src = 'lh.jpg';
}
gy.onclick = function(){
img.src = 'gy.jpg';
}
</script>
</body>
表单元素的属性操作
利用DOM可以操作如下表单元素的属性
type value checked selected disabled
- 禁用案例
<body>
<button>按钮</button>
<input type = 'text' value='输入内容'>
<script>
var btn = document.querySelector('button');
var input = document.querySelector('input');
btn.onclick = function(){
input.value = '被点击了'
btn.disabled = true;
//或者
this.disabled = true;
// this指向的是事件函数的调用者btn
}
</script>
</body>
- 显示密码案例
<style>
.box{
position: relative;
width: 400px;
border-bottom: 1px solid #ccc;
margin: 100px auto;
}
.box input{
width: 370px;
height: 30px;
border: 0;
outline: none;
}
.box img{
position: absolute;
top: 2px;
right: 2px;
width: 24px;
}
/*用css隐藏自带的眼睛按钮*/
input::-ms-clear{
display: none;
}
input::-ms-reveal{
display: none;
}
</style>
<body>
<div class = 'box'>
<label for "">
<img src="colse.png" alt="" id = 'eye'>
</label>
<input type = 'password' name = "" id = "pwd">
</div>
<script>
var eye = document.getElementById('eye');
var pwd = document.getElementById('pwd');
var flag = 0;
eye.onclick = function(){
if (flag == 0){
pwd.type = 'text';
eye.src = 'open.png';
flag = 1;
}else{
pwd.type = 'password';
eye.src = 'colse.png';
flag = 0;
}
}
</script>
</body>
修改样式属性
1. element.style 行内样式操作
2. element.className 类名样式操作
- 示例
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
}
</style>
<body>
<div></div>
<script>
var div = document.querySelector('div');
div.onclick = function(){
this.style.backgroundColor = 'purple';
}
</script>
</body>
- JS里面的样式采取驼峰命名法,比如:backgroundColor
- JS修改style样式操作,产生的是行内样式,权重比较高
节点操作
- 利用DOM提供的方法获取元素
- document.getElementById()
- document.getElementsByTagName()
- document.querySelector 等
- 繁琐,逻辑性不强
- 利用节点层级关系获取元素
- 利用父子兄弟节点关系获取元素
- 逻辑性强,但兼容性差
节点概述
节点的定义
网页中的所有内容都是节点(标签,属性,文本,注释等),在DOM中,节点使用node来表示。HTML DOM树中的所有节点都可以通过JS进行访问,所有的HTML元素(节点)均可被修改,也可以删除或创建
节点基本属性
-
nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性
-
元素节点 nodeType 为1
-
属性节点 nodeType 为2
-
文本节点 nodeType 为3 (文本节点包含文字、空格、换行)
我们在实际开发中,节点操作主要操作的是元素节点
节点层级
利用DOM树可以把节点划分为不同的层级关系,常规为父子兄弟关系
- 父级节点
node.parenntNode;
<div class='box'>
<span class='erweima'></span>
</div>
<script>
var erweima = document.querySelector('.erweima');
// erweima.parentNode为erweima的父节点,得到离元素最近的父级节点,如果找不到父节点就返回null
console.log(erweima.parentNode);
</script>
-
得到离元素最近的父级节点
-
如果找不到父节点就返回null
- 子节点
parentNode.childNodes(标准);
- 返回的是含指定节点的子节点集合,该集合为及时更新的集合
<body>
<ul>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
</ul>
<ol>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
<li>mzmm403</li>
</ol>
</body>
<script>
var ul = document.querySelector('ul');
console.log(ul.childNodes);
//查看节点类型,根据伪数组取出数组元素
console.log(ul.childNode[0].nodeType)
</script>
注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes
var ul = document.querySelector('ul');
for(var i = 0; i < ul.childNodes.length;i++){
if (ul.childNodes[i].nodeType == 1){
// ul.childNodes[i]是元素节点
console.log(ul.childNodes[i]);
}
}
因为parentNode.childNodes(标准)返回所有的子节点,所以我们一般采用以下方法获得子元素节点
parentNode.children;
parentNode.firstChild;
- 返回第一个子节点,找不到则返回null,同样包含了所有的节点
parentNode.lastChild;
- 返回最后一个子节点,找不到则返回null,同样包含了所有的节点
parentNode.firstElementChild;
parentNode.lastElementChild;
- 拿到第一个子元素节点/拿到最后一个子元素节点(这两个方法由于兼容性问题,IE9以上才支持)
- 兄弟节点
node.nextSinling;
- nextSinling返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点
node.previousSinling;
- previousSinling返回当前元素上一个兄弟节点,找不到则返回null。同样,也包含所有的节点
node.nextElementSinling;
node.previousElementSinling;
-
nextElementSinling返回当前元素下一个兄弟元素节点,找不到则返回null
-
previousElementSinling返回当前元素上一个兄弟元素节点,找不到则返回null
-
上述兄弟节点的连个方法都是IE9以上才支持的
-
解决方法
function getNextElementSinling(element){
var el = element;
while (el = el.nextSinling){
if (el.nodeType == 1){
return el;
}
}
return null;
}
创建和添加节点
document.createElement('tagName')
- document.createElement()方法创建由tagName指定的HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也成为动态创建元素节点
node.appendChild(child);
node.insertBefore(child,指定元素);
-
node.appendChild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于CSS里面的after伪元素
-
node.insertBefore()方法将一个接待你添加到父节点的指定子节点前面。类似于CSS里面的before伪元素
-
示例
<body>
<ul>
<li>123</li>
</ul>
<script>
// 创建节点
var li = document.createElement('li');
// 添加节点,追加节点
var ul = document.querySelector('ul');
ul.appendChild(li);
var lili = document.creatElement('li');
ul.insertBefore(lili,ul.children[0]);
</script>
</body>
页面想要添加一个元素:
- 创建元素
- 添加元素
删除和克隆节点
node.removeChild(child)
- node.removeChild()方法从DOM中删除一个子节点,返回删除的节点
node.cloneNode()
-
node.cloneNode()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
-
如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点
-
如果括号里面为true,则为深拷贝,会复制节点本身及里卖弄的所有子节点