前端学习日志-day23

目录

今日学习日志

一、元素节点操作

(一)删除节点

(二)复制节点

二、重点案例:动态生成表格

(一)需求

(二)核心步骤

三、动态创建元素的区别

四、DOM 核心总结

(一)DOM 基础概念

(二)元素操作

(三)属性操作(自定义属性)

(四)事件基础

五、事件注册与解绑

(一)注册方式

(二)解绑方式

六、DOM 事件流

(一)概念

(二)三个阶段

(三)代码中的体现

七、事件对象

(一)概念

(二)常用属性与方法

八、事件委托

(一)概念

(二)核心应用

九、鼠标事件扩展

(一)特殊鼠标事件

(二)鼠标事件对象属性(MouseEvent)

今日练习代码

代码展示:

实现效果:让小天使跟随鼠标走


今日学习日志

一、元素节点操作

(一)删除节点

  • 语法:Node.removeChild(child),需指定要删除的子节点。
  • 补充:a标签href设为javascript:;时,点击不会跳转。

(二)复制节点

  • 语法:node.cloneNode(flag)flag决定复制方式:
    • 浅拷贝:flagnullfalse,仅复制标签结构,不复制内容。
    • 深拷贝:flagtrue,复制标签结构及内部所有内容。

二、重点案例:动态生成表格

(一)需求

动态生成表格tbody中的trtd、内容及删除链接athead内容固定。

(二)核心步骤

  1. 准备数据:创建数组datas,元素为存储表格数据的对象。
  2. 创建tr:通过for循环,根据datas.length确定tr数量并创建添加。
  3. 创建td与填充内容:用for...in遍历对象属性,创建td,通过td.innerHTML = datas[i][k]填充数据(k为对象属性)。
  4. 添加删除单元格:在tr循环内最后创建td,设置td.innerHTML = "<a href='javascript:;'>删除</a>"
  5. 实现删除功能:获取所有a元素,绑定点击事件,通过tbody.removeChild(this.parentNode.parentNode)删除当前a所在的tr

三、动态创建元素的区别

创建方式特点适用场景
document.write()文档加载完成后调用会导致页面重绘,灵活性低极少使用
Element.innerHTML用数组拼接元素字符串再赋值,效率高批量创建元素场景
document.createElement('元素')需逐个创建元素,效率稍慢需精细控制单个元素创建过程

四、DOM 核心总结

(一)DOM 基础概念

  • 定义:文档对象模型,可通过接口修改网页结构、样式、内容。
  • DOM 树结构:包含document(网页对象)、element(元素 / 标签对象)、node(所有内容节点,如文本、属性等)。

(二)元素操作

  1. 创建document.write()Element.innerHTMLdocument.createElement()
  2. 增加(子节点)node.appendChild(子节点)(添加到末尾)、Node.insertBefore(新节点, 参考节点)(插入到参考节点前)。
  3. 删除(子节点)Node.removeChild(子节点)
  4. 修改
    • 内容:innerHTML(支持 HTML 标签)、innerText(仅纯文本)。
    • 常规属性:hrefa标签)、srcimg标签)、titlealtid
    • 表单属性:typevaluechecked(复选框 / 单选框)、selected(下拉框)、disabled(禁用)。
    • 样式:style(行内样式,如element.style.color = 'red')、className(修改样式类名,覆盖原有类)。
  5. 查找
    • 方法:getElementById()(按 ID,唯一)、getElementsByClassName()(按类名,返回集合)、getElementsByTagName()(按标签名,返回集合)、querySelector()(按选择器,返回第一个匹配元素)、querySelectorAll()(按选择器,返回所有匹配元素集合)。
    • 节点关系:parentNode(父节点)、children(子元素节点集合)、nextElementSibling(下一个兄弟元素节点)、previousElementSibling(上一个兄弟元素节点)。

(三)属性操作(自定义属性)

  • 获取:getAttribute(属性名)dataset.属性后缀(如data-iddataset.id获取,不常用)。
  • 创建:setAttribute(属性名, 属性值)
  • 删除:removeAttribute(属性名)

(四)事件基础

  • 绑定语法:事件源.事件类型 = 事件处理程序
  • 常用鼠标事件:
事件类型触发条件
onclick鼠标左键点击
onmouseover鼠标经过元素
onmouseout鼠标离开元素
onfocus元素获得鼠标焦点(如输入框)
onblur元素失去鼠标焦点
onmousemove鼠标在元素内移动
onmouseup鼠标按键弹起
onmousedown鼠标按键按下

五、事件注册与解绑

