JavaScript DOM操作

JavaScript DOM操作

1 获取元素

名称说明
document.getElementById(‘id名’)通过id获取元素
document.getElementsByTagName(‘属性名’)通过属性名获取元素
document.getElementsByName(‘name名’)通过name名获取元素
document.getElementsByClassName(‘类名’)通过class名获取元素
document.querySelector(’#id名’)通过选择器获取元素
document.querySelectorAll(’.class名’)通过选择器获取所有含有class名的元素
var box = document.getElementById('box');
console.log(box); // 返回id为box的标签

var lis = document.getElementsByTagName('li');
console.log(lis); // 返回HTMLCollection伪数组,是元素集合

var txt = document.getElementsByName('txt');
console.log(txt); // 返回NodeList伪数组,是节点集合

var oneLi = document.getElementsByClassName('one');
console.log(oneLi); // 返回HTMLCollection伪数组,是元素集合

var btn = document.querySelector('#btn'); // 可以写类选择器和id选择器
console.log(btn);
var lis = document.querySelector('li'); // 若输入标签名将返回获取的第一个元素
console.log(lis);

2 属性

2.1 获取属性

通过获取的元素加点加属性名获取,如:href、title、id、src、className等

var div = document.getElementById('box');
console.log(div.id);  // box

2.2 一些常用属性

2.2.1 innerHTML、innerText和textContent

这两个属性都可以添加文本到页面中,但是innerHTML能添加标签而innerText不能

名称说明
innerHTML设置或返回标签和文本,设置内容时相当于字符串拼接
innerText设置或返回文本,早期火狐存在兼容性问题
textContent设置或返回文本且保留空格换行字符

解决innerText兼容性问题

function fn(el) {
  	if (typeof el.innerText === 'string') {
    	return el.innerText
  	} else {
    	return el.textContent
  	}
}
2.2.2 自定义属性
  • getAttribute():获取标签行内属性

  • setAttribute():设置标签行内属性

  • removeAttribute():移除标签行内样式

以上三种属性可以获取标签内的任意行内属性

2.2.3 其他属性操作
  • 表单元素属性

  • 使用style设置标签的行内样式

var box = document.getElementById('box');
box.style.width = '100px';
box.style.height = '100px';
box.style.backgroundColor = 'pink';
  • 直接修改类名
var box = document.getElementById('box');
box.className = 'show';
console.log(box.className);  // show

3 事件

3.1 常用事件

名称说明
onclick鼠标点击事件,一般用于按钮等需点击触发的事件
onfocus鼠标聚焦事件,一般用于文本输入框
onblur鼠标失去焦点事件,一般用于input输入输入框
onmouseup鼠标按键放开事件
onmousedown鼠标按键按下事件
onmousemove鼠标移动事件
onkeyup键盘按键抬起事件
onkeydown键盘按键按下事件
onkeypress键盘按键按下并放开事件,不适用于所有键,如:Alt、Ctrl、Shift、Esc

3.2 添加/移除事件

  • 使用on添加事件,事件名参考3.1
btn.onclick = function () {
  	alert(222)
  	btn.onclick = null // 解绑事件
}

用on注册事件只能注册一次,再注册会覆盖掉之前的代码

  • 使用addEventListener添加事件

    语法:addEventListener(‘事件名’, 回调函数),称为事件监听,由DOM触发

 btn.addEventListener('click', function () {
   	 alert(111)
 })
 btn.addEventListener('click', function () {
   	 alert(222)
 }) // 先弹出111再弹出222

addEventListener可以添加多个事件,但仍有一些缺点:

  1. 有兼容性问题,IE9之前必须使用attachEvent实现添加多个事件的效果,但是谷歌不支持attachEvent
  2. this指向的是window而不是指向触发函数的元素
  3. 一般将事件封装成函数再使用,否则无法移除
 btn.addEventListener('click', fn, true) 
 function fn() {
 	 alert(222)
 }
 btn.removeEventListener('click', fn, true) // 移除事件

3.3 事件冒泡/事件捕获

事件冒泡:当一个对象触发了某个事件,而这个事件向自己的父级传播,由内向外,直到执行到最高的层次

事件捕获:当一个对象触发了某个事件,而这个事件会从最外层开始,由外向内,直到执行到这一事件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box1 {
            width: 300px;
            height: 300px;
            background-color: #ff3040;
        }
        #box2 {
            width: 200px;
            height: 200px;
            background-color: yellow;
        }
        #box3 {
            width: 100px;
            height: 100px;
            background-color: hsl(189, 100%, 59%);
        }
    </style>
</head>
<body>
    <div id="box1">
        <div id="box2">
            <div id="box3"></div>
        </div>
    </div>
    <script>
        var box1 = document.getElementById('box1')
        var box2 = document.getElementById('box2')
        var box3 = document.getElementById('box3')
        var boxs = [box1, box2, box3]
        for (var i = 0; i < boxs.length; i++) {
        	// addEventListener的第三个参数为true是事件捕获,false是事件冒泡  
            boxs[i].addEventListener('click', function () {
                console.log(this.id);
            })
        }
     	// 点击最内层的盒子,事件捕获依次输出box1 box2 box3,事件冒泡依次输出box3 box2 box1 
	</script>
</body>
</html>

3.4 事件委托

利用事件冒泡的特性,将自己的事件委托给父亲执行,从而减少DOM执行的次数,提高性能

target:返回触发事件的节点

<ul id="box">
  	<li>1</li>
  	<li>2</li>
  	<li>3</li>
  	<li>4</li>
</ul>
<script>
  	var box = document.getElementById('box')
  	//e 事件对象
  	box.onclick = function (e) {
    	console.log(e.target); 
    	e.target.style.backgroundColor = 'pink'
  	}
</script>

3.5 阻止事件传播方式

  • 标准方式:event.stopPropagation();
  • IE低版本:event.canaelBubble = true; 标准中已废弃

4 节点

4.1 节点属性

  • nodeType:节点的类型
    • 1:元素节点
    • 2:属性节点
    • 3:文本节点
  • nodeName:节点的名称
  • nodeValue:节点值
    • 元素节点的nodeValue始终是null

4.2 节点操作

  • 方法
名称说明
appendChild()添加子元素
insertBefore(newItem, existingItem)在元素前添加新元素,注意是父元素调用这个函数,在existingItem前添加newItem
removeChild()移除子元素
replaceChild()替换子元素
  • 创建元素

    • 通过document.write(),会重绘页面,覆盖原先代码

    • 通过innerHTML属性添加元素

    • 通过节点创建元素(推荐)

document.write('<p> hhh </p>');
document.body.innerHTML = '<p>lll</p>'; 

var div = document.createElement('div'); // 创建一个div元素
document.body.appendChild(div); // 将创建的div放到body中

4.3 节点层次

名称说明
parentNode获取父级元素
childNodes获取子节点
children获取子元素
nextSibling/previousSibling获取下一个节点
nextElementSibling/previousElementSibling获取下一个元素,有兼容性问题,IE9后支持
firstChild/lastChild获取第一个/最后一个子节点

5 补充

5.1 取消默认行为

  • 标签取消默认行为
<a href="#" id="myA">跳转</a>
<script>
    var link = document.getElementById('myA')
    link.onclick = function () {
        // 会取消默认行为,让获取的a标签不再拥有点击事件
        return false
    }
</script>
  • 事件取消默认行为:event.preventDefault()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值