当前位置: 首页 > news >正文

网站建设松江/app拉新渠道商

网站建设松江,app拉新渠道商,徐州编程培训机构,动态网站的优点1、节点概述 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改&a…

1、节点概述

  • 网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM 中,节点使用 node 来表示。
  • HTML DOM 树中的所有节点均可通过 JavaScript 进行访问,所有 HTML 元素(节点)均可被修改,也可以创建或删除。

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

  • 元素节点 nodeType 为 1
  • 属性节点 nodeType 为 2
  • 文本节点 nodeType 为 3(文本节点包含文字、空格、换行等)
  • 在实际开发者,节点操作主要操作的是元素节点

2、节点层级

利用 DOM 树可以把节点划分为不同的层级关系,常见的是父子兄层级关系。  

 

3、父级节点

node.parentNode

  • parentNode 属性可返回某节点的父节点,注意是最近的一个父节点
  • 如果指定的节点没有父节点则返回null 
<!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><!-- 节点的优点 --><div>我是div</div><span>我是span</span><ul><li>我是li</li><li>我是li</li><li>我是li</li><li>我是li</li></ul><div class="demo"><div class="box"><span class="erweima">×</span></div></div><script>// 1. 父节点 parentNodevar erweima = document.querySelector('.erweima');// var box = document.querySelector('.box');// 得到的是离元素最近的父级节点(亲爸爸) 如果找不到父节点就返回为 nullconsole.log(erweima.parentNode);</script>
</body></html>

4、子节点

4.1、所有子节点

parentNode.childrenNodes (标准)

parentNode.childrenNodes 返回包含指定节点的子节点的集合,该集合为及时更新的集合。

注意:

  • 返回值里面包含了所有的子节点,包括元素节点、文本节点等。
  • 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes

4.2、子元素节点

 parentNodes.children (非标准)

        parentNode.children 是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回(重点掌握) 。虽然children是一个非标准,但是得到了各个浏览器的支持,因此可以放心使用。

<!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><!-- 节点的优点 --><div>我是div</div><span>我是span</span><ul><li>我是li</li><li>我是li</li><li>我是li</li><li>我是li</li></ul><ol><li>我是li</li><li>我是li</li><li>我是li</li><li>我是li</li></ol><div class="demo"><div class="box"><span class="erweima">×</span></div></div><script>// DOM 提供的方法(API)获取var ul = document.querySelector('ul');var lis = ul.querySelectorAll('li');// 1. 子节点  childNodes 所有的子节点 包含 元素节点 文本节点等等console.log(ul.childNodes);console.log(ul.childNodes[0].nodeType);console.log(ul.childNodes[1].nodeType);// 2. children 获取所有的子元素节点 也是我们实际开发常用的console.log(ul.children);</script>
</body></html>

4.3、其他方法

方法名说明
parentNode.firstChild返回第一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.lastChild返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点
parentNode.firstElementChild返回第一个子元素节点,找不到则返回null。
parentNode.lastElementChild返回最后一个子元素节点,找不到则返回null。

        实际开发中,firstChild和lastChild包含其他节点,操作不方便,而firstElementChild和lastElementChild又有兼容性问题,那么我们如何获取第一个子元素节点或最后一个子元素节点呢? 

解决方案:

  • 如果想要第一个子元素节点,可以使用parentNode.children[0]
  • 如果想要最后一个子元素节点,可以使用parentNode.children[parentNode.children.length - 1]
<!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><ol><li>我是li1</li><li>我是li2</li><li>我是li3</li><li>我是li4</li><li>我是li5</li></ol><script>var ol = document.querySelector('ol');// 1. firstChild 第一个子节点 不管是文本节点还是元素节点console.log(ol.firstChild);console.log(ol.lastChild);// 2. firstElementChild 返回第一个子元素节点 ie9才支持console.log(ol.firstElementChild);console.log(ol.lastElementChild);// 3. 实际开发的写法  既没有兼容性问题又返回第一个子元素console.log(ol.children[0]);console.log(ol.children[ol.children.length - 1]);</script>
</body></html>

