js中firstChild和childNodes[0]以及children[0]之间的点滴问题
2017-03-11 16:41
519 查看
示例:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>js中firstChild和childNodes[0]以及children[0]之间的点滴问题</title>
</head>
<body>
<div id="div1">
<p>
pppppppppppppppp
</p>
</div>
<script type="text/javascript">
window.onload = function() {
if (!document.getElementById("div1")) return false;
var div1 = document.getElementById("div1");
console.log(div1.firstChild);
console.log(div1.firstChild.nodeType);
console.log(div1.childNodes[0]);
console.log(div1.childNodes[0].nodeType);
console.log(div1.children[0]);
console.log(div1.children[0].nodeType);
console.log(document.getElementsByTagName("p")[0].firstChild.nodeValue);
};
</script>
</body>
</html>
运行结果入下:
分析:
从上面的代码以及运行结果可以看出,当使用上述三种方法去获取div1的第一个子元素(节点)的时候,本希望可以直接得到p元素,可是呢,三者的却出现了不一样的运行结果,firstChild和childNodes[0]的运行结果一样,都是将一个文本节点当做了div1的第一个子节点,这显然不是希望得到的结果,可是,这个文本节点是哪儿来的呢?原来,这两种方法都会将换行当做一个节点,即上面出现的文本节点。(从后面用firstChild打印p元素的节点值也可以看出,里面是包含了前后换行的)
而我们的children[0]的方法却显示出了“希望”的结果,是在与它的认知方式与前两个不一样,它只认识文档里面的HTML节点,而不会把换行也当做一个节点进行处理,即是说它是不认识文本节点的,所以,就可以得到元素节点p了。
分析过后,下面更改部分代码看看效果:
将
<div id="div1">
<p>
pppppppppppppppp
</p>
</div>改为
<div id="div1"><p>pppppppppppppppp</p></div>
并将
console.log(document.getElementsByTagName("p")[0].firstChild.nodeValue);
改为
console.log(document.getElementsByTagName("p")[0].firstChild);
console.log(document.getElementsByTagName("p")[0].childNodes[0]);
console.log(document.getElementsByTagName("p")[0].children[0]);
再次运行可得如下结果:
由上可以看出,当把div里面的换行都去除之后,三种方式都可以得到“一致”(姑且认为一致)的运行结果,即都将p元素作为它们的第一节点。从后面的三行打印结果可以证实children是真不认识文本节点的。不过,需要注意的是,firstChild和childNodes才是标准的,而遗憾的是children不是标准的。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>js中firstChild和childNodes[0]以及children[0]之间的点滴问题</title>
</head>
<body>
<div id="div1">
<p>
pppppppppppppppp
</p>
</div>
<script type="text/javascript">
window.onload = function() {
if (!document.getElementById("div1")) return false;
var div1 = document.getElementById("div1");
console.log(div1.firstChild);
console.log(div1.firstChild.nodeType);
console.log(div1.childNodes[0]);
console.log(div1.childNodes[0].nodeType);
console.log(div1.children[0]);
console.log(div1.children[0].nodeType);
console.log(document.getElementsByTagName("p")[0].firstChild.nodeValue);
};
</script>
</body>
</html>
运行结果入下:
分析:
从上面的代码以及运行结果可以看出,当使用上述三种方法去获取div1的第一个子元素(节点)的时候,本希望可以直接得到p元素,可是呢,三者的却出现了不一样的运行结果,firstChild和childNodes[0]的运行结果一样,都是将一个文本节点当做了div1的第一个子节点,这显然不是希望得到的结果,可是,这个文本节点是哪儿来的呢?原来,这两种方法都会将换行当做一个节点,即上面出现的文本节点。(从后面用firstChild打印p元素的节点值也可以看出,里面是包含了前后换行的)
而我们的children[0]的方法却显示出了“希望”的结果,是在与它的认知方式与前两个不一样,它只认识文档里面的HTML节点,而不会把换行也当做一个节点进行处理,即是说它是不认识文本节点的,所以,就可以得到元素节点p了。
分析过后,下面更改部分代码看看效果:
将
<div id="div1">
<p>
pppppppppppppppp
</p>
</div>改为
<div id="div1"><p>pppppppppppppppp</p></div>
并将
console.log(document.getElementsByTagName("p")[0].firstChild.nodeValue);
改为
console.log(document.getElementsByTagName("p")[0].firstChild);
console.log(document.getElementsByTagName("p")[0].childNodes[0]);
console.log(document.getElementsByTagName("p")[0].children[0]);
再次运行可得如下结果:
由上可以看出,当把div里面的换行都去除之后,三种方式都可以得到“一致”(姑且认为一致)的运行结果,即都将p元素作为它们的第一节点。从后面的三行打印结果可以证实children是真不认识文本节点的。不过,需要注意的是,firstChild和childNodes才是标准的,而遗憾的是children不是标准的。
相关文章推荐
- Js中parentNode,parentElement,childNodes,children之间的区别
- js下firstElementChild firstChild 以及childNodes和children方法
- Js中parentNode,parentElement,childNodes,children之间的区别
- Js中parentNode,parentElement,childNodes,children之间的区别
- js页面之间以及vue $http请求向后台传递参数中文乱码问题解决
- 浅谈childNodes和children以及firstChild和firstElementChild
- js、java、jsp页面三者之间的传值问题,包括ajax的返回参数
- 高性能JS--比较nextSibling,ChildNodes,Children速度
- JS中 字符问题(二/十/十六进制及ASCII码之间的转换)
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- js中window.showModalDialog各浏览器居中和传参实例兼以及一些兼容性问题
- Js-parentNode、parentElement,childNodes、children 它们有什么区别呢?
- ajax+jsp 以及js编码处理问题
- Js-parentNode、parentElement,childNodes、children 它们有什么区别呢?
- document.write 方式引入外部 JS 文件导致脚本程序执行顺序不同以及 DOM 树更新延迟问题
- Django中的Model定义和各Model之间的一对一、多对一,多对多关系以及级联查询的问题
- C# char和byte 以及string之间的转换问题
- JS中字符问题(二进制/十进制/十六进制及ASCII码之间的转换)
- pligg9.7beta的后HTML编辑器插件的安装(tinymce_2_1_1_1)(以及使用中遇到的点滴问题解决办法)
- jseclipse的安装以及中文问题