day6JS-DOM(文档对象模型)

DOM树

DOM 操作

1. 获取元素

1.1 根据id名获取元素

document.getElementById("id名");

案例:

<body><div id="box">div盒子</div><h1>一级标题</h1><script>console.log(document.getElementById("box"))</script>
</body>

1.2 根据标签名获取

 // 返回一个集合 (类数组对象)从整个文档获取
document.getElementsByTagName("标签名")  // 从element的后代元素中获取
element.getElementsByTagName("标签名")    

案例:

<body><div id="box">div盒子</div><h1>一级标题</h1><p>段落1</p><p>段落2</p><p>段落3</p><script>//获取到文档中所有的p标签,返回的是一个集合console.log(document.getElementsByTagName("p"))</script>
</body>

1.3 根据类名获取(不兼容ie6~8)

 // 返回一个集合(类数组对象)  从整个文档获取
document.getElementsByClassName("class名")  // 从element的后代中获取
element.getElementsByClassName("class名")   

案例:

<body><div class="box">div盒子</div><h1>一级标题</h1><p>段落1</p><p>段落2</p><p>段落3</p><script>console.log(document.getElementsByClassName("box"))</script>
</body>

1.4 根据 name 属性值获取(适用于表单标签)

        正常的规范中,咱们只会给表单元素起name值,如果给其它元素设置name,在ie9以下版本浏览器不兼容,是获取不到的,所以为了这种情况,咱们以后养成习惯,只给表单元素用name非表单元素不用name

 //返回集合,只有document才有该方法
document.getElementsByName("name属性的值") 

案例: 

<body>用户名:<input type="text" name="usename" value="">用户名:<input type="password" name="pwd" value=""><script>console.log(document.getElementsByName("usename"))</script>
</body>

1.5 根据css选择器获取(重点记忆)

注意:querySelector() querySelectorAll() 在ie6-ie8 下不兼容。

 //选择器第一个满足选择器条件的
document.querySelector(选择器)
//选择所有满足选择器条件的,返回nodeList(类数组对象)  
document.querySelectorAll(选择器) element.querySelector(选择器)
element.querySelectorAll(选择器)

案例:

<body><div id="divbox"><p class="pbox">段落1</p><p>段落2</p>用户名:<input type="text" name="usename" value=""></div><script>//querySelector只能获取第一个符合条件的元素console.log(document.querySelector("#divbox"))console.log(document.querySelector(".pbox"))console.log(document.querySelector("#divbox p"))// querySelectorAll获取所有符合条件的元素,返回的是集合console.log(document.querySelectorAll("#divbox"))console.log(document.querySelectorAll(".pbox"))console.log(document.querySelectorAll("#divbox p"))console.log(document.querySelectorAll("input"))</script>
</body>

注意!!!

根据css选择器获取时,是什么选择器就要带上该选择器的语法符号

例如:id选择器  ---- #选择器名; 类选择器 ---- .选择器名

1.6 获取Head元素对象

document.head 

案例:

<body><script>console.log(document.head);</script>
</body>

1.7 获取body元素对象

document.body

案例: 

<body><script>console.log(document.body);</script>
</body>

1.8 获取html元素对象

document.documentElement

案例:

<body><script>console.log(document.documentElement);</script>
</body>

1.9 获取一屏幕的宽度或者高度

// 获取一屏幕的高度
let vH = document.documentElement.clientHeight || document.body.clientHeight;// 获取一屏幕的宽度
let vW = document.documentElement.clientWidth || document.body.clientWidth;

1.10 id小妙招

 直接把id当成变量去用的时候,可以获取相应的id元素。(浏览器的机制)。

<div id="box1">111</div>
<script>console.log(box1)
</script>

2. 节点

2.1 常用的节点5个

  • 文档节点
  • 属性节点
  • 元素(标签)节点
  • 文本节点
  • 注释节点

2.2 文档节点

  • nodeType(节点类型):9(类型值9就是文档节点)
  • nodeName(节点名称):" #document "
  • nodeValue(节点值): null

案例:

<body><script>console.log(document.nodeType);//9console.log(document.nodeName);//#documentconsole.log(document.nodeValue);//null</script>
</body>

