节点(node)

在html文档中出现的所有东西都是节点

  • 元素节点(HTML标签)

  • 文本节点(文字内容)

  • 注释节点(注释内容)

  • 文档节点(document)

每一种类型的节点都会有一些属性区分自己的特征与特性

  • nodeType: 节点类型

  • nodeName:节点名称

  • nodeValue:节点值

元素节点
nodeType:1
nodeName:”DIV” //大写的标签名
nodeValue:null //节点值

文本节点
nodeType:3
nodeName:‘text’
nodeValue:文本内容

注释节点
nodeType:8
nodeName:‘#comment’
nodeValue:注释内容

文档节点
nodeType:9
nodeName:‘#document’
nodeValue:null

描述节点关系之间的属性

parentNode

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

childNodes

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

  • 子节点:只获取儿子级别的

  • 所有:含元素节点,文本节点

children

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

  • 在ie6-8把元素节点也当做元素节点获取到,所有兼容性不好

previousSibling

获取当前节点的上一个哥哥节点(可能是元素或者文本等)

previousElementSibling

获取当前节点的上一个哥哥元素节点(不兼容ie6-8)

nextSibling

获取当前节点的下一个弟弟节点(可能是元素或者文本等)

nextElementSibling

获取当前节点的下一个弟弟元素节点(不兼容ie6-8)

firstChild

获取当前元素第一个子节点(可能是元素或者文本等)

firstElementChild

获取当前元素第一个元素子节点(不兼容ie6-8)

lastChild

获取当前元素最后一个子节点(可能是元素或者文本等)

lastElementChild

获取当前元素最后一个元素子节点(不兼容ie6-8)

需求1:获取当前元素的所有子节点

基于children不兼容ie低版本的浏览器(会把注释节点当做元素节点)

//=> 标准注释
/*
* children:获取当前元素的所有子节点 Gets all child nodes of the current element
* @parameter 参数
* curEle:current element
* @return
* [array] all the element nodes
*
* by team on 2018/04/07 12:36
* update lifei
*/
function children(curEle){
//1.先获取当前元素下所有的子节点
//2.存放新数组result
//3.遍历这些节点
//4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可
var nodeList = curEle.childrenNodes,
result = [];
for(var i = 0; i < nodeList.length; i++){
var item = nodeList[i];
if(item.nodeType === -1){
result.push(item);
}
}
return result;
}

源码如下:

<!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 id="course">
<!-- 第一阶段:原生js -->
<li>闭包,作用域,THIS,OOP</li>
<li>DOM渲染机制和性能优化</li>
<li>正则表达式解析处理</li>
<li>定时器和js异步编程</li>
<li>js中的事件模型</li>
<li>JQ实战应用和源码解读</li>
<li>JS中的设计模式:单例,发布订阅,构造,原型,Promise...</li>
<!-- 第二阶段:项目实战和响应式开发 -->
<li>Hybrid混合式响应式布局开发</li>
<li>Ajax及跨域请求</li>
<li>前后端分离和http基础</li>
<!-- 第三阶段:全栈工程化开发 -->
<li>NODE基础:能够基于Express/koa等框架编写伪API</li>
<li>VUE及全家桶:vue-cli\vue\vue-router\vuex\axios...</li>
<li>React及全家桶:react\react-dom\react-router\redux\react-redux\dva\ant...</li>
<li>webpack</li>
<li>git</li>
<!-- 第四阶段:选学 -->
<li>微信小程序</li>
<li>Canvas高级开发</li>
<li>React Native</li>
</ul>
<script>
// var course = document.getElementById
function children(curEle) {
//1.先获取当前元素下所有的子节点
//2.存放新数组result
//3.遍历这些节点
//4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可
var nodeList = curEle.childNodes,
result = [];
for (var i = 0; i < nodeList.length; i++) {
var item = nodeList[i];
if (item.nodeType === 1) {
result.push(item);
}
}
return result;
}
console.log(children(course));
 
</script>
</body>
 
</html>

效果如下:

需求2:获取当前元素的上一个哥哥元素节点

previousSibling: 上一个哥哥节点
previousElementSibling : 上一个哥哥元素节点,但不兼容ie6-8

