JavaScript 操作(DOM)文档对象模型

文章目录

    • 什么是DOM
    • 浏览器内置解析器
    • JavaSiript 如何修改结构与样式
      • 浏览器解析顺序
      • DOM相关API
        • getElementById
        • getElementsByTagName
        • createElement
        • innerText与innerHTML
        • appendChild
      • JavaScript 修改结构与样式案例

什么是DOM

DOMDOM(文档对象模型)将正文上下文看做一个对象,全部封装在文档节点document中, htmlxml都只有一个文档节点,也就是html

浏览器内置解析器

浏览器内置两个解析器,一个是标签解析器,一个是脚本解析器,从上往下解析,如果出现解析异常则停止解析通过控制台报错,如果解析无误,则将整个html文档节点封装进document中,全文只有一个文档节点。

根据这个节点中的结构样式,创建一个文档对象模型格式如下:

             			  document
			                  |
			                 html
			                  |
			                  |
			        ---------------------------------------
			        |                                     |
			        |                                     |
			      head                                  body
			        |                                     |
			     ----------                       ----------------------
		         |        |                       |                    |
			    title     meta                   button              table
			                                                           |
			                                                           |
			                                                           tr
			                                                           |
			                                                           |
			                                                           td

JavaSiript 如何修改结构与样式

JavaSiript不能直接修改页面的结构和样式 必须通过文档对象模型来修改页面的结构和样式

JavaSiript中的的方法可以对document进行增删查改,修改之后,文档对象模型与页面实际结构和样式不再统一,浏览器根据这个模型重新刷新页面,使之保持一致。

浏览器解析顺序

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="UTF-8">
		<title>加载顺序</title>
		<style>
			
		</style>
		<script>		
			window.onload = function(){ 
				//根据id从全文拿取一个元素节点
				let domBtn = document.getElementById('btn')
				//当按钮单击时
				domBtn.onclick = function(){
					 //alert('进来啦!')
				}
			}

		</script>
	</head>
	<body>
		<button id="btn">按钮</button>
	</body>
</html>

如果这里去掉了window.onload之后那么浏览器从上往下解析,首先解析到的就是

 let domBtn = document.getElementById('btn')

从模型中根据btn这个id拿取元素节点,可是注意window.onload前提被删除了,整个页面还没有解析,模型未被创建,所以根本无法从模型中根据id拿取元素,所以报错。

那么是不是必须书写window.onload来保证模型创建完整呢?
不是必须书写,通常将js脚本书写在页面body闭合标签标签之前,保证最后执行js脚本
优先加载htmlcss 并且保证模型创建完毕。

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="UTF-8">
		<title>加载顺序</title>
		<style>
			
		</style>
		<script>		
			window.onload = function(){ 
				//根据id从全文拿取一个元素节点
				let domBtn = document.getElementById('btn')
				//当按钮单击时
				domBtn.onclick = function(){
					 //alert('进来啦!')
				}
			}

		</script>
	</head>
	<body>
		<button id="btn">按钮</button>
		<script>
			/*
			 *   js如果放置在此处,则不需要每次都添加window.onload
			 *   页面的加载顺序应该是 html ==> css ==>js
			 */
		</script>
	</body>
</html>

DOM相关API

getElementById

根据id从全文拿取一个元素节点

let domBtn = document.getElementById('btn')
getElementsByTagName

根据table标签名拿取一个元素节点列表NodeList,这个NodeList封装了所有匹配table的元素。

let domTb = document.getElementsByTagName('table')[0]
createElement

创建一个tr元素节点<tr></tr>

let domTr = document.createElement('tr')
innerText与innerHTML

修改这个元素的节点,向内部添加文本或者超文本
innerText:向元素节点中添加文本
innerHTML:向元素节点中添加超文本
添加前:<tr></tr>
添加后:<tr><td style="color:coral">我是添加的一列</td></tr>
不管是innerHTML还是innerText如果元素节点中存在节点值不管是文本还是子元素 则全部被覆盖

//let domTr = document.createElement('tr')
domTr.innerHTML = '<td style="color:coral">我是添加的一列</td>'
appendChild

元素节点.appendChild(子元素)
元素节点中原先的子元素不受影响,追加到原先子元素之后

//let domTb = document.getElementsByTagName('table')[0]
//let domTr = document.createElement('tr')
domTb.appendChild(domTr)

JavaScript 修改结构与样式案例

通过修改style属性来间接修改页面的样式

节点.style.样式名 = 样式值

注意:这里的样式名与CSS的样式名书写略有出入 不能出现- 必须 使用驼峰书写格式

  • css:background-color
  • js:backgroundColor

font-size ==> fontSize

//let domTb = document.getElementsByTagName('table')[0]
domTb.style.backgroundColor = 'rgb('+r+','+g+','+b+')'