2.3 元素节点(重点记忆)

  • nodeType(节点类型):1(类型值1就是元素节点)
  • nodeName(节点名称):大写的标签名
  • nodeValue(节点值): null

案例:

<body><div id="box">111</div><div class="one">222</div><h1>大标题</h1><script>// 1.根据id属性先获取元素let divBox = document.getElementById("box");console.log(divBox.nodeType);//1console.log(divBox.nodeName);//DIVconsole.log(divBox.nodeValue);//nulllet divBox2 = document.querySelector("h1");console.log(divBox2.nodeType);//1console.log(divBox2.nodeName);//H1console.log(divBox2.nodeValue);//null</script>
</body>

2.4 属性节点

  • nodeType(节点类型):2(类型值2就是属性节点)
  • nodeName(节点名称):属性名
  • nodeValue(节点值): 属性值

getAttributeNode("属性名") 方法从当前元素中通过属性名称获取属性节点

案例:

<body><div id="box" class="one" name="xiaoxiao">111</div><script>// 1.先获取属性var myclass1 = box.getAttributeNode("class");// 2.在控制台输出console.log(myclass1);//class="one"console.log(myclass1.nodeType);//2console.log(myclass1.nodeName);//classconsole.log(myclass1.nodeValue);//one// 1.先获取属性var myclass2 = box.getAttributeNode("name");// 2.在控制台输出console.log(myclass2);//name="xiaoxiao"console.log(myclass2.nodeType);//2console.log(myclass2.nodeName);//nameconsole.log(myclass2.nodeValue);//xiaoxiao</script>
</body>

2.5 文本节点

  • nodeType(节点类型):3(类型值3就是文本节点)
  • nodeName(节点名称):" # text "
  • nodeValue(节点值): 文本内容
  • 在标准浏览器中,换行和空格也属于文本节点

使用childNodes方法获得文本内容。

案例:

<body><div id="box">111</div><div class="one">222</div><h1>大标题</h1><script>// 1.根据id属性先获取元素let h1Box = document.querySelector("h1");let textBox = h1Box.childNodes[0];console.log(textBox);//"大标题"console.log(textBox.nodeType);//3console.log(textBox.nodeName);//#textconsole.log(textBox.nodeValue);//大标题</script>
</body>

2.6 注释节点

  • nodeType(节点类型):8(类型值8就是注释节点)
  • nodeName(节点名称):" #comment "
  • nodeValue(节点值): 注释的内容
<body><!--这是一个div --><div id="box">111</div><script>let commentBox = document.body.childNodes[1];console.log(commentBox);//<!--这是一个div -->console.log(commentBox.nodeType);//8console.log(commentBox.nodeName);//#commentconsole.log(commentBox.nodeValue);//这是一个div</script>
</body>

3. 节点之间关系的属性

3.1 节点类

parentNode :父节点。

childNodes :所有子节点的集合。

firstChild :第一个子节点。

lastChild :最后一个子节点。

previousSibling :上一个兄弟节点。

nextSibling :下一个兄弟节点。

3.2 元素类

children :所有子元素的集合。

firstElementChild :第一个子元素 IE9+。

lastElementChild :最后一个子元素 IE9+。

previousElementSibling :上一个兄弟元素 IE9+。

nextElementSibling :下一个兄弟元素 IE9+。

4. 节点查找方式

4.1 parentNode(父节点)

获取当前节点唯一的父亲节点

<body><div id="box">111</div><script>console.log(box.parentNode);</script>
</body>

4.2 childNodes(子节点)

获取当前节点所有的子节点。

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><script>console.log(ulBox.childNodes);//NodeList(7)</script>
</body>

注意!!!

在js中换行和空格也算是text文本内容

4.3 firstChild

获取当前节点的第一个子节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><script>console.log(ulBox.firstChild);//#text</script>
</body>

4.4 lastChild

获取被选节点的最后一个子节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><script>console.log(ulBox.lastChild);//#text</script>
</body>

4.5 previousSibling

获取当前节点的上一个兄弟节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.previousSibling);//#text</script>
</body>

4.6 nextSibling

获取当前节点的下一个兄弟节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.nextSibling);//#text</script>
</body>

5. 元素查找方式

5.1 children

获取当前元素所有的元素子节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.children);//[li,li,li]</script>
</body>

5.2 firstElementChild

