节点

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

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

一般我们开发操作的是元素节点

节点层级

父级节点
node.parentNode
  1. 返回离自己最近的那个父亲
  2. 没有父亲,就返回null

<body>
<div class="demo">
<div class="box">
<span class="erweima">×</span>
</div>
</div>
<script>
var erweima = document.querySelector('.erweima');
console.log(erweima.parentNode); // 父节点
</script>
</body>

示例代码

子节点
  • 所有节点
node.childNodes
  1. 返回子节点的集合
  2. 返回的节点包含了所有的子节点,包括元素节点,文本节点
  • 子元素节点
node.children
  1. 返回的是一个只读节点

<body>
<ul>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
<li>我是li</li>
</ul>
<script>
var ul = document.querySelector('ul');
// childNodes
console.log(ul.childNodes); // NodeList(9) [text, li, text, li, text, li, text, li, text]
console.log(ul.childNodes[0].nodeType); // 3 // children
console.log(ul.children); // HTMLCollection(4) [li, li, li, li] </script>
</body>

示例代码

  • 第一个子节点
parentNode.firstChild
  1. 找到返回第一个子节点,找不到返回null
  • 最后一个节点
parentNode.lastChild
  1. 找到返回最后一个节点,找不到返回null
  • 第一个元素节点
parentNode.firstElementChild
  1. 找到返回第一个元素节点,找不到返回null
  • 最后一个元素节点
parentNode.lastElementChild
  1. 找到返回最后一个元素节点,找不到返回null
兄弟节点
  • 下一个兄弟节点

找不到返回null

node.nextSibling
  • 上一个兄弟节点

找不到返回null

node.previousSibling
  • 下一个兄弟元素节点(兼容性问题)

找不到返回null

node.nextElementSibling
  • 上一个兄弟元素节点(兼容性问题)

找不到返回null

node.previousElementSibling

<body>
<div>我是div</div>
<span>我是span</span>
<script>
var div = document.querySelector('div');
// 1. nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等
console.log(div.nextSibling); // #text // 2. nextElementSibling 得到下一个兄弟元素节点
console.log(div.nextElementSibling); </script>
</body>

示例代码

操作节点

添加节点
  • 添加到节点列表末尾
node.appendChild(child)
  • 添加到指定节点前面
node.insertBefore(child, 指定元素)

<body>
<ul>
<li>123</li>
</ul>
<script>
var ul = document.querySelector('ul');
// 创建节点
var li = document.createElement('li');
li.innerHTML = '<li>appendChild</li>';
// 添加节点 appendChild
ul.appendChild(li); // 插入节点
var lili = document.createElement('li');
lili.innerHTML = '<li>insertBefore</li>';
ul.insertBefore(lili, ul.children[0]) </script>
</body>

示例代码

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<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>
var nav = document.querySelector('.nav');
var lis = nav.children;
for (var i = 0; i < lis.length; i++) {
lis[i].onmouseover = function () {
this.children[1].style.display = 'block';
};
lis[i].onmouseout = function () {
this.children[1].style.display = 'none';
}
}
</script>
</body> </html>

案例-微博下拉框

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
} body {
padding: 100px;
} textarea {
width: 200px;
height: 100px;
border: 1px solid pink;
outline: none;
resize: none;
} ul {
margin-top: 50px;
} li {
width: 300px;
padding: 5px;
background-color: rgb(245, 209, 243);
color: red;
font-size: 14px;
margin: 15px 0;
}
</style>
</head> <body>
<textarea name="" id=""></textarea>
<button>发布</button>
<ul> </ul>
<script>
// 获取元素
var button = document.querySelector('button');
var text = document.querySelector('textarea');
var ul = document.querySelector('ul'); // 注册事件
button.onclick = function () {
// 获取文本框的值
if (text.value == '') {
alert('请输入值');
return false
} else {
// 创建节点
var li = document.createElement('li');
// 给节点赋值
li.innerHTML = text.value;
// 插入到最前面
ul.insertBefore(li, ul.children[0]);
}
} </script>
</body> </html>

案例-留言板

删除节点

删除一个子节点,返回删除的节点

node.removeChild()

<body>
<button>删除</button>
<ul>
<li>熊大</li>
<li>熊二</li>
<li>光头强</li>
</ul> <script>
// 获取元素
var button = document.querySelector('button');
var ul = document.querySelector('ul'); button.onclick = function () {
if (ul.children.length == 0){
this.disabled = true // 禁止按钮
} else {
// 删除第一个
ul.removeChild(ul.children[0])
} } </script>
</body>

示例代码

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head> <body>
<textarea name="" id=""></textarea>
<button>发布</button>
<ul>
</ul> <script>
// 获取元素
var text = document.querySelector('textarea');
var button = document.querySelector('button');
var ul = document.querySelector('ul');
// 注册事件
button.onclick = function () {
if (text.value == '') {
alert('输入内容');
return false
} else {
// 添加元素和删除按钮
var li = document.createElement('li');
li.innerHTML = text.value += "<a href='javascript:;'>删除</a>";
ul.insertBefore(li, ul.children[0]);
// 给删除按钮a添加删除事件
var as = document.querySelectorAll('a');
for (var i=0; i<as.length; i++) {
as[i].onclick = function () {
ul.removeChild(this.parentNode); // 相对a而已,删除它的父亲
}
} }
text.value = '' // 清楚文本框内容
} </script>
</body> </html>

案例-删除评论留言

克隆节点
  1. 返回节点的一个副本
  2. 参数为true为深拷贝

<body>
<ul>
<li>1111</li>
<li>2</li>
<li>3</li>
</ul> <script>
var ul = document.querySelector('ul');
// 拷贝
console.log(ul.cloneNode()); // <ul></ul> 浅拷贝
console.log(ul.cloneNode(true)); // 深拷贝 // 拷贝子节点
console.log(ul.children[0].cloneNode()); // <li></li> 浅拷贝
console.log(ul.children[0].cloneNode(true)); // 深拷贝
</script>
</body>

