Web APIs——DOM

news2024/12/22 20:40:37

JS 的组成

image-20220615154202085

Web API
Web API 是浏览器提供的一套操作浏览器功能和页面元素的 API ( BOM 和 DOM )。
现阶段我们主要针对于浏览器讲解常用的 API , 主要针对浏览器做交互效果。
比如我们想要浏览器弹出一个警示框, 直接使用 alert(‘弹出’)
MDN 详细 API : https://developer.mozilla.org/zh-CN/docs/Web/API
因为 Web API 很多,所以我们将这个阶段称为 Web APIs

什么是DOM?

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

W3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。

① 对于JavaScript,为了能够使JavaScript操作HTML,JavaScript就有了一套自己的DOM编程接口。

② 对于HTML,DOM使得HTML形成一棵DOM树,包括文档、元素、节点。我们获取过来的DOM元素是一个对象(object),所以称为文档对象模型。

  • 文档:一个页面就是一个文档,DOM中使用document表示
  • 元素:页面中的所有标签都是元素,DOM中使用element表示
  • 节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM中使用node表示

DOM把以上内容都看作是对象。

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

1. 创建

  • document.write()
  • element.innerHTML
  • document.createElement()

三种动态创建元素的区别:

① document.write是直接将内容写入页面的内容流,但是页面文档流加载完毕,再调用这句话会导致页面全部重绘。

② innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘。

③ innerHTML创建多个元素效率更高(不要拼接字符串,而是采取数组形式拼接好后再赋值给innerHTML),结构稍微复杂

④ createElement()创建多个元素效率稍微低一点点,但是结构更清晰。

总结:不同浏览器下,innerHTML(以数组形式拼接的方式)效率要比createElement高。

2. 增

① node.appendChild(child); 该方法将一个节点添加到指定父节点的子节点列表末尾。类似于CSS里面的after伪元素。

② node.insertBefore(child, 指定元素); 该方法将一个节点添加到父节点的指定子节点前面。类似于CSS里面的before伪元素。

3. 删

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

4. 改

JavaScript的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性表单的值等。

① 修改元素属性:src、href、id、alt、title等

<script>
    // 修改元素属性
    // 1. 获取元素
    var ldh = document.getElementById('ldh');
    var zxy = document.getElementById('zxy');
    var img = document.querySelector('img');
    // 2. 注册事件  处理程序
    zxy.onclick = function() {
        img.src = 'images/zxy.jpg';
        img.title = '张学友';
    }
    ldh.onclick = function() {
        img.src = 'images/ldh.jpg';
        img.title = '刘德华';
    }
</script>

② 修改普通元素内容:

  • element.innerText:从起始位置到终止位置的内容,但它去除html标签,同时空格和换行也会去掉。
  • element.innerHTML:起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行。

innerText与innerHTML的区别:innerText不识别html标签,非标准;innerHTML识别html标签,W3C标准,保留空格和换行。这两个属性是可读写的,可以获取元素里面的内容。

③ 修改表单元素:type、value、checked、selected、disabled等

④ 修改元素样式:

  • element.style  行内样式操作。该方式获得修改元素样式,如果样式比较少或者功能简单的情况下使用。
  • element.className  类名样式操作。 当样式比较多或功能复杂的时候,可以通过修改className来更改元素的样式。

例如:element.className = 'new';  如果想要保留原先的类名,可以这样改:element.className = 'old new';(中间用空格隔开)

注意:

  • JS里面的样式采取驼峰命名法,比如 fontSize、backgroundColor
  • JS修改style样式操作,产生的是行内样式,css权重比较高

排他思想:如果有同一组元素,我们想要某一个元素实现某种样式,需要用到循环的排他思想算法,分为以下四步:

  • 获取元素
  • 为每个元素添加相应事件(for循环)
  • 所有元素全部清除样式(干掉其他人,本质也是需要循环遍历)

给当前元素设置样式(留下我自己)

      // 1.获取元素
      let lis = document.querySelectorAll('li')
      // 2.遍历伪数组,为其中的每个元素绑定单击事件
      for (let i = 0; i < lis.length; i++) {
        lis[i].addEventListener('click', function() {

          // 3.1 找到当前有active样式的li元素,清除它的active样式
          // li.active:交集选择器:要求它是li元素的同时还要拥有active样式
          document.querySelector('li.active').classList.remove('active')

          // 3.2 为当前元素添加active样式
          // lis[i].classList.add('active')
          this.classList.add('active')
        })
      }

