Web API(三)节点操作和事件绑定

Web API(三)节点操作和事件绑定

一、节点操作

1、移除节点

父元素.removeChild(子元素)

node.removeChild() 方法从 node节点中删除一个子节点,返回删除的节点。

2、复制节点

元素.cloneNode()

  • 括号中参数为空或者为false,是浅拷贝,即只是克隆复制节点本身,不克隆里面的子节点。
  • 如果括号中参数为true,则是深度拷贝,会复制节点本身以及里面的所有子节点。
  • 重点案例:动态生成表格
    <script>
        // 1.先去准备好学生的数据
        var datas = [{
            name: '魏璎珞',
            subject: 'JavaScript',
            score: 100
        }, {
            name: '弘历',
            subject: 'JavaScript',
            score: 98
        }, {
            name: '傅恒',
            subject: 'JavaScript',
            score: 99
        }, {
            name: '明玉',
            subject: 'JavaScript',
            score: 88
        }, {
            name: '大猪蹄子',
            subject: 'JavaScript',
            score: 0
        }];
        // 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行
        var tbody = document.querySelector('tbody');
		// 遍历数组
        for (var i = 0; i < datas.length; i++) { 
            // 1. 创建 tr行
            var tr = document.createElement('tr');
            tbody.appendChild(tr);
            // 2. 行里面创建单元格td 单元格的数量取决于每个对象里面的属性个数  
            // 使用for in遍历学生对象
            for (var k in datas[i]) { 
                // 创建单元格 
                var td = document.createElement('td');
                // 把对象里面的属性值 datas[i][k] 给 td  
                td.innerHTML = datas[i][k];
                tr.appendChild(td);
            }
            // 3. 创建有删除2个字的单元格 
            var td = document.createElement('td');
            td.innerHTML = '<a href="javascript:;">删除 </a>';
            tr.appendChild(td);

        }
        // 4. 删除操作 开始 
        var as = document.querySelectorAll('a');
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function() {
                // 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)  
                tbody.removeChild(this.parentNode.parentNode)
            }
        }
    </script>

3、创建元素的三种方式

innerHTML

document.createElement(标签名)

(了解) document.write() 特点:文档加载完成后调用,会导致页面重绘,即所有内容清空

4、innerTHML和createElement效率对比

  • (了解) innerHTML 和 createElement 两种创建元素方法的效率比较

​ 1. 当数据量比较大的时候,innerHTML 拼接字符串,耗时更长,效率较低

​ 2. innerHTML 以数组拼接的方法创建元素,会大大提升绘制效率

  • 原因:字符串在 js 中存储的不可变性,字符串拼接会导致栈内存占用过高影响查询效率;而数组存放在堆内存中,不会影响栈的查询效率 (记住结论)

统计代码的执行时间:

  • console.time(名字)
  • console.timeEnd(名字)

二、 DOM的核心总结

关于dom操作,我们主要针对于元素的操作。主要有创建、增、删、改、查、属性操作、事件操作。

1、创建

在这里插入图片描述

2、增加

在这里插入图片描述

3、删

在这里插入图片描述

4、改

在这里插入图片描述

5、查

在这里插入图片描述

6、属性操作

在这里插入图片描述

7、事件操作(重点)

三、JS事件高级

1、监听注册事件

element.addEventListener(type, listener[, useCapture])

​ 参数:

​ (1) type 事件类型,不用加 on, ‘click’, ‘mouserover’

​ (2) listener 监听器,即事件处理函数

​ (3) useCapture 是否使用捕获模式,默认是 false

注意事项:

​ 1. addEventListener 中的事件类型 type,不用加 on

​ 2. onclick 由于是赋值属性的绑定方式,只能为元素上的一种事件添加一个处理函数

​ 3.addEventListener 可以为同一元素添加不同的监听器(事件处理函数),并支持冒泡和捕获

2、 IE9 以下绑定事件的方法(了解)

​ element.attachEvent(ontype, fn)

3、删除事件(解绑事件)

  1. 传统方式绑定:element.onclick = fn

​ ==> 删除方法:element.onclick = null