5、案例:新浪下拉菜单

案例分析:

  • 导航栏里面的li都要有鼠标经过效果,所以需要循环注册鼠标事件
  • 核心原理:当鼠标经过li里面的,第二个孩子ul显示,当鼠标离开,则ul隐藏 
<!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 li 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; // 得到4个小li// 2.循环注册事件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>

6、兄弟节点

方法名说明
node.nextSibling返回当前元素的下一个兄弟节点,找不到则返回null。
node.previousSibling返回当前元素上一个兄弟节点,找不到则返回null。
node.nextElementSibling返回当前元素下一个兄弟元素节点,找不到则返回null
node.previousElementSibling返回当前元素上一个兄弟元素节点,找不到则返回null

注意:后面两个方法有兼容性问题,IE9以上才支持

解决兼容性问题,可以封装一个函数

   function getNextElementSibling(element) {var el = element;while (el = el.nextSibling) {if (el.nodeType === 1) {return el;}}return null;} 
<!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><div>我是div</div><span>我是span</span><script>var div = document.querySelector('div');// 1.nextSibling 下一个兄弟节点 包含元素节点或者 文本节点等等console.log(div.nextSibling);console.log(div.previousSibling);// 2. nextElementSibling 得到下一个兄弟元素节点console.log(div.nextElementSibling);console.log(div.previousElementSibling);</script>
</body></html>

7、创建与添加节点

方法名说明

document.createElement('tagName')

创建由 tagName 指定的 HTML 元素。因为这些元素原先不存在。是根据我们的需求动态生成的,所以我们也称为 动态创建元素节点

node.appendChild(child)

将一个节点添加到指定父节点的子节点列表末尾。类似于CSS里面的after伪元素。
node.insertBefore(child, 指定元素)将一个节点添加到父节点的指定子节点前面。类似于CSS里面的before为元素。
<!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><ul><li>123</li></ul><script>// 1. 创建节点元素节点var li = document.createElement('li');// 2. 添加节点 node.appendChild(child)  node 父级  child 是子级 后面追加元素  类似于数组中的pushvar ul = document.querySelector('ul');ul.appendChild(li);// 3. 添加节点 node.insertBefore(child, 指定元素);var lili = document.createElement('li');ul.insertBefore(lili, ul.children[0]);// 4. 我们想要页面添加一个新的元素 : 1. 创建元素 2. 添加元素</script>
</body></html>

8、案例:简单版发布留言

案例分析: 

  • 核心思路:点击按钮之后,就动态创建一个li,添加到ul里面
  • 创建li的同时,把文本域里面的值通过li.innerHTML赋值给li
  • 如果想要新的留言后面显示就用 appendChild如果想要前面显示就用insertBefore
<!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>// 1. 获取元素var btn = document.querySelector('button');var text = document.querySelector('textarea');var ul = document.querySelector('ul');// 2. 注册事件btn.onclick = function() {if (text.value == '') {alert('您没有输入内容');return false;} else {// console.log(text.value);// (1) 创建元素var li = document.createElement('li');// 先有li 才能赋值li.innerHTML = text.value;// (2) 添加元素// ul.appendChild(li);ul.insertBefore(li, ul.children[0]);}}</script>
</body></html>

9、删除节点

方法名说明

node.removeChild(child)

从 node节点中删除一个子节点,返回删除的节点。
<!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><button>删除</button><ul><li>熊大</li><li>熊二</li><li>光头强</li></ul><script>// 1.获取元素var ul = document.querySelector('ul');var btn = document.querySelector('button');// 2. 删除元素  node.removeChild(child)// ul.removeChild(ul.children[0]);// 3. 点击按钮依次删除里面的孩子btn.onclick = function() {if (ul.children.length == 0) {this.disabled = true;} else {ul.removeChild(ul.children[0]);}}</script>
</body></html>

10、案例:删除留言

案例分析: 

  1. 当我们把文本域里面的值赋值给li的时候,多添加一个删除的链接
  2. 需要把所有的链接获取过来,当我们点击当前的链接的时候,删除当前链接所在的li
  3. 阻止链接跳转需要添加JavaScript:void(0);或者 javascript:; 
