ChildNodes详解及其兼容性处理方式
写在前面:在做insertBefore插入节点练习时发现一个问题,插入childNodes[0]和childNodes[1]时插入的位置是一样的!于是有了childNodes的了解,有了这篇文章,欢迎交流,欢迎拍砖。
本文包括如下:
1、DOM 常用节点类型说明
2、childNodes.Length详解
3、节点中取值问题
4、childNodes兼容性处理
说明:本文综合网上其它博文对于childNodes的详解。
1、DOM 常用节点类型说明:
| NodeType | NodeName | |
|---|---|---|
| 1 | ELEMENT_NODE | 元素节点 |
| 2 | ATTRIBUTE_NODE | 属性节点 |
| 3 | TEXT_NODE | 文本节点 |
| 4 | COMMENT_NODE | 注释节点 |
| 5 | DOCUMENT_NODE | 文档节点 |
对于元素节点、属性节点、文本节点的理解请戳这里
2、childNodes.Length详解
我们都知道js操作document时,使用childNodes取得节点的子节点个数时,在IE6、7、8下时完全没有问题的,但是在其它浏览器下使用childNodes获取节点,它会将空格符、回车符、换行符也看做一个文本节点,使得节点长度不是我们想要的,我们看一下如下示例:
代码部分:
<div id="div1">
<p id="fg">1</p>
<p>2</p>
</div> js
var c=document.getElementById("div1");
alert(c.childNodes.length);
alert(c.childNodes[0].nodeName);
alert(c.childNodes[1].nodeName);
alert(c.childNodes[2].nodeName);
alert(c.childNodes[3].nodeName);
alert(c.childNodes[4].nodeName);
alert(c.childNodes[5].nodeName);
获取到的childNodes长度及其nodeName如下图所示,通过下图我们可以了解到换行符被看成文本节点,如果是在IE6,7,8中则为(2、p、p);

如果我们把HTML代码改成如下,则结果为:
<div id="div1"><p id="fg">1</p><p>2</p></div>

所以就如我们前面所说在浏览器中childNodes连一个回车符都不放过!
3、节点中取值问题
<div id="div1">
<p id="fg">1</p>
<p>2</p>
</div>
我们把上个小节中代码nodeName换成NodeValue,看一下结果如图

