JS操作DOM及CSS

news2024/9/28 9:21:10

 JS创造于1994年,其目的是为浏览器显示的文档赋予动态行为。

1 Web编程基础

本节讲解如何编写Web应用中的js程序,如果将这些程序加载到浏览器,以及如何获取输入、产出输出,如何运行响应事件的异步代码。

1.1 js 脚本

虽然现在不再提倡使用document.write()生成内容了,但由于还存在这种可能,浏览器在解析遇到<script>元素时的默认行为是必须要运行脚本,就是为了确保不漏掉脚本可能输出的HTML内容,然后才能再继续解析和渲染文档。这有可能拖慢网页的解析和渲染过程。

1.1.1 脚本运行时机

<script>标签支持defer和async两个属性,它们会导致脚本以不同的方式执行。这两个属性都会明确告诉浏览器,当前链接的脚本中没有使用document.write()生成的HTML输出。

async:让浏览器尽早运行脚本,但不会阻塞文档解析。

defer:推迟到文档完全加载和解析之后。

module:默认defer,但可用async覆盖。

可以把<script>标签放到HTML文件末尾,可确保脚本运行时就知道前面的文档内容已经解析了。

1.1.2 按需加载脚本

1)以模块形式编写,使用import()来按需加载。

2)向文档动态添加<script>标签。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button οnclick="addJs()">点击动态加载js</button>
</body>
<script>
    function addJs() {
        let s = document.createElement("script");
        s.append('console.log("hello js")');
        document.head.append(s);
    }
</script>
</html>

1.2 JS 程序的执行

图 js 程序从脚本执行阶段过度到事件处理阶段到步骤

1.3 程序错误

1)window.onerror属性,能定义一个终极错误处理程序,在未捕获异常时调用。当未捕获异常沿调用栈一路向上传播,错误消息即将现身在开发者控制台时,window.onerror函数将会以三个参数被调用(描述错误的消息,包含导致错误的js代码的url,文档中发生错误的行号)。 如果onerror处理程序返回true,意味着通知浏览器它已经处理了错误,不需要进一步行动了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button οnclick="makeError()">制造错误</button>
</body>
<script>
    function makeError() {
        throw new Error("未捕获的错误");
    }
    window.onerror = (msg,url,num) => {
        console.log(msg,url,num);
        return true;
    }
    // Uncaught Error: 未捕获的错误 http://localhost:63342/js-study/day5/s2.html?_ijt=v4mqhcotbhl7e6bfrfbd9db8nd&_ij_reload=RELOAD_ON_SAVE 12
</script>
</html>

2)window.addEventListener() 为 “unhandlerejection(期约被拒绝而没有catch()函数处理它)”事件注册一个处理程序来发现它。这个函数第一个参数是一个promise对象,第二个参数是reason,其值为本来要传给.catch()函数的拒绝理由。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button οnclick="makeError()">制造错误</button>
</body>
<script>
    function makeError() {
        return new Promise((resolve,reject) => {
            reject("拒绝原因");
        })
    }
    window.onunhandledrejection = (promise,reason) => {
        console.log("onunhandledrejection",promise,reason);
    }
    // onunhandledrejection PromiseRejectionEvent {isTrusted: true, reason: '拒绝原因', type: 'unhandledrejection', target: Window, currentTarget: Window, …} undefined
</script>
</html>

2 事件

图 事件传播的三个阶段

第一个阶段也叫做“捕获”阶段。addEventListener()接收的第三个可选参数,如果该值是true或{capture: true},那么就表明该事件处理程序会注册为捕获事件处理程序。

捕获阶段差不多与冒泡阶段正好相反:最先调用Window对象上注册的捕获处理程序,然后才调用Document对象的捕获处理程序,接着才是<body>元素,然后沿着DOM树一直向下,直到事件目标父元素的捕获事件处理程序被调用。注册在事件目标本身的捕获事件处理程序不会在这个阶段被调用。

事件捕获提供了把事件发送到目标之前先行处理到机会。

2.1 事件取消

调用事件对象的preventDefault()方法可以阻止浏览器执行其默认的动作(如果注册程序程序时传入了passive选项,则会导致该方法失效)。

