JS学习第3天——Web APIs之DOM(什么是DOM,相关API【创建、增删改查、属性操作、事件操作API】)

news2024/11/28 2:38:40

目录

  • 一、Web APIs介绍
    • 1、API
    • 2、Web API
  • 二、DOM
    • 1、DOM树
    • 2、获取元素
    • 3、事件基础
    • 4、操作元素属性
    • 5、节点(node)操作
  • 三、DOM操作总结(创建、增删改查、属性操作、事件操作API)
    • 1、创建
    • 2、增
    • 3、删
    • 4、改
    • 5、查
    • 6、属性操作
    • 7、事件操作
  • 四、小案例

一、Web APIs介绍

JS的组成:ECMAScript(基础语法)、DOM(页面文档模型)和BOM(浏览器文档模型)
基础语法为后面做铺垫,Web API是JS的应用,大量使用JS基础语法做交互效果

1、API

API(应用程序编程接口Application Programming Interface):是预先定义的函数:API是给程序员提供的一种工具,帮助我们实现想要完成的功能,会用即可,不必纠结内部如何实现

2、Web API

Web API是浏览器提供的一套操作浏览器功能页面元素API(BOM和DOM)

Web API主要是针对于浏览器提供的接口,主要针对于浏览器做交互效果

Web API一般都有输入和输出(函数的传参和返回值),Web API很多都是方法(函数)

二、DOM

文档对象模型(Document Object Model):是W3C组织推荐的处理可扩展标记语言(HTML或XML)的标准编程接口

1、DOM树

在这里插入图片描述
文档:一个页面就是一个文档,DOM中使用document来表示
元素:页面中的所有标签都是元素,DOM中使用element来表示
节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示
DOM把以上内容都看做是对象,DOM在实际开发中主要用来操作元素

2、获取元素

《1》根据ID获取

document.getElementById('id');

使用console.dir()可以打印我们获取的元素对象,更好的查看对象里面的属性和方法。

《2》根据标签名获取
getElementByTagName()方法可以返回带有指定标签名的对象的集合

document.getElementByTagName('标签名');

注意:
得到的是一个对象集合,想要操作里面的元素就需要遍历
得到元素对象是动态的
如果获取不到元素,则返回空的伪数组(因为获取不到对象)

还可以获取某个元素的所有指定标签名的子元素

element.getElementByTagName('标签名');

注意:父元素必须是单个对象(必须指明是哪一个元素对象),获取时不包括父元素自己

<div>
  <p>1111</p>
  <p>222</p>
  <p>333</p>
</div>

<script>
	var div = document.getElementsByTagName("div");
	var a = div[0].getElementsByTagName("p");
	console.log(a);
	console.dir(a);
</script>

《3》HTML5新增

document.getElementByClassName('类名');   // 根据类名返回元素对象集合
document.querySelector('选择器'); // 根据指定选择器返回第一个元素
document.querySelectorAll('选择器'); // 根据指定选择器返回

注意:querySelector和querySelectorAll里面的选择器需要加符号

《4》特殊元素获取
获取body元素和获取html元素

document.body;  // 返回body元素对象
document.documentElement  // 返回html元素对象

3、事件基础

JS使我们有能力创造动态页面,而事件是可以被JS侦测到的行为。(触发–响应机制)
常见的鼠标事件

鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

4、操作元素属性

DOM操作可以改变页面内容、结构和样式

《1》改变元素内容

element.innerText; // 去掉html标签、空格和换行
element.innerHTML  // 包括html,同时保留空格和换行

《2》常用元素的属性操作

innerText、innerHTML、src、href、id、alt、title

《3》表单元素的属性操作

type、value、checked、selected、disabled

《4》样式属性操作
可以通过 JS 修改元素的大小、颜色、位置等样式
JS 修改 style 样式操作,产生的是行内样式,CSS 权重比较高

element.style   // 行内样式操作
element.className  // 类名样式操作

注意:
如果样式修改较多,可以采取操作类名方式更改元素样式
className 会直接更改元素的类名,会覆盖原先的类名
在这里插入图片描述
《5》自定义属性的操作

① 获取属性

element.属性  // 获取内置属性
element.getAttribute('属性')  // 获得自定义的属性

② 操作属性值

element.属性 = '值'
element.setAttribute('属性','值')  // 设置自定义属性值

③ 移除属性

element.removeAttribute('属性')

《6》H5自定义属性
自定义属性目的:是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
H5规定自定义属性data-开头做为属性名并且赋值。
① 兼容性获取 element.getAttribute(‘data-index’);
② H5新增 element.dataset.index 或者 element.dataset[‘index’] IE11才开始支持