​ 2. 添加事件监听方式:element.addEventListener(type, listener)

​ ==> 删除方法:element.removeEventListener(type, listener)

​ 3. (了解) IE 浏览器事件绑定:element.attachEvent(type, fn)

​ ==> 删除方法:element.dispatchEvent(type, fn)

​ 注意:事件监听方式删除事件,监听器必须抽取出来使用单独的函数名或变量名才能移除

4、DOM事件流

  • 事件流理解

​ 元素触发事件后,事件会在目标元素与根节点(document)之间的路径传播,

​ 这个传播的顺序称之为事件流

  • 根据先后顺序分为 3 个阶段 (顺序固定不变的)

​ 1. 捕获阶段

​ 2. 目标阶段

​ 3.冒泡阶段(重点!!)

四、事件对象

1、定义:

事件处理函数的第一个形参,一般使用 e 命名,系统在事件触发时,把当前事件相关的具体信息

​ 封装成一个对象传入, 如:触发的元素、触发的方式、触发的位置坐标等

2、事件对象的兼容性

​ IE6~8 中的事件对象通过 window.event 获取事件对象

​ 注意:事件对象是系统内置封装的, 我们直接定义好就可以直接使用了

3、事件对象的属性和方法

  • 事件的触发类型:e.type
  • 事件的触发的具体元素:e.targe this事件的绑定者

target 属性和 this 的区分:

​ 1. e.target 指向当前事件的触发者,不一定是事件的绑定元素

​ 2. this 始终指向事件的绑定者

4、阻止事件的默认行为: (链接跳转, 表格提交…)

e.preventDefault()

5、阻止事件冒泡

e.stopPropagation();

6、事件委托

原理:给父元素注册事件,利用事件冒泡,当子元素的事件触发,会冒泡到父元素,然后去控制相应的子元素。

事件委托的作用
  • 我们只操作了一次 DOM ,提高了程序的性能。
  • 动态新创建的子元素,也拥有事件。

7、常用鼠标事件

  1. 鼠标右键事件: contextmenu

​ 2. 鼠标选中事件:selectstart

​ 3. 鼠标双击事件:dblclick

​ 4. 鼠标按下事件:mousedown

​ 5. 鼠标松开事件:mouseup

​ 6. 鼠标滚轮事件:wheel

​ 7. 鼠标移动事件:mousemove

​ 8. 鼠标经过事件:mouseover

​ 9. 鼠标离开事件:mouseout

​ 10.鼠标单击事件;click

<div>Hello Itcast</div>

    <script>
        var div = document.querySelector('div');
        // 鼠标右键事件
        div.addEventListener('contextmenu', function(e) {
                e.preventDefault();
            })
            // 鼠标选中事件
        div.addEventListener('selectstart', function(e) {
                e.preventDefault();
            })
            // 鼠标双击事件
        div.addEventListener('dblclick', function() {
                console.log('456');
            })
            // 鼠标单击事件
        div.addEventListener('click', function() {
                console.log('123');
            })
            // 鼠标按下事件
        div.addEventListener('mousedown', function() {
                console.log('按下了');
            })
            // 鼠标松开事件,松开之后,会触发单击事件
        div.addEventListener('mouseup', function() {
                console.log('松开了');
            })
            // 鼠标滚轮事件
        document.addEventListener('wheel', function(e) {
            console.log(e.deltaY > 0 ? '向下滚动' : '向上滚动');
        })
        document.addEventListener('mousemove', function(e) {
            console.log('移动了');
        })
        document.addEventListener('mouseover', function(e) {
            console.log('经过了');
        })
        document.addEventListener('mouseout', function(e) {
            console.log('离开了');
        })

8、获取鼠标位置

  1. (重点)e.pageX 和 e.pageY: 返回鼠标相对整个页面左上角的位置坐标

​ 2. e.clientX 和 e.clientY: 返回鼠标在可视区域的左上角位置坐标

​ 3. e.screenX 和 e.screenY:返回鼠标在电脑屏幕中的位置坐标

​ 注意:返回的坐标值都是数字类型,不带单位 px 的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱对恨错

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值