代码示例

<!DOCTYPE html>
<html lang="zh-CN">
	<head>
		<meta charset="UTF-8">
		<title>文档对象模型</title>
		<style>
			table{
				width:200px;
				/* 重叠的边框合并成一条 */
				border-collapse: collapse;
			}

			table,tr,td{
				/* 显示边框 */
				border:solid 2px red;
			}
		</style>
		<script>
		
			window.onload = function(){
				//根据id从全文拿取一个元素节点
				let domBtn = document.getElementById('btn')
				//当按钮单击时
				domBtn.onclick = function(){
					let domTb = document.getElementsByTagName('table')[0]
					console.log(domTb)
					
					let domTr = document.createElement('tr')
					console.log(domTr)
				
					domTr.innerHTML = '<td style="color:coral">我是添加的一列</td>'
					//将组装好的tr追加到table中作为子元素,不影响原先的子元素
					domTb.appendChild(domTr)
					
					/*
					 *   Math:计算内置对象,专门用来进行数学运算
					 *   Math.floor():返回小于或者等于一个给定数字的最大整数
					 *   Math.random():返回介于 0(包含) ~ 1(不包含)之间的数
					 *
					 */
					let r = Math.floor(Math.random()*255)
					let g = Math.floor(Math.random()*255)
					let b = Math.floor(Math.random()*255)

					/*
					 *   使用ES6提供的模板字符串来避免进行字符串的拼接
					 *	`${要输出的值}`
					 */
					domTb.style.backgroundColor = `rgb(${r},${g},${b})`

				}
			}
		
		</script>
	</head>
	<body>
		<button id="btn">添加一行</button>
		<table>
			<tr>
				<td>我是默认存在的一列</td>
			</tr>
		</table>
	</body>
</html>

运行效果

在这里插入图片描述
点击添加

在这里插入图片描述
点击添加
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

gradle构建spring-framework源码

5.3.22版本构建 通过启动的jvm参数配置代理下载 Could not download jruby-stdlib-9.2.20.1.jar (org.jruby:jruby-stdlib:9.2.20.1) Could not get resource https://repo.maven.apache.org/maven2/org/jruby/jruby-stdlib/9.2.20.1/jruby-stdlib-9.2.20.1.jar. Could not GE…

如何在Linux部署JumpServer堡垒机并实现远程访问本地服务

文章目录 前言1. 安装Jump server2. 本地访问jump server3. 安装 cpolar内网穿透软件4. 配置Jump server公网访问地址5. 公网远程访问Jump server6. 固定Jump server公网地址 前言 JumpServer 是广受欢迎的开源堡垒机&#xff0c;是符合 4A 规范的专业运维安全审计系统。JumpS…

数据结构:非完全二叉树(递归实现)

非完全二叉树是指在二叉树中&#xff0c;除了叶子节点&#xff08;无子节点&#xff09;外&#xff0c;其他节点的子节点个数可以不同&#xff0c;即不一定是每个节点都有两个子节点&#xff0c;有右孩子时也不一定有左孩子。 tree.h /* * 文件名称&#xff1a;tree.h * …

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络 Fedora包含的软件以自由及开放源码许可来发布&#xff0c;并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台下…

项目03——《古罗马战场》

接下来我们布置场景&#xff0c;我们的预期结果&#xff08;功能分析&#xff09;是&#xff1a; 实现两角色阵列面向冲锋 首先进入资源商店准备下载角色模型资源&#xff0c; 搜索Monster&#xff0c; 将免费资源导入unity包&#xff0c; 创建一个地面Plane&#xff0c; 对两…

2023.1.17 关于 Redis 持久化 AOF 策略详解

目录 引言 AOF 策略 实例演示一 缓冲区 重写机制 手动触发 自动触发 AOF 重写流程 实例演示二 引言 Redis 实现持久化的两大策略 RDB ——> Redis DataBase&#xff08;定期备份&#xff09;AOF ——> Append Only File&#xff08;实时备份&#xff09; 注意&…

从零开始的OpenGL光栅化渲染器构建3-法线贴图和视差贴图

前言 我们可以用一张纹理贴图来表现物体表面的基础反射颜色&#xff0c;也可以用一张镜面反射贴图&#xff0c;来指派表面是否产生高光。除此之外&#xff0c;我们可以用贴图来存储表面的法线信息&#xff0c;以及高度信息&#xff0c;从而让渲染效果更加精细。 法线贴图 我…

vulhub之redis篇

CVE-2022-0543 | redis的远程代码执行漏洞 简介 CVE-2022-0543 该 Redis 沙盒逃逸漏洞影响 Debian 系的 Linux 发行版本,并非 Redis 本身漏洞, 漏洞形成原因在于系统补丁加载了一些redis源码注释了的代码 原理分析 redis一直有一个攻击面,就是在用户连接redis后,可以通过ev…