事件对象的stopPropagation()方法会取消事件传播,但同一对象上的其他事件处理程序会照常执行。

stopImmediatePropagation()方法会阻止同一个对象上注册的后续事件处理程序执行。

2.2 派发自定义事件

CustomEvent()构造函数创建自定义事件对象,第一个参数是表示事件类型的字符串;第二个参数是一个对象,用于指定事件对象的属性。配置参数({bubbles: true} 表示希望其沿着文档树向上冒泡)。

事件目标的dispatchEvent()方法用于派发自定义事件,其唯一参数是CustomEvent类型对象,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div>
    <button id="btn">dispatchEvent</button>
</div>
</body>
<script>
    let customEvent = new CustomEvent("sayHello",{detail: this});
    let btn = document.querySelector("#btn");

    btn.addEventListener("sayHello",(e) => {
        console.log(e)
    });

    btn.dispatchEvent(customEvent);
</script>
</html>

图 btn的sayHello事件对象

3 操作DOM

Element对象的querySelector()方法接收一个css选择符作为参数,返回它在文档中找到的第一个匹配的元素。

querySelectorAll()方法返回Element对象的后代及其本身所有匹配的元素。

closest()从当前元素开始,沿着DOM树向上匹配(而上面的方法是沿着DOM树向下匹配)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="divC" id="div0">
<div class="divC" id="firstDiv">
    <span class="spanC">12</span>
    <span class="spanC">34</span>
    <div class="divC">56</div>
</div>
</div>
<div class="divC">aa</div>
<div class="divC">bb</div>
</body>
<script>
    let divElement = document.querySelector("#firstDiv");
    let nodeList = divElement.querySelector(".divC");
    console.log(nodeList); // <div class="divC">56</div>
    let elements = divElement.closest(".divC");
    console.log(elements);
    // <div className="divC" id="firstDiv">
    //     <span className="spanC">12</span>
    //     <span className="spanC">34</span>
    //     <div className="divC">56</div>
    // </div>
</script>
</html>

3.1 元素的内容

元素的内容有HTML表示和纯文本表示。Element的textContent表示元素的纯文本内容。html表示有以下方法:

1)innerHTML属性。通常效率很高,不过要注意,通过+=操作符给innerHTML追加文本的效率不高(这个操作既会涉及序列化操作,也会涉及解析操作:先把元素内容转换为字符串,然后再把新字符串转换回元素内容)。返回值不包含元素自身。设置innerHTML属性时,新内容会替换当前元素的内容。

2)outerHTML属性,返回值包含元素自身。在设置outerHTML时,新内容会取代元素本身。

3)insertAdjacentHTML()方法,用于插入与指定元素“相邻”的任意HTML标记字符串,要插入的标签作为第二个参数传入,而第一个枚举参数用于指定其位置(beforebegin、afterbegin、beforeend、afterend)。

图 inserAdjacentHTML()方法的插入位置

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div><button οnclick="divClickHandle(1)">innerHTML插入div1</button></div>
<div><button οnclick="divClickHandle(2)">outerHTML插入div2</button></div>
<div><button οnclick="divClickHandle(3)">insertAdjacentHTML插入div3</button></div>
<div id="div1">div1</div>
<div id="div2">div2</div>
<div id="div3">div3</div>
</body>
<script>
    function divClickHandle(type) {
        let element,str = '<span style="color:red">插入的内容</span>';
        if (type === 1) {
            element = document.querySelector("#div1");
            element.innerHTML = str;
        } else if (type === 2) {
            element = document.querySelector("#div2");
            element.outerHTML = str;
        } else {
            element = document.querySelector("#div3");
            element.insertAdjacentHTML("beforeend", str);
        }
    }
</script>
</html>
<style>
    #div1,#div2,#div3 {
        margin-top: 20px;
        border: solid 1px green;
        width: 200px;
    }
</style>

图 依次点击一次btn后的界面

4 操作CSS

Element对象的classList属性表示元素的类集。可以通过其add或者remove方法为该元素添加或者删除类名。