获取当前节点的第一个元素子节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.firstElementChild);//<li>查找子节点1</li></script>
</body>

5.3 lastElementChild

获取当前节点的最后一个元素子节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.lastElementChild);//<li>查找子节点3</li></script>
</body>

5.4 previousElementSibling

获取当前节点的上一个兄弟元素节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.previousElementSibling);//<div id="box">111</div></script>
</body>

5.5 nextElementSibling

获取当前节点的下一个兄弟元素节点

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>console.log(ulBox.nextElementSibling);//<h1>标题</h1></script>
</body>

6.练习题

使用previousSibling编写出previousElementSibling的效果。

<body><div id="box">111</div><ul id="ulBox"><li>查找子节点1</li><li>查找子节点2</li><li>查找子节点3</li></ul><h1>标题</h1><script>function getPreviousSibling(itme) {let getPrevious = itme.previousSibling;while (getPrevious && getPrevious.nodeType !== 1) {getPrevious = getPrevious.previousSibling;}return getPrevious;}let ulBox = document.querySelector("#ulBox");let result = getPreviousSibling(ulBox);console.log(result);</script>
</body>

DOM 的增删改

1. createElement:创建一个元素

document.createElement("标签名");

案例:

<body><script>// 1.创建标签let div = document.createElement("div");// 2.给标签添加内容div.innerHTML = "这是一个div标签";// 3.把标签写入页面document.body.appendChild(div);</script>
</body>

2. createTextNode: 创建一个文本节点

var/let 变量名 = document.createTextNode("文本内容");

案例:

<body><script>// 1.创建标签let div = document.createElement("div");// 2.给标签添加内容let divText = document.createTextNode("这是一个div标签");div.appendChild(divText);// 3.把标签写入页面document.body.appendChild(div);</script>
</body>

3. appendChild: 把元素追加到一个容器的末尾

语法:父元素.appendChild(子元素);

<body><script>// 1.创建标签let div = document.createElement("div");// 2.给标签添加内容let divText = document.createTextNode("这是一个div标签");div.appendChild(divText);// 3.把标签写入页面document.body.appendChild(div);</script>
</body>

4. insertBefore: 把一个元素插入到另一个元素的前面

步骤一:创建一个标签(元素)。

步骤二:给标签(元素)添加内容。

步骤三:获取到指定一个父节点。然后父节点使用insertBefore插入。

语法:
var/let 变量名 = 父节点.insertBefore(新的子元素, 旧的子元素)

案例:

<body><ul><li>1</li><li id="two">2</li></ul><script>// 1.创建标签let li = document.createElement("li");// 2.给标签添加内容li.innerHTML = "3";// 3.获取到要加入的父元素let ulParent = document.querySelector("ul");// 4. 将新元素插入到旧的元素之前ulParent.insertBefore(li, two);</script>
</body>

使用该方法还可以交换标签的位置。

<body><ul><li id="one">1</li><li id="two">2</li></ul><script>// 1.获取到要加入的父元素let ulParent = document.querySelector("ul");// 1. 交换位置ulParent.insertBefore(two, one);</script>
</body>

5. cloneNode: 把某一个节点进行克隆

  • cloneNode()浅克隆: 只是克隆了一个节点,里面的内容还有样式都没克隆
  • cloneNode(true)深克隆:把节点包含的所有内容和样式进行克隆
<body><ul><li id="one" style="color: red">111</li><li id="two">222</li></ul><script>// 1.获取到要克隆的元素let ulParent = document.querySelector("ul");// 2. 无参,只克隆了一个节点,不克隆样式let con1 = ulParent.cloneNode();document.body.appendChild(con1);//页面不显示内容// 3. 有参,既有内容,又有样式let con2 = ulParent.cloneNode(true);document.body.appendChild(con2);</script>
</body>

6. removeChild:移除某个节点

【context】.removeChild(ele);

<body><ul><li id="one" style="color: red">111</li><li id="two">222</li></ul><script>// 1.获取到要克隆的元素let ulParent = document.querySelector("ul");ulParent.removeChild(one);console.log(ulParent);</script>
</body>

7. set/get/removeAttribute()

  • setAttribute():设置当前元素的某一个自定义属性。
  • getAttribute():获取当前元素的某一个自定义属性。
  • removeAttribute():删除当前元素的某一个自定义属性。