<!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 id="course">
<!-- 第一阶段:原生js -->
<li>闭包,作用域,THIS,OOP</li>
<li>DOM渲染机制和性能优化</li>
<li>正则表达式解析处理</li>
<li>定时器和js异步编程</li>
<li>js中的事件模型</li>
<li>JQ实战应用和源码解读</li>
<li>JS中的设计模式:单例,发布订阅,构造,原型,Promise...</li>
<!-- 第二阶段:项目实战和响应式开发 -->
<li>Hybrid混合式响应式布局开发</li>
<li>Ajax及跨域请求</li>
<li>前后端分离和http基础</li>
<!-- 第三阶段:全栈工程化开发 -->
<li>NODE基础:能够基于Express/koa等框架编写伪API</li>
<li>VUE及全家桶:vue-cli\vue\vue-router\vuex\axios...</li>
<li>React及全家桶:react\react-dom\react-router\redux\react-redux\dva\ant...</li>
<li>webpack</li>
<li>git</li>
<!-- 第四阶段:选学 -->
<li id="itemN">微信小程序</li>
<li>Canvas高级开发</li>
<li>React Native</li>
</ul>
<script>
/* 标准注释:
需求2:获取当前元素的上一个哥哥元素节点
* Gets the last sibling element node of the current element 获取当前元素的上一个哥哥元素节点
* @parament参数
* curEle: [object] current element
* @return
* [object] last elder brother element
* by team on 2018/04/04 12:44
*/
function pre(curEle) {
//=>先找当前元素的哥哥的节点,看是否为元素节点,不是的话,基于哥哥找哥哥的哥哥就是上一个哥哥节点,一直找到元素节点或者已经没有哥哥了,说明我就是老大,则结束查找
// * for循环知道次数,while不知道循环次数,使用while循环
var pre = curEle.previousSibling;
while (pre && pre.nodeType !== 1){
/*
* pre && pre.nodeType !== 1 其中pre是验证还有没有,这样写代表有,没有pre是null
* pre.nodeType是验证是否为元素
*/
pre = pre.previousSibling;
}
return pre;
}
console.log(pre(itemN));
 
// 需求1:获取当前元素的所有子节点
/*
* children:获取当前元素的所有子节点 Gets all child nodes of the current element
* @parameter 参数
* curEle:current element
* @return
* [array] all the element nodes
*
* by team on 2018/04/07 12:36
* update lifei
*/
// function children(curEle) {
// //1.先获取当前元素下所有的子节点
// //2.存放新数组result
// //3.遍历这些节点
// //4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可
// var nodeList = curEle.childNodes,
// result = [];
// for (var i = 0; i < nodeList.length; i++) {
// var item = nodeList[i];
// if (item.nodeType === 1) {
// result.push(item);
// }
// }
// return result;
// }
// console.log(children(course));
</script>
</body>
 
</html>

结构如下:

扩展:next下一个弟弟元素节点,preAll获取所以哥哥元素节点,nextAll获取所以弟弟元素节点,siblings获取所有兄弟元素节点,index获取当前元素的索引…