5. 查

获取页面中查询DOM的元素可以使用以下几种方式:

① DOM提供的API方法(这些用法太古老,不太推荐):

  • 根据ID获取:document.getElementById(id);
  • 根据标签名获取:

    document.getElementsByTagName('tag name');

    element.getElementsByTagName('tag name');  可以得到这个元素里面的某些标签

② HTML5提供的新方法提倡):

  • 根据类名获得某些元素集合:document.getElementsByClassName('class name');
  • 指定选择器的第一个元素对象,注意,里面的选择器需要加符号:'.box'  '#an' 等:document.querySelector('.box');
  • 指定选择器的所有元素对象集合:document.querySelectorAll('.box');

③ 利用节点操作获取元素提倡):利用父子兄层级关系获取元素逻辑性强,但是兼容性差。在DOM树中,节点使用node来表示。

HTML的DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

  • 元素节点  nodeType 为1
  • 属性节点  nodeType 为2
  • 文本节点  nodeType 为3(文本节点包含文字、空格、换行等)

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

利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。

  • 父级节点:node.parentNode     ,可返回某节点的父节点,注意是最近的一个父节点。如果指定的节点没有父节点则返回null。
  • 子节点:

  1) parentNode.childNodes(标准),返回包含指定节点的子节点的集合,该集合为即使更新的集合。注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。如果只想要获得里面的元素节点,则需要专门处理。所以一般不提倡使用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]);
        }
}

  2) parentNode.children(非标准),是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(重点)。虽然children是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用。

  3) parentNode.firstChild,firstChild返回第一个子节点,找不到则返回null。

  4) parentNode.lastChild返回最后一个子节点,找不到则返回null。

  5) parentNode.firstElementChild返回第一个子元素节点,找不到则返回null。该方法有兼容性问题,IE9以上才支持。

  6) parentNode.lastElementChild返回最后一个子元素节点,找不到则返回null。该方法有兼容性问题,IE9以上才支持。

实际开发中,firstChild和lastChild包含其他节点,操作不方便,而firstElementChild和lastElementChild又有兼容性的问题,那么我们如何获取第一个子元素节点和最后一个子元素节点呢?

解决方案:

如果想要得到第一个子元素节点,可以使用parentNode.children[0]

如果想要得到最后一个子元素节点,可以使用parentNode.children[parentNode.children.length-1](length是子元素的个数)

  • 兄弟节点:

  1) node.nextSibling返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。

  2) node.previousSibling返回当前元素上一个兄弟节点,找不到则返回null。同样,也包含所有的节点。

  3) node.nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null。该方法有兼容性问题,IE9以上才支持。

  4) node.previousElementSibling返回当前元素上一个兄弟节点,找不到则返回null。该方法有兼容性问题,IE9以上才支持。

如何解决兼容性问题?自己封装一个兼容性的函数:

function getNextElementSibling(element) {
    var el = element;
    while (el = el.nextSibling) {
        if (el.nodeType === 1) {
            return el;
        }
    }
    return null;
}
④ 特殊元素的获取:
  • 获取body元素:document.body;
  • 获取html元素:document.documentElement;

这几种方式都可以获取元素节点,但是节点操作会更简单。网页中的所有内容都是节点(标签、属性、文本、注释等)

6. 复制

复制节点(克隆节点/拷贝节点):node.cloneNode();  该方法返回调用该方法的节点的一个副本。

注意:

① 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。

② 如果括号参数为true,则是深度拷贝,会赋值节点本身以及里面所有的子节点。

7. 属性操作

① 获取属性值:

  • element.属性,获取内置属性值(元素本身自带的属性)
  • element.getAttribute('属性');  主要获得自定义的属性(标准),程序员自定义的属性

② 设置属性值:

  • element.属性 = '值';  设置内置属性值
  • element.setAttribute('属性', '值');  主要设置自定义的属性(标准)

③移除属性值:element.removeAttribute('属性');

H5自定义属性:

自定义属性的目的是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。

自定义属性是通过getAttribute('属性')获取。

但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。