<!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;}li a {float: right;}</style>
</head><body><textarea name="" id=""></textarea><button>发布</button><ul></ul><script>// 1. 获取元素var btn = document.querySelector('button');var text = document.querySelector('textarea');var ul = document.querySelector('ul');// 2. 注册事件btn.onclick = function() {if (text.value == '') {alert('您没有输入内容');return false;} else {// console.log(text.value);// (1) 创建元素var li = document.createElement('li');// 先有li 才能赋值li.innerHTML = text.value + "<a href='javascript:;'>删除</a>";// (2) 添加元素// ul.appendChild(li);ul.insertBefore(li, ul.children[0]);// (3) 删除元素 删除的是当前链接的li  它的父亲var as = document.querySelectorAll('a');for (var i = 0; i < as.length; i++) {as[i].onclick = function() {// node.removeChild(child); 删除的是 li 当前a所在的li  this.parentNode;ul.removeChild(this.parentNode);}}}}</script>
</body></html>

10、复制(克隆)节点

方法名说明
node.cloneNode()返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点

注意:

  1. 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
  2. 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。
<!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><ul><li>1111</li><li>2</li><li>3</li></ul><script>var ul = document.querySelector('ul');// 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容// 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容var lili = ul.children[0].cloneNode(true);ul.appendChild(lili);</script>
</body></html>

11、案例:动态生成表格

案例分析:

  1. 因为里面的学生数据都是动态的,我们需要js动态生成。这里我们模拟数据,自己定义好数据。数据我们采取对象形式1存储
  2. 所有的数据都是放在tbody里面的行里面
  3. 因为行很多,我们需要循环创建多个行(对应多少个人) 
  4. 每个行里面又有很多单元格(对应里面的数据),我们还继续使用循环创建多个单元格,并且把数据存入里面(双重for循环)
  5. 最后一列单元格是删除,需要单独创建单元格
  6. 最后添加删除操作,单击删除,可以删除当前行