不科学啊!为什么<p>的nodeValue值会为空!
原因在于<p>1</p>,元素节点 <p>,拥有一个值为 "1" 的文本节点。1并不是元素节点p的值
那么我们若想取到<p>中的数字1怎么办,我们需要获得的是<p>的childNodes的nodeValue值
var divNodes=document.getElementById("div1").getElementsByTagName("p");
alert(divNodes[0].childNodes[0].nodeValue);
或者
var pp=document.getElementById("fg");
alert(fg.childNodes[0].nodeValue);
4、childNodes兼容性处理
我们可以通过判断div子节点的个数是否等于子节点元素节点的个数,若等于,继续操作,若不等于,可通过新建一个数组,找出div子节点的元素节点填入数组,然后对数组进行操作,我们以insertBefore()插入节点为例,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title></title>
<link rel="stylesheet" href="">
</head>
<body>
<div id="div1">
<p id="fg">1</p>
<p>2</p>
</div> <button onclick="test()">插入节点</button>
<script>
function test()
{
var a=document.createElement("p");
var textNodes=document.createTextNode("我是将要插入的节点");
a.appendChild(textNodes);
var c=document.getElementById("div1");
var divNodes=document.getElementById("div1").getElementsByTagName("p");//计算子节点<p>的个数
if(c.childNodes.length!=divNodes.length)
{
var rows=[];
for(var i=0;i<c.childNodes.length;i++)
{
if(c.childNodes[i].nodeType==1)//类型为1表示为元素节点
{
rows.push(c.childNodes[i]);//填入数组
}
}
c.insertBefore(a,rows[0]);
}
else{
c.insertBefore(a,c.childNodes[0]);//适用于IE6、7、8
}
}</script>
</body>
</html>
这样插入时childNodes[0]和childNodes[1]插入的位置就不一样啦。
ChildNodes详解及其兼容性处理方式的更多相关文章
- react目录结构、demo实例详解、属性数据绑定方式
1.目录结构 2.demo实例详解 a)创建Home.js import React, { Component } from 'react'; //创建一个组件必须要集成Component组件,且组件 ...
- js的client、scroll、offset详解与兼容性
clientWidth:可视区宽说明:样式宽+padding参考:js的client详解 scrollTop : 滚动条滚动距离说明:chrome下他会以为滚动条是文档元素的,所以需要做兼容:var ...
- kafka的server.properties配置文件参考示范(图文详解)(多种方式)
简单点的,就是 kafka_2.11-0.8.2.2.tgz的3节点集群的下载.安装和配置(图文详解) 但是呢,大家在实际工作中,会一定要去牵扯到调参数和调优问题的.以下,是我给大家分享的kafka的 ...
- Android开发之基本控件和详解四种布局方式
Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方 ...
- Spring事务之详解--三种实现方式
实现购买股票案例: 一.引入JAR文件: 二.开始搭建分层架构---创建账户(Account)和股票(Stock)实体类 Account: /* * 账户 */ public class Accoun ...
- 详解JavaScript对象继承方式
一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数成为 Children 的方法,然 ...
- Android-基本控件和详解四种布局方式
转自:https://www.cnblogs.com/ludashi/p/4883915.html 一.常用基本控件 1.TextView 看到Android中的TextView, 我不禁的想到了iO ...
- Nginx深入详解之upstream分配方式
一.分配方式 Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式: 1.轮询 轮询是upstream的默认分配方式 ...
- Spring学习(五)bean装配详解之 【XML方式配置】
一.配置Bean的方式及选择 配置方式 在 XML 文件中显式配置 在 Java 的接口和类中实现配置 隐式 Bean 的发现机制和自动装配原则 方式选择的原则 最优先:通过隐式 Bean 的发现机制 ...
随机推荐
- LINQ To XML的一些方法
1.Elements() 返回XML文档或片段的所有第一级元素. 2.Descendants() 返回XML文档或片段中的所有子元素(所有级别的子元素). 3.Attributes() 返回当前选中元 ...
- asp.net中Repeart选中整行操作
<asp:Repeater runat="server" ID="rpt_Student"> <HeaderTemplate> < ...
- 2014年1月9日 Oracle 实用系统函数
1.空值处理 1.1 NVL(column/value,VALUE2) 与SQLSERVER的ISNULL相同 1.2 NVL2(column/value,Value2,Value3) 若参数1为空则 ...
- B - Maya Calendar(第二季水)
Description During his last sabbatical, professor M. A. Ya made a surprising discovery about the old ...
- java+mysql中文乱码问题
乱码问题原因有多种,其中有一种是由于MySQL默认使用 ISO-8859-1 ( 即Latin1 ) 字符集,而JAVA内部使用Unicode编码,因此在JAVA中向MYSQL数据库插入数据时,或者读 ...
- Android 开发使用lambda实现< JDK8兼容
代码精简无疑是每个程序员的目标,简短易读.java 8中的lambda表达式的使用: 4 easy steps Download and install jdk8. Add the following ...
- CS0016: 未能写入输出文件*****目录名称无效
一大早,杀毒软件弹出删除隐私记录.清理空间一堆堆的提醒,一般我都是无视它,今天顺便点了下清理,然后出问题. 昨晚下班提交的代码,程序运行好好地,今早清理完系统,竟然就出问题了, 具体如下 CS0016 ...
- HD1083 二分图,匈牙利算法
#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stdio.h> #include<stdlib. ...
- java学习:AWT组件和事件处理的笔记(1)--文本框上的ActionEvent事件
学习处理事件时,必须很好的掌握事件源,监视器,处理事件的接口 1.事件源 能够产生java认可事件的对象都可称为事件源,也就是说事件源必须是对象 2.监视器 监 ...
- ASP.NET MVC5+ORACLE 身份认证
菜鸟来的,刚接触mvc,看到mvc5上默认带有identity身份验证的东西,公司用的oracle数据库,便想着东西能不能支持oracle数据库,折腾了半天弄出下面的东西来,有些东西可能不太准确,望大 ...