firstChild  第一个子元素

lastChild  最后一个子元素

childNodes[n]  =   childNodes.item(n)    第n+1个子元素

parentNode  父元素

nextSibling  下一个兄弟元素

previousSibling  上一个兄弟元素

document.documentElement 获取文档的根节点

.tagName 标签名

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){
var oHtml=document.documentElement;
console.log(oHtml); var oHead=oHtml.firstChild;//获取html的第一个子元素节点
var oHead=oHtml.childNodes[0];
var oHead=oHtml.childNodes.item(0);
console.log(oHead); var oBody=oHtml.childNodes[1];
console.log(oBody);
});
</script>
</head>
<body> </body>
</html>

会返回head与body之间的空白文本节点(除了IE8以下的浏览器会忽略这个空白文本节点)

任何节点都可以通过 .ownerDocument 获得根元素节点

.hasChildNodes() 判断元素是否含有子节点

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){
var oHtml=document.documentElement;
console.log(oHtml);//获取根元素节点 var oHead=oHtml.firstChild;//获取html的第一个子元素节点
var oHead=oHtml.childNodes[0];
var oHead=oHtml.childNodes.item(0);
console.log(oHead); var oBody=oHtml.childNodes[1];
console.log(oBody); console.log(oHead.parentNode==oHtml);//true
console.log(oBody.parentNode==oHtml);//true console.log(oHead.nextSibling==oBody);//true
console.log(oBody.previousSibling==oHead);//true console.log(box.ownerDocument);
console.log(oHtml);
console.log(box.ownerDocument==document);//true
console.log(box.ownerDocument==oHtml);//false
console.log(box.ownerDocument==oHtml.parentNode);//true 文档的根元素节点的父元素节点=文档节点 console.log(box.hasChildNodes());//true
console.log(box.childNodes[0].hasChildNodes());//false }); </script>
</head>
<body>
<div id="box">这是box</div>
</body>
</html>

HTML结构树打印

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var s="";
function travelNode(space,node){
// 如果不是空白节点
if(node.tagName){
s+=space+node.tagName+"<br>";
}
var len=node.childNodes.length;//获取该元素的子元素长度
for(var i=0;i<len;i++){
travelNode(space+"|-",node.childNodes[i]);
} }
travelNode("",document);
document.write(s); }); </script>
</head>
<body>
<div id="box">
<ul>
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

只获取元素节点,而过滤空白文本节点

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
for(var i=0,len=ul.childNodes.length;i<len;i++){
if(ul.childNodes[i].nodeType==1){//判断是否是元素节点
console.log(ul.childNodes[i]);
}
} }); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

一组只获取元素节点的API

firstElementChild 第一个元素子节点(直接子元素节点,而不是后代子元素节点)

lastElementChild 最后一个元素子节点(直接子元素节点,而不是后代子元素节点)

previousElementSibling  上一个兄弟元素

nextElementSibling 下一个兄弟元素

children[n] 第n+1个子元素节点

childElementCount 子元素节点数量

兼容性:IE9+

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
for(var i=0,len=ul.childElementCount;i<len;i++){
console.log(ul.children[i]);
} }); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

NodeList 类数组对象

可以通过[]来访问,有item方法和length属性

使用ele.childNodes即可获取到nodeList

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
console.log(ul.childNodes[1]);//<li>item1</li>
console.log(ul.childNodes.item(1));//<li>item1</li> }); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

类数组对象不是数组

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
ul.childNodes.push("<li>item6</li>");//Uncaught TypeError: ul.childNodes.push is not a function at HTMLDocument.<anonymous> }); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

接下来将类数组对象转为数组

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
//ul.childNodes.push("<li>item6</li>");//Uncaught TypeError: ul.childNodes.push is not a function at HTMLDocument.<anonymous> function toArray(nodeList){
var arr=null;
arr=new Array();
for(var i=0,len=nodeList.length;i<len;i++){
arr.push(nodeList[i]);
}
return arr;
} var newNodeList=toArray(ul.childNodes);
newNodeList.push("<li>item6</li>");
console.log(newNodeList);//(12) [text, li, text, li, text, li, text, li, text, li, text, "<li>item6</li>"]
}); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

Array.prototype.slice.call() 可以将类数组对象转为数组,但是在低版本IE中会报错

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
//ul.childNodes.push("<li>item6</li>");//Uncaught TypeError: ul.childNodes.push is not a function at HTMLDocument.<anonymous> var newNodeList=Array.prototype.slice.call(ul.childNodes);
newNodeList.push("<li>item6</li>");
console.log(newNodeList);//(12) [text, li, text, li, text, li, text, li, text, li, text, "<li>item6</li>"]
}); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