5、节点(node)操作

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个
基本属性。
元素节点 nodeType 为 1,属性节点 nodeType 为 2,文本节点 nodeType 为 3(文本节点包含文字、空格、换行等)

在实际开发中,节点操作主要操作的是元素节点

DOM 树把节点划分为不同的层级关系,常见的是父子兄层级关系
《1》父级节点

node.parentNode   

注意:返回某节点的父节点,是最近的一个父节点,如果指定的节点没有父节点则返回null

《2》子节点
① 第一种:

parentNode.childNodes(标准)  // 返回包含指定节点的子节点的集合,该集合为即时更新的集合

parentNode.firstChild  // 返回第一个子节点,找不到返回null,包含所有的节点
parentNode.lastChild  // 返回最后一个子节点,找不到返回null,包含所有的节点

注意:返回值里面包含了所有的子节点,包含元素节点,文本节点等
如果只想要获得里面的元素节点,则需要专门处理。所以一般不提倡使用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.children(非标准)   // 是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回 

// 以下两方法IE9以上才支持
parentNode.firstElementChild  // 返回第一个子元素节点,找不到返回null
parentNode.lastElementChild // 返回最后一个子元素节点,找不到返回null

想要得到第一个或最后一个子元素节点,实际开发中解决方案:
1. 如果想要第一个子元素节点,可以使用 parentNode.chilren[0]
如果想要最后一个子元素节点,可以使用parentNode.chilren[parentNode.chilren.length - 1]

《3》兄弟节点

node.nextSibling  //  返回当前元素的下一个兄弟元素节点,找不到返回null,包含所有的节点
node.previousSibling // 返回当前元素的上一个兄弟元素节点,找不到返回null,包含所有的节点

// IE9以上支持
node.nextElementSibling // 返回当前元素下一个兄弟元素节点
node.previousElementSibling // 返回当前元素上一个兄弟节点

兼容性问题解决方案

// 封装一个兼容性的函数
function getNextElementSibling(element) {
	var el = element;
	while (el = el.nextSibling) {
		if (el.nodeType === 1) {
			return el;
		}
	}
	return null;
} 

《4》创建节点(动态创建元素节点)

document.createElement('tagName');

《5》添加节点

node.appendChild(child)  // 将一个节点添加到指定父节点的子节点列表的末尾(类似于css里面的after伪元素)
node。insertBefore(child,指定元素) // 添加到父节点的指定子节点前面(类似于的before伪元素)

《6》删除节点

node.removeChild(child)  // 返回删除的节点

《7》复制节点

node.cloneNode()  // 法返回调用该方法的节点的一个副本

注意:
① 如果括号参数为空或者为 false ,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
② 如果括号参数为 true ,则是深度拷贝,会复制节点本身以及里面所有的子

《8》三种动态创建元素的区别

方法特点
document.write()直接将内容写入页面的内容流,但是文档执行完毕,则会导致页面全部重绘
element.innerHTML()将内容写入某某个DOM节点,页面不重绘,创建多个元素效率更高(不要拼接字符串,采用数组形式拼接),结构稍微复杂
document.createElement()创建多个元素效率低一些,但是结构更清晰

三、DOM操作总结(创建、增删改查、属性操作、事件操作API)

为了能够使JS操作HTML,JS有一套自己的DOM编程接口;对于HTML来说,DOM使html形成了一颗DOM树

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

1、创建

document.write
innerHTML
createElement

2、增

appendChild
insertBefore

3、删

removeChild

4、改

src、href、title等  // 修改元素属性
innerHTML、innerText  //  修改普通元素内容
value、type、disable等  // 修改表单元素
style、className // 修改元素样式

5、查

getElementById、getElementsByTagName // DOM提供的API方法,不推荐
querySelector、querySelectorAll // H5新增,提倡
parentNode(父)、children(子)、previousElementSibling、nextElementSibling(兄)// 利用节点获取元素,提倡

6、属性操作

setAttribute	// 设置dom的属性值
getAttribute	// 得到dom的属性值
removeAttribute  // 移出属性

7、事件操作

鼠标事件触发条件
onclick鼠标点击左键触发
onmouseover鼠标经过触发
onmouseout鼠标离开触发
onfocus获得鼠标焦点触发
onblur失去鼠标焦点触发
onmousemove鼠标移动触发
onmouseup鼠标弹起触发
onmousedown鼠标按下触发

四、小案例

(添加/删除留言)

<!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">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            padding: 100px;
        }
        
        textarea {
            width: 200px;
            height: 100px;
            border: 1px solid pink;
            outline: none;
            resize: none;
        }
        
        ul {
            margin-top: 50px;
        }
        
        li {
            width: 300px;
            padding: 5px;
            background-color: rgb(245, 209, 243);
            color: red;
            font-size: 14px;
            margin: 15px 0;
        }
        
        li a {
            float: right;
        }
    </style>