(一)注册方式

  1. 传统方式
    • 语法:事件源.事件类型 = 事件处理函数
    • 局限:同一元素同一事件只能绑定一个处理函数,后续绑定会覆盖前者。
  2. 方法监听方式
    • 语法:eventTarget.addEventListener('type', 处理函数, useCapture)
    • 参数:type(事件类型,无需加on,如'click')、处理函数(匿名或命名函数)、useCapture(布尔值,true为捕获阶段,false/ 默认为冒泡阶段)。
    • 优势:同一元素同一事件可绑定多个处理函数,按绑定顺序执行。

(二)解绑方式

  1. 传统方式事件源.事件类型 = null
  2. 方法监听方式
    • 要求:处理函数必须为命名函数(匿名函数无法解绑)。
    • 语法:先绑定eventTarget.addEventListener('type', fn),再在处理函数内执行事件源.removeEventListener('type', fn)

六、DOM 事件流

(一)概念

页面接收事件的传播顺序,分为三个阶段,事件会从外到内再到外传播。

(二)三个阶段

  1. 捕获阶段:从document开始,逐层传播到目标事件节点(从外到内)。
  2. 当前目标阶段:事件到达目标节点,触发目标节点的事件处理函数。
  3. 冒泡阶段:从目标节点逐层传播回document(从内到外),是最常用的阶段。

(三)代码中的体现

  • 传统注册方式:仅支持冒泡阶段。
  • 方法监听方式:通过useCapture控制阶段,true为捕获,false/ 默认为冒泡。

七、事件对象

(一)概念

事件触发时自动生成的对象,存储事件相关信息(属性、方法),在处理函数中通过参数接收(如function(e){},参数名可设为eventevte)。

(二)常用属性与方法

  • e.target:返回触发事件的具体元素(如点击ul内的li,返回li)。
  • this:返回绑定事件的元素(如ul绑定事件,点击lithis返回ul)。
  • e.type:返回事件类型(如'click''mouseover')。
  • e.stopPropagation():阻止事件冒泡(避免事件传播到父节点)。
  • e.preventDefault():阻止事件默认行为(如阻止a标签跳转、表单默认提交)。

八、事件委托

(一)概念

无需给每个子节点绑定事件,而是将事件绑定到父节点,利用事件冒泡,当子节点触发事件时,事件传播到父节点执行处理函数。

(二)核心应用

通过e.target获取触发事件的子节点,实现对子节点的统一事件处理(如批量处理列表项的点击事件)。

九、鼠标事件扩展

(一)特殊鼠标事件

  • contextmenu:触发上下文菜单(如右键菜单),可通过e.preventDefault()取消。
  • selectstart:开始选中文本时触发,可通过e.preventDefault()禁止文本选中。

(二)鼠标事件对象属性(MouseEvent

  • e.clientX/e.clientY:获取鼠标在浏览器可视区的 X/Y 坐标(不包含滚动距离)。
  • e.pageX/e.pageY:获取鼠标在整个页面的 X/Y 坐标(包含滚动距离)。
  • e.screenX/e.screenY:获取鼠标在电脑屏幕的 X/Y 坐标。

今日练习代码

代码展示:

<!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>
        img {
            position: absolute;
            cursor: none;
        }
    </style>
</head>

<body>
    <img src="images/angel.gif" alt="">
    <script>
        var img = document.querySelector('img');
        //移动的天使:先要给图片设置绝对定位,先设置document的mousemove事件,事件处理函数内容为:获取pagex和y赋值给x和y,把img的left和top设置成x和y记得加px 如果需要居中则可以实现 -50 -40
        document.addEventListener('mousemove', function (e) {
            var x = e.pageX;
            var y = e.pageY;
            img.style.left = x - 50 + 'px';
            img.style.top = y - 40 + 'px';
        })
    </script>
</body>

</html><!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>
        img {
            position: absolute;
            cursor: none;
        }
    </style>
</head>

<body>
    <img src="images/angel.gif" alt="">
    <script>
        var img = document.querySelector('img');
        //移动的天使:先要给图片设置绝对定位,先设置document的mousemove事件,事件处理函数内容为:获取pagex和y赋值给x和y,把img的left和top设置成x和y记得加px 如果需要居中则可以实现 -50 -40
        document.addEventListener('mousemove', function (e) {
            var x = e.pageX;
            var y = e.pageY;
            img.style.left = x - 50 + 'px';
            img.style.top = y - 40 + 'px';
        })
    </script>
</body>

</html>

实现效果:让小天使跟随鼠标走

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值