四、RHCE--远程连接服务器

四、RHCE--远程连接服务器 1、远程连接服务器简介2、连接加密技术简介&#xff08;1&#xff09;版本协商阶段&#xff08;2&#xff09;密钥和算法协商阶段&#xff08;3&#xff09;认证阶段 3、ssh服务配置4、用户登录ssh服务器 1、远程连接服务器简介 &#xff08;1&#…

【21K⭐】Legado:一款免费无广且支持高度自定义的必备阅读软件

【21K⭐】Legado&#xff1a;一款免费无广且支持高度自定义的必备阅读软件 随着数字化时代的到来&#xff0c;我们的阅读方式已经发生了巨大的变化。传统的纸质书籍逐渐被电子书取代&#xff0c;人们越来越倾向于使用电子设备来阅读。 然而对于一个喜欢阅读网络小说的人来说&…

从编程中思考:大脑的局部与全局模式(一)

郭靖正在帐篷中用Unity写代码&#xff0c;刚写完一段代码。欧阳锋从帐篷外走进来&#xff0c;正要说点什么&#xff0c;郭靖反应敏捷&#xff0c;转身反手一招神龙摆尾击出&#xff0c;将欧阳锋震出帐篷&#xff0c;灰溜溜逃跑。 using UnityEngine;public class LocalGlobalD…

旧路由重置新路由设置新路由设置教程|适用于自动获取IP模式

前言 如果你的光猫是直接拨号&#xff08;路由模式&#xff09;的&#xff0c;就可以按照本教程进行路由重置或者更换新路由器。 本文章适合电脑小白&#xff0c;请注意每一步哦&#xff01; 注意事项 开始之前需要确认光猫是桥接模式还是路由模式。如果光猫是路由模式&…

《二叉树》——1

目录 前言&#xff1a; 二叉树的链式结构 二叉树的遍历 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 总结&#xff1a; 前言&#xff1a; 从本文开始&#xff0c;将进一步深入学习编程语言思想&#xff0c;从二叉树开始我们将接触许许多多的递归算…

GoLang基础

1 与其他语言相比&#xff0c;使用go有什么好处&#xff1f; 简洁易学&#xff1a;相比其他编程语言&#xff0c;Go语言具有清晰简洁的语法和规范&#xff0c;减少了代码的复杂性。Go语言拥有较少的关键字和一致的格式&#xff0c;使得代码易于编写、阅读和维护。新手可以很快…

MyBatis 的XML实现方法(JAVA)

数据库表的结构如下&#xff1a; DROP DATABASE IF EXISTS test; CREATE DATABASE test DEFAULT CHARACTER SET utf8mb4; -- 使⽤数据数据 USE test; -- 创建表[⽤⼾表] DROP TABLE IF EXISTS userinfo; CREATE TABLE userinfo ( id INT ( 11 ) NOT NULL AUTO_INCREMENT, user…

Vue+ElementUI渲染select下拉框

User.java /*实现getter和setter方法注解*/ Data public class User {private Integer id;private String name; } UserMapper.java Mapper public interface CommonUserMapper {/**查询所有*/List<CommonUser> selectAllCommonUser(); } UserMapper.xml <?xml …

压力容器多开孔结构静力分析APP

压力容器多开孔结构静力分析APP对带有多个接管的容器结构在内压作用下进行静力分析&#xff0c;考察相邻接管开孔对容器及接管强度的影响。通过对容器和接管的几何尺寸、材料属性、载荷等进行参数化&#xff0c;以方便设计工程师对不同参数下的此类结构进行仿真分析。 近年来&a…

常用设计模式(工厂方法,抽象工厂,责任链,装饰器模式)

前言 有关设计模式的其他常用模式请参考 单例模式的实现 常见的设计模式(模板与方法&#xff0c;观察者模式&#xff0c;策略模式) 工程方法 定义 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟到子类。 ——《设…

【idea】idea中编译内存不足(java: java.lang.0ut0fMemoryError: Java heap space)的解决方法

问题 在编译一个较大的idea项目时候&#xff0c;有时候会显示内存不足&#xff0c;导致项目编译失败 原因 编译项目时实际也是启动了jvm进行的&#xff0c;所以需要分配对应的内存大小。 这个大小在idea中有一个默认的配置&#xff0c;大小是700M。 对于一个大型的项目这个大…

数学建模--PageRank算法的Python实现

文章目录 1. P a g e R a n k PageRank PageRank算法背景2. P a g e R a n k PageRank PageRank算法基础2.1. P a g e R a n k PageRank PageRank问题描述2.2.有向图模型2.3.随机游走模型 3. P a g e R a n k PageRank PageRank算法定义3.1. P a g e R a n k PageRank PageRank…
最新文章