</head>

<body>
    <textarea name="" id=""></textarea>
    <button>发布</button>
    <ul>

    </ul>
    <script>
        // 1. 获取元素
        var btn = document.querySelector('button');
        var text = document.querySelector('textarea');
        var ul = document.querySelector('ul');
        // 2. 注册事件
        btn.onclick = function() {
            if (text.value == '') {
                alert('您没有输入内容');
                return false;
            } else {
                // console.log(text.value);
                // (1) 创建元素
                var li = document.createElement('li');
                // 先有li 才能赋值
                li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";
                // (2) 添加元素
                // ul.appendChild(li);
                ul.insertBefore(li, ul.children[0]);
                // (3) 删除元素 删除的是当前链接的li  它的父亲
                var as = document.querySelectorAll('a');
                for (var i = 0; i < as.length; i++) {
                    as[i].onclick = function() {
                        // node.removeChild(child); 删除的是 li 当前a所在的li  this.parentNode;
                        ul.removeChild(this.parentNode);
                    }
                }
            }
        }
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/372709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[QCustomPlot] QCPBar绘制柱状图并同时显示柱状图的值

前言 博主在使用 qcustomplot 绘制柱状图时&#xff0c;发现网络上的教程。大都忽略了一个重要的点就是。柱状图没有明显显示出当前的值。经过博主寻找后发现在 qcustomplot 论坛中已经有了对应的解决方案。所以记录一下。qcustomplot论坛 代码 void MainWindow::drawBars()…

【N32WB03x SDK使用指南】

【N32WB03x SDK使用指南】1. 简介1.1 产品简介1.2 主要资源1.3 典型应用2. SDK/开发固件文件目录结构2.1 doc2.2 firmware2.3 middleware2.4 utilities2.5 projects Projects3. 项目配置与烧录3.1 编译环境安装3.2 固件支持包安装3.3 编译环境配置3.4 编译与下载3.5 BLE工程目录…

Vue.js基础特性、生命周期及常用指令

目录 一、Vue构造选项 el根标签 data数据对象 methods定义方法 二、生命周期 三、常用指令 一、Vue构造选项 选项说明el唯一根标签&#xff0c;决定Vue实例会管理哪一个DOM节点dataVue实例对应的数据对象methods定义Vue实例的方法&#xff0c;可以在其他地方调用&#x…

慢SQL出现原因、优化、开启慢查询日志

文章目录慢SQL:出现原因&#xff1a;解决方式&#xff1a;开启慢查询日志&#xff1a;慢SQL: 出现原因&#xff1a; &#xff08;1&#xff09;数据库表索引设置不合理 &#xff08;2&#xff09;SQL语句有问题&#xff0c;需要优化 解决方式&#xff1a; &#xff08;1&am…

Java 抽象类和接口

文章目录一、抽象类1. 抽象类定义2. 抽象类成员特点二、接口1. 接口概述2. 接口成员特点3. 类和接口的关系4. 抽象类和接口的区别5. 接口案例三、形参和返回值一、抽象类 1. 抽象类定义 在 Java 中&#xff0c;一个没有方法体的方法应该定义为抽象方法&#xff0c;而类中如果…

现在转行做程序员的多吗?

曾经有一名程序员说&#xff0c;他在编写程序时&#xff0c;就像一个发明家在做实验&#xff1b;当他把程序编好可以运行时&#xff0c;他就已经是个发明家了。 程序员作为众多转行人员首选的职业&#xff0c;也是被大众熟知了。但我们需要知道的不仅是它作为一个职业的定义&a…

Spring超级全家桶,学完绝对是惊艳面试官的程度

前言Spring框架自2002年诞生以来一直备受开发者青睐&#xff0c;它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。有人亲切的称之为&#xff1a;Spring 全家桶。很多研发人员把spring看作心目中最好的java项目&#xff0c;没有之一。所以这是重点…

AtCoder Beginner Contest 290 G. Edge Elimination(思维题 枚举+贪心)

题目 T(T<100)组样例&#xff0c;每次给出一棵深度为d的k叉树&#xff0c; 其中&#xff0c;第i层深的节点个数为 保证k叉树的所有节点个数tot不超过1e18&#xff0c; 求在k叉树上构建一棵大小恰为x的连通块&#xff0c;所需要断开的最少的树边的条数(x<tot<1e18)…

VScode远程连接服务器-过程试图写入的管道不存在-could not establist connection to【已解决】