示例代码

创建节点
  • document.write()                  效率低
  • ele.innerHTML                     效率高
  • document.createElement()  效率一般

区别

  1. document.write() 是直接将内容写入页面,整个页面执行完全部重新绘
  2. innerHTML 是将内容插入dom 节点 不会重新绘
  3. innerHTML  创建多个元素效率高
  4. createElement 创建多个元素效率低,但是结构清晰

<body>
<button>创建</button>
<div></div>
<span></span> <script>
var btn = document.querySelector('button');
// 1. write
btn.onclick = function () {
document.write('<div>123</div>')
}; // 2.innerHTML
var div = document.querySelector('div');
for (var i=0; i<= 100; i++) {
div.innerHTML += '<a href="#">百度</a>'
} // 3 createElement
var span = document.querySelector('span');
for (var i=0; i<=100; i++) {
var a = document.createElement('a');
span.appendChild(a);
} </script>
</body>

示例代码

JavaScript DOM–节点操作的更多相关文章

  1. JavaScript DOM节点操作总结

    节点类型 节点类型主要有三种:元素节点,属性节点和文本节点. 而对DOM的主要也就是围绕元素节点和属性节点的增删改查.下面就分别从对元素节点的操作和对属性节点的操作来介绍. 元素节点 查 在对DOM进 ...

  2. 前端JavaScript之DOM节点操作

    1.HTML DOM是啥 Document Object Model:定义了访问和操作HTML文档的标准方法,把HTML文档呈现为带有元素,属性和文本的树状结构 2.解析过程 HTML加载完毕,渲染引 ...

  3. 深入理解DOM节点操作

    × 目录 [1]创建节点 [2]插入节点 [3]移除节点[4]替换节点[5]复制节点 前面的话 一般地,提起操作会想到“增删改查”这四个字,而DOM节点操作也类似地对应于此,接下来将详细介绍DOM的节 ...

  4. (转载)html dom节点操作(获取/修改/添加或删除)

    DOM 是关于如何获取.修改.添加或删除 HTML 元素的标准,下面为大家介绍下html dom节点操作,感兴趣的朋友可以参考下   HTML DOM 是关于如何获取.修改.添加或删除 HTML 元素 ...

  5. JavaScript DOM 基础操作

    JavaScript DOM 基础操作 一.获取元素的六方式 document.getElementById('id名称') //根据id名称获取 document.getElementsByclas ...

  6. 04-老马jQuery教程-DOM节点操作及位置和大小

    1. jQuery创建DOM标签 1.1 DOM动态创建标签的方法 DOM时代我们通过document的createElement方法动态创建标签.创建标签后,动态的给他添加属性.例如代码: // 动 ...

  7. 第一百六十七节,jQuery,DOM 节点操作,DOM 节点模型操作

    jQuery,DOM 节点操作,DOM 节点模型操作 学习要点: 1.创建节点 2.插入节点 3.包裹节点 4.节点操作 DOM 中有一个非常重要的功能,就是节点模型,也就是 DOM 中的“M”.页面 ...

  8. Dom节点操作总结

    Dom   一:Dom的概念 Dom的简介:  全称为 document object model  文档对象模型,是操作文档的一整套方法 - 文档 - html,document时一个对象,是dom ...

  9. JavaScript DOM 常用操作

    1.理解DOM: DOM(Document Object Model ,文档对象模型)一种独立于语言,用于操作xml,html文档的应用编程接口. 怎么说,我从两个角度理解: 对于JavaScript ...

随机推荐

  1. 重构与动态为angularjs栏位赋值或获取值

    先来看下面一段html: 这个ng-model名称带有一定的规律带有序号. 先来实现数据绑定,从数据取到数据后,为ng-model绑定相对应的值: var c = response.data $sco ...

  2. Centos7.6 Mysql数据库自动备份配置

    1.查看磁盘空间情况 执行 df -h 选择剩余空间最大的目录 (以/目录为例) 2.创建备份目录: cd / mkdir backup cd backup 3.创建备份Shell脚本: vim mo ...

  3. js对象模型2

    g

  4. 处理方法返回ModelAndView类型

    1.请求 <a href="test">测试</a> 2.处理方法 @RequestMapping("/test") public Mo ...

  5. luogu P3834 【模板】可持久化线段树 1(主席树) 查询区间 [l, r] 内的第 k 小/大值

    ————————————————版权声明:本文为CSDN博主「ModestCoder_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https:// ...

  6. NIO学习笔记,从Linux IO演化模型到Netty—— Netty零拷贝

    Netty的中零拷贝与上述零拷贝是不一样的,它并不是系统层面上的零拷贝,只是相对于ByteBuf而言的,更多的是偏向于数据操作优化这样的概念. Netty中的零拷贝: 1.CompositeByteB ...

  7. 在腾讯云上配置.NetCoreWeb

    1.购买服务器 2.远程登录(账号密码在上图铃铛里的消息里) 3.安装iis 3.安装.NetCore相关 下载最新版本.NET Core Windows Server Hosting https:/ ...

  8. zabbix默认监控负载取值不准确

    今天碰到个负载高引起的问题但是查看zabbix监控并没有报警,检查后发现监控取值与实际服务器内负载不一致. 使用zabbix_get命令在服务器内测试 zabbix默认模板键值 取值内容 [root@ ...

  9. c#---params参数

    写一个方法,求一个同学的总成绩 static void Main(string[] args) { , , }; Test("张三", n); Console.ReadKey(); ...

  10. antd-design

    1. 有mock 时候进度条展示不正常