box.setAttribute("index", 1);
box.getAttribute("index");
box.removeAttribute("index");
console.log(box)
// 设置
// box["aa"] = 22;
// 获取
// box["aa"]
//移除
// delete box["aa"];

        基于键值对方式增删改:修改当前对象的堆内存空间完成的(在堆内存空间可以看到)

        基于Attribute dom方法增删改,是修改html结构来完成的(此种方法设置的在结构上可以看到)。

以上两种方式不能混用

8. 练习题

利用a标签的href来重新获取url参数。

前置知识:a标签的两个方法:

<a href="http://www.zhufengpeixun.cn?name=lili&age=18#123"></a>

a.search :截取网址?(包括?)之后的内容。例如:?name=lili&age=18

a.hash:截取网址#(包括#)之后的内容。例如:#123

<body><a href="http://www.zhufengpeixun.cn?name=lili&age=18#123"></a><script>function getUrl() {let a = document.querySelector("a");let obj = {};obj.hash = a.hash.slice(1);let searchStr = a.search.slice(1).split("&");for (let i = 0; i < searchStr.length; i++) {let arr = searchStr[i].split("=");obj[arr[0]] = arr[1];}return obj;}console.log(getUrl());</script>
</body>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

群晖NAS万兆网卡跑不满的真正原因

公司有几台群晖NAS,型号有DS2419+,和RS2418+,DS1821+,阵列都做了RAID6。当年都是花了大价钱买的存储,都上了万兆网卡,前面两个型号的速度速度始终在300MB左右徘徊,始终跑不满万兆,尤其大容量迁移的时候非常痛苦,之前200TB的数据迁移,整整用了一个月。 今天特意拿了群…

vue vite创建项目步骤