问题描述 使用服务器的过程中突然与服务器断连&#xff0c;报错如下&#xff1a;could not establist connection to [20:23:39.487] > ssh: connect to host 10.201.0.131 port 22: Connection timed out > [20:23:39.495] > 过程试图写入的管道不存在。 > [20…

hook与mixin

看完vue3就开始看vue3的源码&#xff0c;表示很懵~ 刚把rollup打包搞完&#xff0c;这不响应式就接着来了&#xff01;&#xff0c;还是写篇直接使用vue3的博客清清脑吧&#xff01; 什么是hook、mixin&#xff1f; mixin: Vue2中多个组件内存在重复JS业务逻辑&#xff0c;使…

JavaScript 闭包【自留】

闭包的概念理解 闭包的定义 ✅ 这里先来看一下闭包的定义&#xff0c;分成两个:在计算机科学中和在JavaScript中。 ✅ 在计算机科学中对闭包的定义(维基百科): 闭包(英语:Closure)&#xff0c;又称词法闭包(Lexical Closure)或函数闭包(function closures);是在支持头等函数…

QT之OpenGL模板测试

QT之OpenGL模板测试1. 概述2. 使用步骤及函数介绍3. Demo4. 参考1. 概述 当片段着色器处理完一个片段之后&#xff0c;模板测试(Stencil Test)会开始执行&#xff0c;和深度测试一样&#xff0c;它可能会丢弃片段。被保留下来的片段会进入深度测试。 一个模板缓冲中&#xff…

Web Spider Babel安装 Ast抽象语法 - 基本使用

文章目录一、资源地址二、遍历2.1 树结构遍历模式2.2 案例三、下载安装四、案例操作总结提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、资源地址 Ast反混淆语法在线网址&#xff1a;https://astexplorer.net Babel官方文档&#xff1a;https://ww…

玩转Linux内核进程调度,这一篇就够(所有的知识点)

一&#xff0c;进程的分类 在 CPU 的角度看进程行为的话&#xff0c;可以分为两类&#xff1a; CPU 消耗型&#xff1a;此类进程就是一直占用 CPU 计算&#xff0c;CPU 利用率很高IO 消耗型&#xff1a;此类进程会涉及到 IO&#xff0c;需要和用户交互&#xff0c;比如键盘输…

性能测试流程

性能测试实战一.资源指标分析1.判断CPU是否瓶颈的方法2.判断内存是否瓶颈的方法3.判断磁盘I/O是否瓶颈的方法4.判断网络带宽是否是瓶颈的方法二.系统指标分析三.性能调优四.性能测试案例1.项目背景2.实施规划&#xff08;1&#xff09;需求分析&#xff08;2&#xff09;测试方…

Faster-Rcnn修改转数据集文件

目录 学习python的一些基础知识 argparser assert关键字 让你秒懂Python 类特殊方法__getitem__ lxml.etree.fromstring的使用 统计一下json文件内的种类 正脸红外光 正脸-混合红外光 正脸-交叉偏振光 正脸-平行偏振光 正脸-紫外光 正脸-棕色光 调用mydataset可视化…

我的 System Verilog 学习记录(5)

、 引言 本文简单介绍 System Verilog 语言的 控制流。 前文链接&#xff1a; 我的 System Verilog 学习记录&#xff08;1&#xff09; 我的 System Verilog 学习记录&#xff08;2&#xff09; 我的 System Verilog 学习记录&#xff08;3&#xff09; 我的 System Ver…

算法课堂-分治算法

分治算法 把一任务分成几部分&#xff08;通常是两部分&#xff09;来完成&#xff08;或只完成一部分&#xff09;&#xff0c;从而实现整个任务的完成 或者你可以把递归理解为分治算法的一部分 因为递归就是把问题分解来解决问题 例子 称假币 最笨的方法&#xff1a;两两称…

(三十六)大白话数据库幻读,本质到底是个什么问题?

上一讲我们给大家讲解了不可重复读这个问题&#xff0c;这个问题简单来说&#xff0c;就是一个事务多次查询一条数据&#xff0c;结果每次读到的值都不一样&#xff0c;这个过程中可能别的事务会修改这条数据的值&#xff0c;而且修改值之后事务都提交了&#xff0c;结果导致人…

多变量线性回归模型

多变量线性回归模型 模型参数为n1维向量&#xff0c;此时模型公式为 hθ(x)θ0x0θ1x1θ2x2...θnxnh_{\theta}(x)\theta_{0}x_{0}\theta_{1}x_{1}\theta_{2}x_{2}...\theta_{n}x_{n} hθ​(x)θ0​x0​θ1​x1​θ2​x2​...θn​xn​ 可以简化为 hθ(x)θTXh_{\theta}(x)\th…