H5增加了自定义属性:

① 设置H5自定义属性:H5规定自定义属性以data-开头作为属性名并且赋值。

比如:<div data-index="1"></div>

或者使用JS设置:element.setAttribute('data-index', '2');

② 获取H5自定义属性:

  • 兼容性获取:element.getAttribute('data-index');
  • H5新增 element.dataset.index 或者 element.dataset[ 'index' ]   IE11才开始支持

8. 事件操作

JavaScript使我们有能力创建动态页面,而事件是可以被JavaScript侦测到的行为。

简单理解:触发---响应机制。

网页中的每个元素都可以产生某些可以触发JavaScript的事件,例如,我们可以在用户点击某按钮时产生一个事件,然后去执行某些操作。

事件三要素:事件源、事件类型、事件处理程序。

执行事件的步骤:①获取事件源  ②注册事件(也称绑定事件,采取 事件源.事件类型 = 事件处理程序)  ③添加事件处理程序(采取函数赋值形式)

常见的鼠标事件:

//例如click事件
element.onclick=function(){
   //处理函数
}

element.onclick

方法监听注册方式

(同个元素和事件可以添加多个侦听器)

addEventListener(type,listener[,useCapture])

具体的后面再起一篇吧~

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

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

相关文章

如何在Github精准地搜索项目

文章目录1、Github的项目有什么组成&#xff1f;2、如何搜索&#xff1f;in:name 条件in:readme 条件in:description 条件language:条件pushed: 条件stars: 条件awesome 关键字3、查看阅读项目https://blog.csdn.net/qq_45069279/article/details/107809617 https://blog.csdn.…

[附源码]SSM计算机毕业设计高校教师教学助手系统的设计与实现JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

将Nacos注册到springboot使用以及Feign实现服务调用

哈喽~大家好&#xff0c;这篇来看看将Nacos注册到springboot使用以及Feign实现服务调用。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【微服务】 &#x1f949;推荐专栏&#xff1a; JavaEE框架 目录 …

8 年 Java 开发含泪刷题,架构岗现在好难进,有点崩溃

架构岗现在好难进&#xff0c;有点崩溃了。一位粉丝后台留言道。具体问了下情况&#xff0c;是一位 8 年工作经验的朋友&#xff0c;代码功底扎实&#xff0c;项目经验也积累了不少。 为什么要用分布式锁&#xff1f;分布式锁的释放&#xff0c;需要注意什么&#xff1f;锁的过…

Elastic:总结收集日志的几种方法

到目前为止&#xff0c;我们看到有很多中不同的方法来收集日志。甚至&#xff0c;我们针对同样的一个日志&#xff0c;有好多种方法来进行采集。在今天的这篇文章中&#xff0c;我来简单里回顾一下。 通过 Filebeat 采集 Filebeat 是最为常用的一种采集日志的方法。使用 Fileb…

市面上哪种耳机适合跑步用、五款最适合跑步用的蓝牙耳机分享

对于很多运动爱好者来说&#xff0c;跑步&#xff0c;就像吃饭一样&#xff0c;已经成为生活中非常重要的习惯&#xff0c;跑步时听听音乐&#xff0c;让跑步的过程更加愉悦&#xff0c;但是你的运动耳机选对了嘛&#xff1f;首先我们要知道一款专业的运动耳机&#xff0c;一定…

Zookeeper:Mac通过Docker安装Zookeeper集群

此篇为 “Mac通过Docker安装Zookeeper集群”&#xff0c;笔者原本计划是接下来更新Zookeeper应用系列的相关内容&#xff0c;但相关内容依赖Zookeeper集群&#xff0c;虽然前面也更新了 Linux下Zookeeper在三种模式下的部署&#xff0c;但是大家很可能不会有相关的Linux集群准备…

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计

java项目-第152期ssm远程诊断系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《远程诊断系统》 该项目分为3个角色&#xff0c;管理员、用户和医生。 用户可以在前台浏览医生信息&#xff0c;并且可以进行在线预约&#xff0c; 在后台个人中心可以…

解决常见的电脑故障

1.电脑卡顿怎么办 电脑CPU使用率高的原因有很多&#xff1b;例如&#xff1a;软件方面——驱动故障、病毒影响&#xff1b;硬件方面——内存容量太小&#xff0c;风扇散热故障等。 有效的解决方法&#xff1a;关闭Windows通知 在【设置】-【系统】-【通知和操作】中&#xff0c…