1. 创建vue项目 node版本需18以上 不然报错 npm init vuelatest2. 项目配置 配置项目的icon配置项目的标题配置jsconfig.json 3. 项目目录结构划分 4.css样式的重置 npm install normalize.cssreset.css html {line-height: 1.2; }body, h1, h2, h3, h4, ul, li {padding…

SpringBoot教程(二十五) | SpringBoot整合Sharding-JDBC分库分表

SpringBoot整合Sharding-JDBC分库分表 前言1. 什么是Sharding&#xff1f;2. 什么是Sharding-JDBC&#xff1f; 所需的maven依赖注意点&#xff08;关于shardingsphere的配置情况&#xff09;实操一&#xff1a;如何水平分表1. 步骤说明2. 创建数据库和表3.配置application.pro…

如何将TRIZ技术融入到智能家居的产品设计流程中?

在探讨如何将TRIZ&#xff08;发明问题解决理论&#xff09;技术融入智能家居产品设计流程中时&#xff0c;我们首先需要理解TRIZ作为一种系统化的创新方法论&#xff0c;其核心在于提供一套科学的工具和算法&#xff0c;帮助解决复杂的技术难题&#xff0c;加速产品创新过程。…

(LLM) 很笨

大型语言模型 (LLM) 并非你所想的那样。你被骗了。LLM 很笨&#xff0c;非常笨。事实上&#xff0c;它们更接近数据库&#xff0c;而不是人类。 这就是为什么人工智能仍然处于征服智能的第一步……如果有的话。 终极煤气灯效应 建立前沿人工智能的成本很高。前沿人工智能需要大…

C++系列-多态的基本语法

多态的基本语法 多态的含义静态多态动态多态 多态的底层原理多态中的final和overridefinaloverride: 多态的应用和优点计算器简单实现电脑组装的实现 《游山西村》 南宋陆游 莫笑农家腊酒浑&#xff0c;丰年留客足鸡豚。 山重水复疑无路&#xff0c;柳暗花明又一村。 箫鼓追…

STL—list—模拟实现【迭代器的实现(重要)】【基本接口的实现】

STL—list—模拟实现 1.list源代码 要想模拟实现list&#xff0c;还是要看一下STL库中的源代码。 _list_node里面装着指向上一个节点的指针prev&#xff0c;和指向下一个节点的指针next&#xff0c;还有数据data 并且它给的是void*&#xff0c;导致后面进行节点指针的返回时…

GitHub开源的轻量级文件服务器,可docker一键部署

文件服务器 介绍安装使用命令使用API调用 介绍 项目github官网地址 Dufs是一款由Rust编写的轻量级文件服务器&#xff0c;不仅支持静态文件服务&#xff0c;还能轻松上传、下载、搜索文件&#xff0c;甚至支持WebDAV&#xff0c;让我们通过Web方式远程管理文件变得轻而易举。…

免费生产设备日志采集工具

使用咨询: 扫码添加QQ 永久免费: Gitee下载最新版本 使用说明: CSDN查看使用说明 功能: 定时(全量采集or增量采集) SCADA,MES等系统采集工控机,办公电脑文件. 优势1: 开箱即用. 解压直接运行.插件集成下载. 优势2: 批管理设备. 配置均在后台配置管理. 优势3: 无人值守 采集端…

软考-软件设计师(程序设计语言习题)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

Vue: v-html安全性问题

一、问题描述 可能都知道使用v-html插入富文本&#xff0c;存在安全隐患&#xff0c;比如 cross-site scripting attack&#xff08;xss&#xff09;。但具体什么情况下v-html会引发安全问题呢&#xff1f;是否内容中含有<scrpit>标签就会触发执行脚本呢&#xff1f; 二…

基于vue框架的北城招聘管理平台题目7lly3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,企业,企业信息,职位类型,职位信息,简历信息,职位应聘,求职意愿,面试信息,录取信息,实习信息,冻结信息,解冻信息 开题报告内容 基于Vue框架的北城招聘管理平台 开题报告 一、引言 随着互联网的飞速发展和企业对人才需求的不断增…

Redis的缓存淘汰策略

1. 查看Redis 最大的占用内存 打开redis配置文件, 设置maxmemory参数&#xff0c;maxmemory 是bytes字节类型, 注意转换 2. Redis默认内存多少可以用 注意: 在64bit系统下&#xff0c; maxmemory 设置为 0 表示不限制Redis内存使用 3. 一般生产上如何配置 一般推荐Redis 设置内…

Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

前言&#xff1a;在Java编程语言中&#xff0c;集合框架&#xff08;Collection Framework&#xff09;提供了一系列用于存储和操作数据的接口和类。其中&#xff0c;Map和Set是两个非常重要的接口&#xff0c;分别用于存储键值对和无重复元素的集合。 ✨✨✨这里是秋刀鱼不做梦…

【蓝桥杯集训100题】scratch时间计算 蓝桥杯scratch比赛专项预测编程题 集训模拟练习题第26题

目录 scratch时间计算 一、题目要求 编程实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、python资料 scratc…

qtsql连接达梦数据库

odbc window和linux都有odbc的中间件&#xff0c;可以通过odbc中间件配合qtsql连接数据库 windows下配置odbc linux配置odbc apt install unixodbc unixodbc-dev /etc/odbcinst.ini配置 [DM8 ODBC DRIVER] DescriptionDM8 ODBC Driver DRIVER/opt/dmdbms/bin/libdodbc.so/et…

力扣: 两数之和 梦开始的地方

文章目录 需求暴力求解优化一下暴力解法用Map结尾 需求 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用…

Leetcode刷题:哈希表

找一个数是否出现过或一个数是否在集合中的时候就要想到用哈希表法 242有效的字母异位词 bool isAnagram(string s, string t) {int table[26];for(char i:s) {table[i-a] 1;}for(char i:t) {table[i-a] -1;}for(int i:table) {if(i!0)return false;}return true;} 349两个数…

docker-harbor私有仓库部署和管理

harbor&#xff1a;开源的企业级的docker仓库软件 仓库&#xff1a;私有仓库 公有仓库 &#xff08;公司内部一般都是私有仓库&#xff09; habor 是有图形化的&#xff0c;页面UI展示的一个工具&#xff0c;操作起来很直观。 harbor每个组件都是由容器构建的&#xff0c;所…

新手教学系列——利用 Loguru 对日志进行分类处理

在现代应用程序中,日志记录是确保系统健康运行的关键因素之一。尤其在复杂的系统中,我们可能需要将日志按不同的需求进行分类和处理。Loguru 作为一款功能强大的日志库,提供了灵活的日志记录方式。今天,我们将探讨如何使用 Loguru 的过滤功能来分类处理系统日志和关键节点日…