### 节点(node)> 在html文档中出现的所有东西都是节点> - 元素节点(HTML标签)> - 文本节点(文字内容)> - 注释节点(注释内容)> - 文档节点(document)> - ...每一种类型的节点都会有一些属性区分自己的特征与特性- nodeType: 节点类型- nodeName:节点名称- nodeValue:节点值`元素节点`nodeType:1nodeName:"DIV" //大写的标签名nodeValue:null //节点值`文本节点`nodeType:3nodeName:‘text’ nodeValue:文本内容`注释节点`nodeType:8nodeName:‘#comment’nodeValue:注释内容`文档节点`nodeType:9nodeName:‘#document’nodeValue:null ###描述节点关系之间的属性**`parentNode`**> 获取当前节点唯一的父亲节点**`childNodes`**> 获取当前元素的所有子节点> - 子节点:只获取儿子级别的> - 所有:含元素节点,文本节点**`children`**> 获取当前元素所有的元素子节点> - 在ie6-8把元素节点也当做元素节点获取到,所有兼容性不好**`previousSibling`**> 获取当前节点的上一个哥哥节点(可能是元素或者文本等)**`previousElementSibling`**> 获取当前节点的上一个哥哥元素节点(不兼容ie6-8)**`nextSibling`**> 获取当前节点的下一个弟弟节点(可能是元素或者文本等)**`nextElementSibling`**> 获取当前节点的下一个弟弟元素节点(不兼容ie6-8)**`firstChild`**> 获取当前元素第一个子节点(可能是元素或者文本等)**`firstElementChild`**> 获取当前元素第一个元素子节点(不兼容ie6-8)**`lastChild`**> 获取当前元素最后一个子节点(可能是元素或者文本等)**`lastElementChild`**> 获取当前元素最后一个元素子节点(不兼容ie6-8)![Alt text](./1576551204505.png)需求1:获取当前元素的所有子节点> 基于children不兼容ie低版本的浏览器(会把注释节点当做元素节点)```javascript//=> 标准注释/** children:获取当前元素的所有子节点 Gets all child nodes of the current element* @parameter 参数* curEle:current element* @return* [array] all the element nodes* * by team on 2018/04/07 12:36* update lifei */ function children(curEle){ //1.先获取当前元素下所有的子节点 //2.存放新数组result //3.遍历这些节点 //4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可 var nodeList = curEle.childrenNodes, result = []; for(var i = 0; i < nodeList.length; i++){ var item = nodeList[i]; if(item.nodeType === -1){ result.push(item); } } return result; }```源码如下:```handlebars <!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 id="course"> <!-- 第一阶段:原生js --> <li>闭包,作用域,THIS,OOP</li> <li>DOM渲染机制和性能优化</li> <li>正则表达式解析处理</li> <li>定时器和js异步编程</li> <li>js中的事件模型</li> <li>JQ实战应用和源码解读</li> <li>JS中的设计模式:单例,发布订阅,构造,原型,Promise...</li> <!-- 第二阶段:项目实战和响应式开发 --> <li>Hybrid混合式响应式布局开发</li> <li>Ajax及跨域请求</li> <li>前后端分离和http基础</li> <!-- 第三阶段:全栈工程化开发 --> <li>NODE基础:能够基于Express/koa等框架编写伪API</li> <li>VUE及全家桶:vue-cli\vue\vue-router\vuex\axios...</li> <li>React及全家桶:react\react-dom\react-router\redux\react-redux\dva\ant...</li> <li>webpack</li> <li>git</li> <!-- 第四阶段:选学 --> <li>微信小程序</li> <li>Canvas高级开发</li> <li>React Native</li> </ul> <script> // var course = document.getElementById function children(curEle) { //1.先获取当前元素下所有的子节点 //2.存放新数组result //3.遍历这些节点 //4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可 var nodeList = curEle.childNodes, result = []; for (var i = 0; i < nodeList.length; i++) { var item = nodeList[i]; if (item.nodeType === 1) { result.push(item); } } return result; } console.log(children(course)); </script></body></html>```效果如下:![Alt text](./1576552514912.png)需求2:获取当前元素的上一个哥哥元素节点> previousSibling: 上一个哥哥节点> previousElementSibling : 上一个哥哥元素节点,但不兼容ie6-8```handlebars <!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 id="course"> <!-- 第一阶段:原生js --> <li>闭包,作用域,THIS,OOP</li> <li>DOM渲染机制和性能优化</li> <li>正则表达式解析处理</li> <li>定时器和js异步编程</li> <li>js中的事件模型</li> <li>JQ实战应用和源码解读</li> <li>JS中的设计模式:单例,发布订阅,构造,原型,Promise...</li> <!-- 第二阶段:项目实战和响应式开发 --> <li>Hybrid混合式响应式布局开发</li> <li>Ajax及跨域请求</li> <li>前后端分离和http基础</li> <!-- 第三阶段:全栈工程化开发 --> <li>NODE基础:能够基于Express/koa等框架编写伪API</li> <li>VUE及全家桶:vue-cli\vue\vue-router\vuex\axios...</li> <li>React及全家桶:react\react-dom\react-router\redux\react-redux\dva\ant...</li> <li>webpack</li> <li>git</li> <!-- 第四阶段:选学 --> <li id="itemN">微信小程序</li> <li>Canvas高级开发</li> <li>React Native</li> </ul> <script> /* 标准注释: 需求2:获取当前元素的上一个哥哥元素节点 * Gets the last sibling element node of the current element 获取当前元素的上一个哥哥元素节点 * @parament参数 * curEle: [object] current element * @return * [object] last elder brother element * by team on 2018/04/04 12:44 */ function pre(curEle) { //=>先找当前元素的哥哥的节点,看是否为元素节点,不是的话,基于哥哥找哥哥的哥哥就是上一个哥哥节点,一直找到元素节点或者已经没有哥哥了,说明我就是老大,则结束查找 // * for循环知道次数,while不知道循环次数,使用while循环 var pre = curEle.previousSibling; while (pre && pre.nodeType !== 1){ /* * pre && pre.nodeType !== 1 其中pre是验证还有没有,这样写代表有,没有pre是null * pre.nodeType是验证是否为元素 */ pre = pre.previousSibling; } return pre; } console.log(pre(itemN)); // 需求1:获取当前元素的所有子节点 /* * children:获取当前元素的所有子节点 Gets all child nodes of the current element * @parameter 参数 * curEle:current element * @return * [array] all the element nodes * * by team on 2018/04/07 12:36 * update lifei */ // function children(curEle) { // //1.先获取当前元素下所有的子节点 // //2.存放新数组result // //3.遍历这些节点 // //4.筛选出元素NODE-type===-1,把筛选出来的结果单独存储起来即可 // var nodeList = curEle.childNodes, // result = []; // for (var i = 0; i < nodeList.length; i++) { // var item = nodeList[i]; // if (item.nodeType === 1) { // result.push(item); // } // } // return result; // } // console.log(children(course)); </script></body></html> ```结构如下:![Alt text](./1576556569951.png)扩展:next下一个弟弟元素节点,preAll获取所以哥哥元素节点,nextAll获取所以弟弟元素节点,siblings获取所有兄弟元素节点,index获取当前元素的索引...