<!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>table {width: 500px;margin: 100px auto;border-collapse: collapse;text-align: center;}td,th {border: 1px solid #333;}thead tr {height: 40px;background-color: #ccc;}</style>
</head><body><table cellspacing="0"><thead><tr><th>姓名</th><th>科目</th><th>成绩</th><th>操作</th></tr></thead><tbody></tbody></table><script>// 1.先去准备好学生的数据var datas = [{name: '魏璎珞',subject: 'JavaScript',score: 100}, {name: '弘历',subject: 'JavaScript',score: 98}, {name: '傅恒',subject: 'JavaScript',score: 99}, {name: '明玉',subject: 'JavaScript',score: 88}, {name: '大猪蹄子',subject: 'JavaScript',score: 0}];// 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行var tbody = document.querySelector('tbody');for (var i = 0; i < datas.length; i++) { // 外面的for循环管行 tr// 1. 创建 tr行var tr = document.createElement('tr');tbody.appendChild(tr);// 2. 行里面创建单元格(跟数据有关系的3个单元格) td 单元格的数量取决于每个对象里面的属性个数  for循环遍历对象 datas[i]for (var k in datas[i]) { // 里面的for循环管列 td// 创建单元格 var td = document.createElement('td');// 把对象里面的属性值 datas[i][k] 给 td  // console.log(datas[i][k]);td.innerHTML = datas[i][k];tr.appendChild(td);}// 3. 创建有删除2个字的单元格 var td = document.createElement('td');td.innerHTML = '<a href="javascript:;">删除 </a>';tr.appendChild(td);}// 4. 删除操作 开始 var as = document.querySelectorAll('a');for (var i = 0; i < as.length; i++) {as[i].onclick = function() {// 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)  tbody.removeChild(this.parentNode.parentNode)}}// for(var k in obj) {//     k 得到的是属性名//     obj[k] 得到是属性值// }</script>
</body></html>

 

12、创建元素的三种方式

  • document.write()
  • element.innerHTML
  • document.createElement()

区别:

  • document.write()是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
  • innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
  • innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
  • createElement() 创建多个元素效率稍低一点点,但是结构更清晰

总结:不同浏览器下,innerHTML效率要比createElement高

<!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><button>点击</button><p>abc</p><div class="inner"></div><div class="create"></div><script>// window.onload = function() {//         document.write('<div>123</div>');//     }// 三种创建元素方式区别 // 1. document.write() 创建元素  如果页面文档流加载完毕,再调用这句话会导致页面重绘// var btn = document.querySelector('button');// btn.onclick = function() {//     document.write('<div>123</div>');// }// 2. innerHTML 创建元素var inner = document.querySelector('.inner');// for (var i = 0; i <= 100; i++) {//     inner.innerHTML += '<a href="#">百度</a>'// }var arr = [];for (var i = 0; i <= 100; i++) {arr.push('<a href="#">百度</a>');}inner.innerHTML = arr.join('');// 3. document.createElement() 创建元素var create = document.querySelector('.create');for (var i = 0; i <= 100; i++) {var a = document.createElement('a');create.appendChild(a);}</script>
</body></html>

13、innerTHML和createElement效率对比

innerHTML字符串拼接方式(效率低)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>效率测试</title>
</head><body>
</body>
<script>function fn() {var d1 = +new Date();var str = '';for (var i = 0; i < 1000; i++) {document.body.innerHTML += '<div style="width:100px; height:2px; border:1px solid blue;"></div>';}var d2 = +new Date();console.log(d2 - d1);}fn();
</script></html>

createElement方式(效率一般)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>效率测试</title></head><body></body><script>function fn() {var d1 = +new Date();for (var i = 0; i < 1000; i++) {var div = document.createElement('div');div.style.width = '100px';div.style.height = '2px';div.style.border = '1px solid red';document.body.appendChild(div);}var d2 = +new Date();console.log(d2 - d1);}fn();
</script></html>

innerHTML数组方式(效率高)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>效率测试</title></head><body></body><script>function fn() {var d1 = +new Date();var array = [];for (var i = 0; i < 1000; i++) {array.push('<div style="width:100px; height:2px; border:1px solid blue;"></div>');}document.body.innerHTML = array.join('');var d2 = +new Date();console.log(d2 - d1);}fn();
</script></html>
http://www.jmfq.cn/news/4916287.html

相关文章:

  • 免费企业黄页网站入口/网络推广渠道有哪些
  • 网站新闻前置审批/免费的客户资源怎么找
  • 站嗨免费建站/关键词快速排名软件价格
  • 怎么制作单页网站/排名查询
  • 广告公司名称/百度seo分析工具
  • ui网页设计比较好培训机构/网络优化器
  • h5响应式网站源码下载/无锡网站seo
  • 怎么做公司网站/关键词
  • 网站建设公司3lue/小红书推广费用一般多少
  • 黄骅吧招聘信息/seo的作用
  • 电脑手机网站制作/防恶意竞价点击软件
  • 为什么不做网站做公众号/网络培训总结
  • 网站设计合同附件/服装店营销策划方案
  • 做通路富集分析的网站/关键词推广系统
  • wordpress 多站点迁移/重庆森林粤语完整版在线观看免费
  • 重庆网站建设公司/跨境电商培训机构哪个靠谱
  • 做优化网站注意什么/百度投诉中心24人工 客服电话
  • 江苏企业网站定制服务/怎样推广小程序平台
  • 2880元网站建设/百度游戏官网
  • 专业的培训行业网站制作/六种常见的网络广告类型
  • 淘宝的网站怎么做的好/爱站工具包官网
  • 怎么自己建一个论坛网站/哪个行业最需要推广
  • php做网站主要怎么布局/外包客服平台
  • 淘宝客网站建设难度大吗/域名解析ip地址查询
  • 网站扫码怎么做的/成都seo工程师
  • 做网站推广有效果吗/百度关键词优化
  • 魔方网站建设网站制作/网络营销策略的特点
  • 做网站是互联网开发吗/怎么做一个网页
  • 烟台做网站案例/如何做好一个网站
  • 如何做网站管理/江门seo外包公司