技术标签: 前端 html javascript
目录
1. 节点概述
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点用node来表示。
HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。
一般的,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值) 这三个基本属性。
2. 节点层次
利用DOM树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。
<body>
<div class="box">
<span class="num">1</span>
</div>
<div class="container"></div>
<script>
var num = document.querySelector('.num');
//node.parentNode:得到的是离元素最近的父级节点,没有则返回null
console.log(num.parentNode);
var container = document.querySelector('.container');
console.log(container.parentNode);
</script>
</body>
结果为:
<body>
<ul>
<li></li>
<li></li>
<li></li>
</ul>
<script>
var ul = document.querySelector('ul');
var lis = ul.querySelector('li');
//1.parentNode.childNodes(标准):得到的节点包括元素节点、文本节点等
console.log(ul.childNodes);
console.log(ul.childNodes[0].nodeType); //3,表示为文本节点
console.log(ul.childNodes[1].nodeType); //1,表示为元素节点
//2.parentNode.children(非标准):是一个只读属性,返回所有的子元素节点
console.log(ul.children);
//3.parentNode.firstChild:返回第一个子节点,找不到则返回null,包含所有的节点
console.log(ul.firstChild);
//4.parentNode.firstElementChild:返回第一个子节点,IE9以上才支持
console.log(ul.firstElementChild);
//5.parentNode.lastChild:返回最后一个子节点,找不到则返回null,包含所有的节点
console.log(ul.lastChild);
//6.parentNode.firstElementChild:返回最后一个子节点,IE9以上才支持
console.log(ul.lastElementChild);
</script>
</body>
结果为:
<style>
* {
margin: 0;
padding: 0;
}
li {
list-style-type: none;
}
a {
text-decoration: none;
font-size: 14px;
}
.nav {
margin: 100px;
}
.nav>li {
position: relative;
float: left;
width: 80px;
height: 41px;
text-align: center;
}
.nav li a {
display: block;
width: 100%;
height: 100%;
line-height: 41px;
color: #333;
}
.nav>li>a:hover {
background-color: #eee;
}
.nav ul {
display: none;
position: absolute;
top: 41px;
left: 0;
width: 100%;
border-left: 1px solid #FECC5B;
border-right: 1px solid #FECC5B;
}
.nav ul li {
border-bottom: 1px solid #FECC5B;
}
.nav ul li a:hover {
background-color: #FFF5DA;
}
</style>
</head>
<body>
<ul class="nav">
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="#">私信</a>
</li>
<li>
<a href="#">评论</a>
</li>
<li>
<a href="#">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="#">私信</a>
</li>
<li>
<a href="#">评论</a>
</li>
<li>
<a href="#">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="#">私信</a>
</li>
<li>
<a href="#">评论</a>
</li>
<li>
<a href="#">@我</a>
</li>
</ul>
</li>
<li>
<a href="#">微博</a>
<ul>
<li>
<a href="#">私信</a>
</li>
<li>
<a href="#">评论</a>
</li>
<li>
<a href="#">@我</a>
</li>
</ul>
</li>
</ul>
<script>
//1.获取元素
var nav = document.querySelector('.nav');
//返回所有的子节点,只包括元素节点
var lis = nav.children;
//2.注册事件 处理程序
for(var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function() {
//ul有两个子孩子->a和ul,要使得鼠标经过时ul显示出来,所以应该设置第二个子孩子display
this.children[1].style.display = 'block';
}
lis[i].onmouseout = function() {
this.children[1].style.display = 'none';
}
}
</script>
</body>
结果为:当鼠标经过时,下拉的菜单就会显示;反之则隐藏起来
<body>
<div>1</div>
<span>2</span>
<script>
var div = document.querySelector('div');
//1.nextSibling:返回当前元素的下一个兄弟节点,包含所有节点
console.log(div.nextSibling);
//2.previousSibling:返回当前元素的上一个兄弟节点,包含所有节点
console.log(div.previousSibling);
//3.nextElementSibling:返回当前元素的下一个兄弟节点,兼容性问题(IE9以上才支持)
console.log(div.nextElementSibling);
//4.previousElementSibling:返回当前元素的上一个兄弟节点,兼容性问题(IE9以上才支持)
console.log(div.previousElementSibling);
</script>
</body>
结果为:
<body>
<ul>
<li>1</li>
</ul>
<script>
var ul = document.querySelector('ul');
//1.创建节点元素
var li = document.createElement('li');
//2.添加节点:parent.appendChild(child) 在末尾追加元素
ul.appendChild(li);
//3.添加节点:node.insertBefore(child, 指定元素) 在指定父节点的子节点前面追加元素
var li1 = document.createElement('li');
ul.insertBefore(li1, ul.children[0]);
</script>
</body>
结果为:
<style>
textarea {
border: 1px solid #000;
}
li {
background-color: pink;
}
</style>
</head>
<body>
<textarea cols="30" rows="10"></textarea>
<button>发布</button>
<ul>
</ul>
<script>
//1.获取元素
var text = document.querySelector('textarea');
var btn = document.querySelector('button');
var ul = document.querySelector('ul');
//2.注册事件 处理程序
btn.onclick = function() {
if (text.value == '') {
alert('您没有输入留言');
return false;
}
else {
//创建元素
var li = document.createElement('li');
//添加元素
//将输入的内容赋值给li
li.innerHTML = text.value;
// ul.appendChild(li);
ul.insertBefore(li, ul.children[0]);
}
}
</script>
</body>
结果为:
<body>
<button>删除</button>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
//1.获取对象
var btn = document.querySelector('button');
var ul = document.querySelector('ul');
//2.注册事件 处理程序
btn.onclick = function() {
if (ul.children.length == 0) {
this.disabled = true;
}
else {
ul.removeChild(ul.children[0]);
}
}
</script>
</body>
结果为:
node.cloneNode():返回调用该方法的节点的一个副本,也称为克隆节点/拷贝节点
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
//获取对象
var ul = document.querySelector('ul');
//1.cloneNode():参数为空或者是false,浅拷贝,只复制节点不复制文本内容
var li = ul.children[0].cloneNode();
//2.cloneNode(true):参数为true,深拷贝,只复制节点同时复制文本内容
var li1 = ul.children[1].cloneNode(true);
ul.appendChild(li);
ul.appendChild(li1);
</script>
</body>
结果为:
<body>
<button>btn</button>
<span>1</span>
<script>
var btn = document.querySelector('button');
btn.onclick = function() {
//直接将内容写入页面的内容流,但是文档流执行完毕,它会导致页面全部重绘->button和span不在页面上
document.write('<div>123</div>');
}
</script>
</body>
结果为:
文章浏览阅读1.1k次,点赞10次,收藏26次。Orange3 是一个开源的机器学习和数据可视化桌面软件。它允许你通过简单的拖放技术来创建数据分析工作流程。Orange3 提供了一个友好的图形化用户界面,非常适合初学者使用,同时也为熟练的数据科学家提供了数据探索和建模的强大功能。在 Orange3 中,数据分析过程被设计为工作流程,它顺畅地转换并可视化数据,使用机器学习算法进行建模,并创建了可视化的数据呈现。每个流程都是一系列称为 "widget" 的模块,它们通过渠道连接在一起进行通信。_orange3
文章浏览阅读5.5k次,点赞5次,收藏28次。引文:如果开发者需要保存密码(比如网站用户的密码),要考虑如何保护这些密码数据,网站用户密码的泄露是一件非常严重的事情,容易引起用户恐慌,所以在安全方面是重中之重,直接将密码以明文写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function),也就是摘要加密。通过哈希函数,我们就可以将密码的哈希值存储进数据库。
文章浏览阅读3.5k次。#include "vtkActor.h"#include "vtkCamera.h"#include "vtkCellArray.h"#include "vtkFloatArray.h"#include "vtkPointData.h"#include "vtkPoints.h"#include "vtkPolyData.h"#include "vtkPolyDataMapper._vtk隐藏单元
文章浏览阅读9.9k次,点赞9次,收藏6次。【背景】在vs2019上运行winform应用程序,弹出来如下提示:错误 CS0012 类型“Object”在未引用的程序集中定义。必须添加对程序集“netstandard, Version=2.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”的引用.............【解决办法】右键当前项目→属性→应用程序..._类型“object”在未引用的程序集中定义。必须添加对程序集“netstandard, version
文章浏览阅读556次。介绍一下fork是什么? 1操作系统提供的用户界面有几种?分别是什么?2,举出人类社会中采用的几个抽象示例,并与操作系统提供的抽象进行对比。3,有人认为,内核态程序可以访问任何资源的权限对系统安全造成严重成卧,你怎么看?4,处理器的状态设置需要在何种态势下完成?为什么?5,处理器从用户态转为内核态时面临的关键问题是什么?如何解决?_操作系统fork
文章浏览阅读2.5k次,点赞6次,收藏4次。jwt.SigningMethodES256 两种类型 *SigningMethodECDSA 和 *SigningMethodHMACjwts := jwt.NewWithClaims(jwt.SigningMethodES256, c) // SigningMethodES256 *SigningMethodECDSA 此类型会报错: key is of invalid type`jwts := jwt.NewWithClaims(jwt.SigningMethodHS256, c) // S
文章浏览阅读2.9w次,点赞160次,收藏1.7k次。废话不多说,不管是应对期末考试还是考研基础复习,刷题是必不可少的!!! 大家冲就完了!!!!记得给 罡罡同学点关注哦! 后期还会更新其他题库的呢!!!打赏一点钱,帮我买瓶肥宅快乐水,继续创作,谢大家!计算机组成原理试题库——题目及答案计算机组成原理试卷1一、选择题(共20分,每题1分)1.CPU响应中断的时间是______。A.中断源提出请求;B.取指周期结束;C.执行周期结束;D.间址周期结束。2.下列说法中______是正确的。A.加法指令的执行周期一定要访存;B.加法指令_云南大学滇池学院2024计算机组成原理期末考试
文章浏览阅读1.2w次。需求说明:IPC高清摄像机知识储备内容 :第一部分 从四大方面分析CCD传感器与CMOS传感器的优劣 第二部分 解析数码相机的技术参数整理来自:时间的诗第一部分 从四大方面分析CCD传感器与CMOS传感器的优劣来自:http://www.elecfans.com/yuanqijian/sensor/20_ipc shutter
文章浏览阅读1.5k次,点赞7次,收藏8次。给NAS-Tool添加拓展功能,自定义刷流、索引规则_nastool安装第三方插件
文章浏览阅读2k次,点赞3次,收藏14次。Arduino 和水流量传感器测量水流量和体积_arduino 流量计
文章浏览阅读229次。F02_HttpRunner关联:提取固定名称方式的 SessionID接着上一章项目案例分析,SessionID 存在于临时 cookie 中,HttpRunner 可以从cookie中直接提取需要的值,而且要求 cookie 的键名称必须是固定不变的,提取方式为:extract: - 变量名称: cookies.键名称为了验证返回响应内容的正...
文章浏览阅读1.5k次。原因:echarts在创建图表的时候需要一个div作为dom容器,再将由echarts.init方法初始化一个 echarts 实例初始化的map挂载到dom树中。<div id="map" v-if="showType != 'list'"></div>而此错误的意思是在该element创建之前,就去getElement获取该元素。解决:本以为是生命周期的问题,改了好久,后来发现是该dom容器上挂了一个v-if,而v-if是由后来调后端接口获取的数据来控._echarts 中 打开弹框中的柱状图rror: initialize failed: invalid dom