并发编程之定时任务定时线程池

ScheduledThreadPoolExecutor 定时线程池类的类结构图 它用来处理延时任务或定时任务。 它接收SchduledFutureTask类型的任务&#xff0c;是线程池调度任务的最小单位&#xff0c;有三种提交任务的方式&#xff1a; schedulescheduledAtFixedRatescheduledWithFixedDelay它采用…

Numpy函数详解

目录 有关矩阵行列交换问题 法一 法二 行进行互换 列进行互换 insert函数 delete函数 append函数 where函数 默认第一个为行索引第二个为列索引。 行列索引都是以作为起始数值作为第一列或者第一行。(根据c数组的知识进行理解) 有关矩阵行列交换问题 法一 使用矩阵…

消灭空指针,Java 8 给我们更好的解决方案

前言 大家好&#xff0c;我是小郭。 在平时的业务开发中&#xff0c;空指针是我们经常遇到的问题&#xff0c; 他可能会导致我们的流程无法正常进行或者一些意外情况的发生。 这就是我们需要避免空指针的原因&#xff0c;那我们有哪些方式去解决这个问题呢&#xff1f; 空…

英语语法基础

英语语法知识点1   第一点&#xff1a;动词的变化   1、代词及be动词   主格 I we you you she/he/it they   宾格 me us you you her/him/it them   代词所有格 my our your your her/his/its their   名词性代词 mine ours yours yours hers/his/its theirs   …

FPGA数字信号、图像

1、基于FPGA的数字图像处理原理及应用 (牟新刚) 本书首先介绍FPGA程序设计和图像与视频处理的关键基础理论&#xff0c;然后通过实例代码详细讲解了如何利用FPGA实现直方图操作中的直方图统计/均衡化/线性拉伸/规定化、线性滤波器操作中的均值滤波器、Sobel算子(滤波、求模、求…

Redis从理论到实战:用Redis解决缓存穿透、缓存击穿问题(提供解决方案)

文章目录一、缓存穿透1、什么是缓存穿透2、解决方案二、缓存雪崩三、缓存击穿1、什么是缓存击穿2、解决方案3、互斥锁解决缓存击穿问题4、逻辑删除解决缓存击穿问题加油加油&#xff0c;不要过度焦虑(*^▽^*) 一、缓存穿透 1、什么是缓存穿透 缓存穿透是指客户端请求的数据在…

重组蛋白/细胞因子的实验操作

在我们进行抗体制备、ELISA、药物研究、免疫实验、细胞培养、晶体结构分析等实验时&#xff0c;免不了要和重组蛋白打交道。MCE 重组蛋白产品涵盖超过 2000 种不同功能的重组蛋白&#xff0c;具有批次间一致性&#xff0c;优异的活性以及极低的内毒素水平等特性&#xff0c;可用…

小学生python游戏编程arcade----坦克大战3

小学生python游戏编程arcade----坦克大战3前言整体解绍1、坦克大战3--未完&#xff0c;只是功能初具1.1 文件结构1.2 类1.3 角色类1.4 粒子类1.5 主程序框1.6 main函数1.7 效果图1.8 代码实现源码获取前言 接以上多篇文章解绍arcade游戏编程的基本知识&#xff0c;回归主题&am…

数商云B2B电商系统商品管理功能剖析,助力家用电器企业业务提效

如今&#xff0c;传统家用电器企业的发展空间不断受到电商渠道的积压&#xff0c;由于许多家电企业缺乏数字化的管理工具&#xff0c;导致管理低效&#xff0c;还很容易产生存货积压、供不应求等问题。随着家用电器市场需求疲软、竞争日趋白热化&#xff0c;家用电器企业亟须加…

密码学 数字签名

消息鉴别的缺陷 消息鉴别保证了数据完整性&#xff0c;消息不被第三方侵犯&#xff0c;但是不保证双方之间的欺骗。如果A发送认证消息给B&#xff0c;可能会存在多种争议&#xff1a; B伪造一个不同的消息&#xff0c;声称是A发的 A否认发过这个消息&#xff0c;B无法证明A确实…