下面是兼容低版本IE的写法

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ul=document.getElementById("ul");
console.log(ul.childNodes);//NodeList(11) [text, li, text, li, text, li, text, li, text, li, text]
//ul.childNodes.push("<li>item6</li>");//Uncaught TypeError: ul.childNodes.push is not a function at HTMLDocument.<anonymous> function toArray(nodeList){
var arr=null;
try{
var newNodeList=Array.prototype.slice.call(nodeList);
return newNodeList;
}catch(e){
arr=new Array();
for(var i=0,len=nodeList.length;i<len;i++){
arr.push(nodeList[i]);
}
return arr;
}
}
var newNodeList=toArray(ul.childNodes);
newNodeList.push("<li>item6</li>");
console.log(newNodeList);
}); </script>
</head>
<body>
<div id="box">
<ul id="ul">
<li>item1</li>
<li>item2</li>
<li>item3</li>
<li>item4</li>
<li>item5</li>
</ul>
</div>
</body>
</html>

类数组对象HTMLCollection

ele.getElementsByTagName() 获取所有该标签的元素集合

document.scripts  scripts元素集合

document.links  所有的a标签

document.images  image集合

document.forms  form表单集合

tr.cells  tr下的所有td集合

select.options  select下的所有option元素集合

HTMLCollection中有name  item  namedItem

.namedItem(value)

首先尝试返回有id=value的元素

如果没有,就返回name=value的元素

注意只返回一个

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var ps=document.getElementsByTagName("p");
var scripts=document.scripts;
var links=document.links;
var forms=document.forms;
var images=document.images;
var tds=document.getElementById("tr1").cells;
var options=document.getElementById("select").options; console.log(ps);//HTMLCollection(2) [p, p]
console.log(scripts);//HTMLCollection(2) [script, script]
console.log(links);//HTMLCollection(2) [a, a]
console.log(forms);//HTMLCollection(2) [form, form]
console.log(images);//HTMLCollection(2) [img, img]
console.log(tds);//HTMLCollection(4) [td, td, td, td]
console.log(options);//HTMLOptionsCollection(3) [option, option, option, selectedIndex: 0] console.log(tds.namedItem("td"));//<td id="td">1</td> }); </script>
</head>
<body>
<p>这是p标签1</p>
<p>这是p标签2</p> <a href="#">这是a链接1</a>
<a href="#">这是a链接2</a> <form action="">
<select name="select" id="select">
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
</form>
<form action="">
</form> <img src="source/cat-little.jpg" alt="">
<img src="source/cat-little.jpg" alt=""> <table>
<tr id="tr1">
<td id="td">1</td>
<td name="td">2</td>
<td name="td">3</td>
<td>4</td>
</tr>
</table> </body>
</html>

类数组对象namedNodeMap

通过.attributes得到

获取元素的所有属性,包括系统自带属性和自定义属性

有item方法和length属性

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var list=document.getElementById("list");
var attrs=list.attributes; console.log(attrs);//NamedNodeMap {0: id, 1: data-url, 2: data-action, id: id, data-url: data-url, data-action: data-action, length: 3}
console.log(attrs.length);//3
console.log(attrs[0]);//id="list"
console.log(attrs.item(1));//data-url="index.html" }); </script>
</head>
<body>
<ul id="list" data-url="index.html" data-action="submit">
<li></li>
<li></li>
<li></li>
</ul>
</body>
</html>

类数组对象:nodeList   HTMLCollection   namedNodeMap

都具有动态性

每当文档结构发生变化时,就会随之更新

appendChild() 追加子元素

证明:尝试获取到最初div元素的个数,并且在页面中追加同等个数的div(即数量加倍的效果)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var divs=document.getElementsByTagName("div");//HTMLCollection类数组对象
var i=0;
while(i<divs.length){
document.body.appendChild(document.createElement("div"));
i++;
} }); </script>
</head>
<body>
<div></div>
<div></div>
<div></div>
</body>
</html>

结果页面崩溃

原因是每次在循环时,会重新计算div元素的个数,导致div元素的个数永远都在动态改变,导致while循环无法结束

解决方法是将最初div元素的个数用一个变量保存起来

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
body{
width:100%;
height:100%;
}
</style>
<script src="DomReady.js"></script>
<script>
myReady(function(){ var divs=document.getElementsByTagName("div");//HTMLCollection类数组对象
var i=0;
var length=divs.length;
while(i<length){
document.body.appendChild(document.createElement("div"));
i++;
} }); </script>
</head>
<body>
<div></div>
<div></div>
<div></div>
</body>
</html>