样式表是通过<style>或<link>标签与HTML文档关联起来的,这两个标签都是普通的HTML标签(可以为其指定一个id属性来方便querySelector方法的查找),其对应的Element对象都有disabled属性,可以用它禁用整个样式表。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button οnclick="disabledDefaultStyle()">禁用样式</button>
<button οnclick="addBlueStyle()">新增样式(字体成蓝色)</button>
<div id="div0">这是一个样式</div>
</body>
<style id="defaultStyle">
    #div0 {
        color: red;
    }
</style>
<script>
    function disabledDefaultStyle() {
        let element = document.querySelector("#defaultStyle");
        element.disabled = true;
    }

    function addBlueStyle() {
        let styleElement = document.createElement("style");
        styleElement.innerText='#div0{ color: blue}'
        document.body.append(styleElement);
    }
</script>
</html>

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

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

相关文章

2023 10月最新Vmd 下载安装教程,WindowsLinux

文章目录 下载Vmdwindows版本安装LINUX版本安装 下载Vmd 谷歌搜索VMD 点击左下角download VMD 可选择对应版本 注&#xff1a;点击后会出现输入用户名和密码&#xff0c;由于我已注册&#xff0c;界面不见了&#xff0c;所以直接描述一下。 输入用户名和密码然后会出现让登记…

(ubuntu)安装nginx

文章目录 前言回顾Linux命令在线安装&#xff1a;相关命令&#xff1a;相关路径常用配置&#xff1a; 卸载nginxbug相关: 前言 提示&#xff1a;别再问我的规划是什么了&#xff1a;呼吸&#xff0c;难道不算一个吗&#xff1f; --E.M齐奥朗 回顾Linux命令 # 查看当前进程的所…

Boundary-Aware RGBD Salient Object Detection With Cross-Modal Feature Sampling

方法 体会 实验做得比较详细&#xff0c;但未公布代码

面试题总结 20231024

1.桶排序的应用案例&#xff1a;上亿元素排行榜 step1: 桶排序本质是一种分治算法 step2:每个桶都代表了一个元素的范围 step3:每个桶中的元素都排好序后&#xff0c;取出来&#xff0c;这样子就有序了 2.简述你们框架中用到的线程模型 1.actor思想(单线程处理) 2.xdb加锁(类…

T01西门子#DPRD_DAT

关键字&#xff1a;无系统常数&#xff1b;目前没有可显示的系统常数&#xff1b;没有设备标识符。 西门子300PLC在博图V15.1中是没有系统常数&#xff0c;没有设备标识符。 在博图V15.1中使用DPRD_DAT时&#xff0c;LADDR参数如何选择&#xff1f; LADDR为待读取数据的 模块的…

CSAPP 练习题 2.25

#include<stdio.h>float sum_elements(float a[], unsigned length) {int i;float result 0;for (i 0; i < length-1; i) {result a[i];}return result; }int main() {float a[0];printf("array sum: %f\n", sum_elements(a, 0)); } 调整代码后&#xff…

ChatGLM系列一——ChatGLM的介绍与使用

下面是官方对ChatGLM的介绍&#xff1a; ChatGLM-6B&#xff0c;结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff09;。经过约 1T 标识符的中英双语训练&#xff0c;辅以监督微调、 反馈自助、人类反…

权限系统设计(转载)

1 为什么需要权限管理 2 权限模型 2.1 权限设计 2.2 为什么需要角色 2.3 权限模型的演进 2.4 用户划分 2.5 理想的RBAC模型 3 权限系统表设计 3.1 标准RBAC模型表设计 3.2 理想RBAC模型表设计 4 结语 1 为什么需要权限管理 日常工作中权限的问题时时刻刻伴随着我们&a…

白嫖在线云服务器,免费在 linux 服务器使用 docker 。 附视频+附文档

白嫖在线云服务器&#xff0c;免费在 linux 服务器使用 docker 。 附视频附文档 文章目录 前言启动 Nginx 案例最后 视频&#xff1a;https://www.bilibili.com/video/BV1WN411W79V/ 国内互联网经过多年发展&#xff0c;单体应用已经无法支持我们的互联网业务&#xff0c;分布…