JS系列:js节点的更多相关文章

  1. Node.js系列-express(上)

    前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...

  2. Vue.js系列之三模板语法

    Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据.所有 Vue.js 的模板都是合法的 HTML ,所以能被遵循规范的浏览器和 HTML 解 ...

  3. Ember.js系列文章

    JS前端框架之Ember.js系列文章 本文为文章索引,主要是罗列Ember.js的相关文章便于阅读. 相关演示代码:github for free. 基础篇 1. EmberJs之What|Why| ...

  4. 【D3.V3.js系列教程】--(十四)有路径的文字

    [D3.V3.js系列教程]--(十四)有路径的文字 1. 在 svg 中插入一個 text // 在 body 中插入一個 svg var svg = d3.select('body').appen ...

  5. 【D3.V3.js系列教程】--(十五)SVG基本图形绘制

    [D3.V3.js系列教程]--(十五)SVG基本图形绘制 1.path <!DOCTYPE html> <html> <head> <meta charse ...

  6. 【D3.V3.js系列教程】--(十二)坐标尺度

    [D3.V3.js系列教程]--(十二)坐标尺度 1.多种类型的缩放尺度 Quantitative Scales Linear Scales Identity Scales Power Scales ...

  7. node.js系列笔记之node.js初识《一》

    node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...

  8. 微信JS图片上传与下载功能--微信JS系列文章(三)

    概述 在前面的文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的图片上传功能进行描述,供大家参考. 图片上传 $(function(){ v ...

  9. 微信JS分享功能--微信JS系列文章(二)

    概述 在上一篇文章微信JS初始化-- 微信JS系列文章(一)中已经介绍了微信JS初始化的相关工作,接下来本文继续就微信JS的分享功能进行描述,供大家参考. 代码 $(document).ready(f ...

  10. js系列教程2-对象、构造函数、对象属性全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

随机推荐

  1. nyoj 116 士兵杀敌(二)(线段树、单点更新)

    士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5   描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常 ...

  2. nyoj 1022 合纵连横 (并查集<节点删除>)

    合纵连横 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 乱世天下,诸侯割据.每个诸侯王都有一片自己的领土.但是不是所有的诸侯王都是安分守己的,实力强大的诸侯国会设法 ...

  3. 五分钟学会HTML5的WebSocket协议

    1.背景   很多网站为了实现推送技术,所用的技术都是Ajax轮询.轮询是在特定的的时间间隔由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器.这种传统的模式带来很明显的缺点 ...

  4. 源码分析RocketMQ消息轨迹

    目录 1.发送消息轨迹流程 1.1 DefaultMQProducer构造函数 1.2 SendMessageTraceHookImpl钩子函数 1.3 TraceDispatcher实现原理 2. ...

  5. python 学习路程(一)

    好早之前就一直想学python,可是一直没有系统的学习过,给自己立个flag,从今天开始一步步掌握python的用法: python是一种脚本形式的语言,据说是面向废程序员学习开发使用的,我觉得很适合 ...

  6. 2018.3.7java 学习第二天

    java 学习的第二天,首先我们要学习的是声明变量,在程序中,我们必须先声明变量,然后才可以去使用之,那么变量究竟是什么呢? 在很多课本上,有很多的定义诸如:“变量来源于数学,是计算机语言中能储存计算 ...

  7. Condition对象以及ArrayBlockingQueue阻塞队列的实现(使用Condition在队满时让生产者线程等待, 在队空时让消费者线程等待)

    Condition对象 一).Condition的定义 Condition对象:与锁关联,协调多线程间的复杂协作. 获取与锁绑定的Condition对象: Lock lock = new Reentr ...

  8. Django使用mysql数据的流程

    创建一个mysql数据库 1.打开终端(cmd): 输入: mysql -uroot -p 密码:*** 输入: create database 数据库名字; 2.在settings中进行配置 DAT ...

  9. Android开源项目和轮子

    推荐查看Github最全面的Android开源项目汇总 功能框架 数据库 ORMLite框架 greenDaoMaster框架 Xutils的DButils ORMLitehe和greenDaoMas ...

  10. 我的书籍《深入解析Java编译器:源码剖析与实例详解》就要出版了

    一个十足的技术迷,2013年毕业,做过ERP.游戏.计算广告,在大公司呆过,但终究不满足仅对技术的应用,在2018年末离开了公司,全职写了一本书<深入解析Java编译器:源码剖析与实例详解> ...