js中的节点遍历+类数组对象的更多相关文章

  1. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比

    原文地址 在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型, ...

  2. JS中集合对象(Array、Map、Set)及类数组对象的使用与对比(转载)

    在使用js编程的时候,常常会用到集合对象,集合对象其实是一种泛型,在js中没有明确的规定其内元素的类型,但在强类型语言譬如Java中泛型强制要求指定类型. ES6引入了iterable类型,Array ...

  3. js之数组,对象,类数组对象

    许久不写了,实在是不知道写点什么,正好最近有个同事问了个问题,关于数组,对象和类数组的,仔细说起来都是基础,其实都没什么好讲的,不过看到还是有很多朋友有些迷糊,这里就简单对于定义以及一下相同点,不同点 ...

  4. 浅谈JavaScript和DOM中的类数组对象

    JavaScript是一门弱类型语言,它的数据类型分为两大类:简单数据类型(5种:Undefined.Null.Boolean.Number.String)和复杂数据类型(1种:Object).Obj ...

  5. js- 类数组对象

    JavaScript中,数组是一个特殊的对象,其property名为正整数,且其length属性会随着数组成员的增减而发生变化,同时又从Array构造函数中继承了一些用于进行数组操作的方法. 而对于一 ...

  6. 如何在JavaScript中手动创建类数组对象

    前言 关于什么是js的类数组对象这里不再赘述.可以参考这个链接,还有这里. js中类数组对象很多,概念简单的讲就是看上去像数组,又不是数组,可以使用数字下标方式访问又没有数组方法. 例: argume ...

  7. 浅谈js的类数组对象arguments

    类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...

  8. JavaScript中的类数组对象

    在javascript中,对象与数组都是这门语言的原生规范中的基本数据类型,处于并列的位置. 一般来说,如果我们有一个对象obj和一个数组a: obj["attr1"];    / ...

  9. 什么是“类数组对象”,在jquer中怎样将类数组对象转换为数组对象

    类数组对象的定义: 所谓"类数组对象"就是一个常规的Object对象,如$("div")但它和数组对象非常相似:具备length属性, 并以0.1.2.3……等 ...

随机推荐

  1. js笔记(2)--第一天记录

    ---恢复内容开始--- 模仿了网站的一个常见小功能,开关灯小功能. 代码: <!DOCTYPE html> <html lang="en"> <he ...

  2. python 中的反斜杠匹配的问题

    关于反斜杠的匹配问题可以参考: https://www.cnblogs.com/mzc1997/p/7689235.html 文章中提出了两个概念: 字符串转义和正则转义,我觉得是理解反斜杠的关键所在 ...

  3. Codeforces_327_C

    http://codeforces.com/problemset/problem/327/C 等比求和相加,有mod的出现,所以要算逆元. #include<iostream> #incl ...

  4. CentOS7 Cloudera Manager6 完全离线安装 CDH6 集群

    本文是在CentOS7.4 下进行CDH6集群的完全离线部署.CDH5集群与CDH6集群的部署区别比较大. 说明:本文内容所有操作都是在root用户下进行的. 文件下载 首先一些安装CDH6集群的必须 ...

  5. 《Head first设计模式》学习笔记

    1. 单例模式 2. 工厂模式 3. 抽象工厂 4. 策略模式 5. 观察者模式 6. 装饰者模式 7. 命令模式 8. 适配器模式 9. 外观模式 10. 模版方法模式 11. 迭代器模式 设计模式 ...

  6. 小cookie,大智慧

    Cookie是什么?cookies是你访问网站时创建的数据片段文件,通过保存浏览信息,它们使你的在线体验更加轻松. 使用cookies,可以使你保持在线登录状态,记录你的站点偏好,并为你提供本地化支持 ...

  7. ajax 解决中文乱码问题

    最近遇到了ajax 中文乱码的问题.下面总结一下 1. HTTP协议的编码规定 在HTTP协议中,浏览器不能向服务器直接传递某些特殊字符,必须是这些字符进行URL编码后再进行传送.url编码遵循的规则 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统--网页版本代码生成器

    1.单列表模式 2.树形列表模式 3.左右列表模式 4.左右树形和列表结合模式 一 简介 网页版代码生成器需要运行项目,非常有趣,可以用来研究,和自定义一些自己的代码习惯 按界面生成:可生成单个页面和 ...

  9. 接口测试:http状态码

    http状态码 每发出一个http请求之后,都会有一个响应,http本身会有一个状态码,来标示这个请求是否成功,常见的状态码有以下几种:1.200 2开头的都表示这个请求发送成功,最常见的就是200, ...

  10. tomcat 多端口 多容器 多域名 配置

    先强调一个原则: server下面可以有多个service,用于配置不同监听端口 service下面可以有多个Host,用于配置该端口下的不同域名 Host里可以包含多个Context,用于配置该端口 ...