css面试题及答案 【集合目录】

前言&#xff1a; 欢迎浏览和关注本专栏《 前端就业宝典 》&#xff0c; 不管是扭螺丝还是造火箭&#xff0c; 多学点知识总没错。 这个专栏是扭螺丝之上要造火箭级别的知识&#xff0c;会给前端工作学习的小伙伴带来意想不到的帮助。 本专栏将前端知识拆整为零&#xff0c;主要…

Redis单Reactor单线程网络模型

Redis单线程单Reactor网络模型 redis单线程里不能执行十分耗时的流程&#xff0c;不然会客户端响应不及时 解决方法一&#xff1a; beforesleep里删除过期键操作若存在大量过期键时&#xff0c;会耗费大量时间&#xff0c;redis采用的策略之一就是采用timelimit方案超过阈值就…

Hadoop部署过程中问题总结

Hadoop伪分布式集群部署问题总结 一、HDFS初始化失败 初始化失败&#xff0c;HDFS初始化操作如下&#xff1a; hdfs namenode -format然后我运行后报错&#xff1a;error parsing conf core-site.xml 出现这个信息就说明core-site.xml配置文件出错了&#xff0c;用vim命令可…

【AI视野·今日NLP 自然语言处理论文速览 第五十八期】Thu, 19 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 19 Oct 2023 Totally 74 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Understanding Retrieval Augmentation for Long-Form Question Answering Authors Hung Ting Chen, Fangyuan…

STM32 TIM(一)定时中断

STM32 TIM&#xff08;一&#xff09;定时中断 定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序算法的时候&#xff0c;都需要用到定时中断…

06数据结构——图

6.2图的存储及基本操作 6.2.1邻接矩阵法 图的邻接矩阵存储结构定义如下&#xff1a; #define MaxVertexNUm 100 //顶点数目的最大值 typedef char VertexType; //顶点的数据类型 typedef int EdgeType; //带权图中边上权值的数据类型 ty…

webrtc-stream编译报错记录

磁盘空间不足错误 错误信息 677.2 fatal: cannot create directory at blink/web_tests/external/wpt: No space left on device说明&#xff1a;这个错误是由于本地在配置docker资源时所给磁盘空间太小导致&#xff0c;直接根据镜像大小合理分配资源大小即可 pushd和popd执…

Android Studio新功能-设备镜像Device mirroring-在电脑侧显示手机实时画面并可控制

下载最新的灰测版本-蜥蜴 成功运行到真机后&#xff0c;点击右侧Running Devices选项卡&#xff0c;再点击号 选中当前设备&#xff1b; 非常丝滑同步&#xff0c;在电脑侧也可以顺畅控制真机 该功能大大方便了我们视线保持在显示器上专注开发&#xff0c;并且便于与UI视觉进行…

【Rust日报】2023-10-22 Korvin - 一个 WASM 前端框架,比基线 vanillajs 实现快了 33%!...

Yazi v0.1.5 发布 - 有史以来最大的更新 Yazi - &#x1f4a5; 用 Rust 编写的基于异步 I/O 的快速终端文件管理器。 嘿伙计&#xff01;我很高兴在这里宣布Yazi v0.1.5 发布了&#xff01; 这是有史以来最大的更新&#xff0c;也是周期最长的更新。该版本带来了许多有意义的变…

【进程VS容器VS虚拟机】

进程 VS 容器 VS 虚拟机 如果站在技术实现原理的角度来看&#xff0c;其实容器更像进程&#xff0c;而非虚拟机。 但是如果我们讨论这门技术的应用场景、解决的问题、终端用户是如何使用的&#xff0c;就会发现容器跟虚拟机非常相似&#xff0c;它们解决的是同样的问题&#…

渗透测试工具-sqlmap

sqlmap是一个开源渗透测试的自动化工具&#xff0c;可以自动检测和利用SQL注入漏洞并接管数据库服务器。它配备了一个强大的检测引擎&#xff0c;许多用于终极渗透测试的利基功能&#xff0c;以及广泛的开关&#xff0c;包括数据库指纹识别、从数据库中获取数据、访问底层文件系…