深入理解DOM节点关系

前面的话

  DOM可以将任何HTML描绘成一个由多层节点构成的结构。节点分为12种不同类型,每种类型分别表示文档中不同的信息及标记。每个节点都拥有各自的特点、数据和方法,也与其他节点存在某种关系。节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形结构。本文将详细描述DOM间的节点关系

  节点中的各种关系可以用传统的家族关系来描述,相当于把文档树比喻成家谱。接下来,将把DOM节点关系分为属性和方法两部分进行详细说明

 

属性

父级属性

parentNode

  每个节点都有一个parentNode属性,该属性指向文档树中的父节点。对于一个节点来说,它的父节点只可能是三种类型:element节点、document节点和documentfragment节点。如果不存在,则返回null

<div id="myDiv"></div>
<script>
console.log(myDiv.parentNode);//body
console.log(document.body.parentNode);//html
console.log(document.documentElement.parentNode);//document
console.log(document.parentNode);//null
</script>
<div id="myDiv"></div>
<script>
var myDiv = document.getElementById('myDiv');
console.log(myDiv.parentNode);//body
var fragment = document.createDocumentFragment();
fragment.appendChild(myDiv);
console.log(myDiv.parentNode);//document-fragment
</script>

parentElement

  与parentNode属性不同的是,parentElement返回的是父元素节点

<div id="myDiv"></div>
<script>
console.log(myDiv.parentElement);//body
console.log(document.body.parentElement);//html
console.log(document.documentElement.parentElement);//null
console.log(document.parentElement);//null
</script>

   [注意]在IE浏览器中,只有Element元素节点才有该属性,其他浏览器则是所有类型的节点都有该属性

<div id="test">123</div>
<script>
//IE浏览器返回undefined,其他浏览器返回<div id="test">123</div>
console.log(test.firstChild.parentElement);
//所有浏览器都返回<body>
console.log(test.parentElement);
</script>

 

子级属性

childNodes

  childNodes是一个只读的类数组对象NodeList对象,它保存着该节点的第一层子节点

<ul id="myUl"><li><div></div></li></ul>
<script>
var myUl = document.getElementById('myUl');
//结果是只包含一个li元素的类数组对象[li]
console.log(myUl.childNodes);
</script>

children

  children是一个只读的类数组对象HTMLCollection对象,但它保存的是该节点的第一层元素子节点

<div id="myDiv">123</div>
<script>
var myDiv = document.getElementById('myDiv');
//childNodes包含所有类型的节点,所以输出[text]
console.log(myDiv.childNodes);
//children只包含元素节点,所以输出[]
console.log(myDiv.children);
</script>

childElementCount

  返回子元素节点的个数,相当于children.length

  [注意]IE8-浏览器不支持

<ul id="myUl">
<li></li>
<li></li>
</ul>
<script>
var myUl = document.getElementById('myUl');
console.log(myUl.childNodes.length);//5,IE8-浏览器返回2,因为不包括空文本节点
console.log(myUl.children.length);//2
console.log(myUl.childElementCount);//2,IE8-浏览器返回undefined
</script>

firstChild

  第一个子节点

lastChild

  最后一个子节点

firstElementChild

  第一个元素子节点

lastElementChild

  最后一个元素子节点 

  上面四个属性,IE8-浏览器和标准浏览器的表现并不一致。IE8-浏览器不考虑空白文本节点,且不支持firstElementChild和lastElementChild

//ul标签和li标签之间有两个空白文本节点,所以按照标准来说,ul的子节点包括[空白文本节点、li元素节点、空白文本节点]。但在IE8-浏览器中,ul的子节点只包括[li元素节点]
<ul>
<li></li>
</ul>
<ul id="list">
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
<script>
console.log(list.firstChild);//标准浏览器中返回空白文本节点,IE8-浏览器中返回<li>1</li>
console.log(list.lastChild);//标准浏览器中返回空白文本节点,IE8-浏览器中返回<li>3</li>
console.log(list.firstElementChild);//标准浏览器中<li>1</li>,IE8-浏览器中返回undefined
console.log(list.lastElementChild);//标准浏览器中<li>3</li>,IE8-浏览器中返回undefined
</script>

 

同级属性

nextSibling

  后一个节点

previousSibling

  前一个节点

nextElementSibling

  后一个元素节点

previousElementSibling

  前一个元素节点

  与子级属性类似,上面四个属性,IE8-浏览器和标准浏览器的表现并不一致。IE8-浏览器不考虑空白文本节点,且不支持nextElementSibling和previousElementSibling

<ul>
<li>1</li>
<li id="myLi">2</li>
<li>3</li>
</ul>
<script>
var myLi = document.getElementById('myLi');
console.log(myLi.nextSibling);//空白节点,IE8-浏览器返回<li>3</li>
console.log(myLi.nextElementSibling);//<li>3</li>,IE8-浏览器返回undefined
console.log(myLi.previousSibling);//空白节点,IE8-浏览器返回<li>1</li>
console.log(myLi.previousElementSibling);//<li>1</li>,IE8-浏览器返回undefined
</script>

 

方法

包含方法

hasChildNodes()

  hasChildNodes()方法在包含一个或多个子节点时返回true,比查询childNodes列表的length属性更简单

<div id="myDiv">123</div>
<script>
var myDiv = document.getElementById('myDiv');
console.log(myDiv.childNodes.length);//1
console.log(myDiv.hasChildNodes());//true
</script>
<div id="myDiv"></div>
<script>
var myDiv = document.getElementById('myDiv');
console.log(myDiv.childNodes.length);//0
console.log(myDiv.hasChildNodes());//false
</script>

contains()

  contains方法接受一个节点作为参数,返回一个布尔值,表示参数节点是否为当前节点的后代节点。参数为后代节点即可,不一定是第一层子节点 

<div id="myDiv">
<ul id="myUl">
<li id="myLi"></li>
<li></li>
</ul>
</div>
<script>
console.log(myDiv.contains(myLi));//true
console.log(myDiv.contains(myUl));//true
console.log(myDiv.contains(myDiv));//true
</script>

  [注意]IE和safari不支持document.contains()方法,只支持元素节点的contains()方法

//IE和safari报错,其他浏览器返回true
console.log(document.contains(document.body));

 

关系方法

compareDocumentPosition()

  compareDocumentPosition方法用于确定节点间的关系,返回一个表示该关系的位掩码

000000    0     两个节点相同
000001    1     两个节点不在同一个文档(即有一个节点不在当前文档)
000010    2     参数节点在当前节点的前面
000100    4     参数节点在当前节点的后面
001000    8     参数节点包含当前节点
010000    16    当前节点包含参数节点
100000    32    浏览器的私有用途
<div id="myDiv">
<ul id="myUl">
<li id="myLi1"></li>
<li id="myLi2"></li>
</ul>
</div>
<script>
//20=16 4,因为myUl节点被myDiv节点包含,也位于myDiv节点的后面
console.log(myDiv.compareDocumentPosition(myUl));
//10=8 2,因为myDiv节点包含myUl节点,也位于myUl节点的前面
console.log(myUl.compareDocumentPosition(myDiv));
//0,两个节点相同
console.log(myDiv.compareDocumentPosition(myDiv));
//4,myLi2在myLi1节点的后面
console.log(myLi1.compareDocumentPosition(myLi2));
//2,myLi1在myLi2节点的前面
console.log(myLi2.compareDocumentPosition(myLi1));
</script>

isSameNode()和isEqualNode()

  这两个方法都接受一个节点参数,并在传入节点与引用节点相同或相等时返回true

  所谓相同(same),指的是两个节点引用的是同一个对象

  所谓相等(equal),指的是两个节点是相同的类型,具有相等的属性(nodeName、nodeValue等等),而且它们的attributes和childNodes属性也相等(相同位置包含相同的值)

  [注意]firefox不支持isSameNode()方法,而IE8-浏览器两个方法都不支持

<script>
var div1 = document.createElement('div');
div1.setAttribute("title","test");
var div2 = document.createElement('div');
div2.setAttribute("title","test");
console.log(div1.isSameNode(div1));//true
console.log(div1.isEqualNode(div2));//true
console.log(div1.isSameNode(div2));//false
</script>

更多专业前端知识,请上 【猿2048】www.mk2048.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows服务编写

摘要&#xff1a;几乎所有的操作系统在启动的时候都会启动一些不需要与用户交互的进程&#xff0c;这些进程在Windows中就被称作服务。它由服务程序、服务控制程序&#xff08;&#xff33;&#xff23;&#xff30;&#xff0c;service control program&#xff09;和服务控制…

1031 查验身份证 (15 分)

#include <iostream> #include <string> using namespace std; int main() {int n, i, sum 0, cnt 0; // 这是为零很重要string s;int w[17] { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 };char z[11] { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };cin >> n;getcha…

分布式锁(基于redis和zookeeper)详解

分布式锁&#xff08;基于redis和zookeeper&#xff09;详解 https://blog.csdn.net/a15835774652/article/details/81775044 为什么写这篇文章&#xff1f; 目前网上大部分的基于zookeeper&#xff0c;和redis的分布式锁的文章都不够全面。要么就是特意避开集群的情况&#xf…

深入理解this机制系列第三篇——箭头函数

前面的话 this机制与函数调用有关&#xff0c;而作用域则与函数定义有关。有没有什么是可以将this机制和作用域联系起来的呢&#xff1f;本文将介绍ES6新增的内容——箭头函数 痛点 对于闭包的痛点在于&#xff0c;闭包的this默认绑定到window对象&#xff0c;但又常常需要访问…

C# CheckedListBox控件的用法

最近用到checklistbox控件&#xff0c;在使用其过程中&#xff0c;花了较多的时间&#xff0c;这里我收集了其相关的代码段&#xff0c;希望对大家有所帮助。1.添加项checkedListBox1.Items.Add("蓝色"); checkedListBox1.Items.Add("红色"); checkedListB…

如何从JSF获取JSON响应?

许多JavaScript小部件都希望使用JSON格式的数据和选项。 如今&#xff0c;选择一个很酷的小部件并将其包装在一个复合组件中确实很容易。 但是第一个问题是如何发送AJAX请求并以正确的JSON格式接收响应。 JSF用户经常会提出这个问题 。 您需要的只是一个XHTML facelet&#xff…

使用AtomicLong,经典银行账户问题

1.新建Account类&#xff0c;使用AtomicLong定义账户余额&#xff0c;增加和减少金额方法使用getAndAdd方法。 package com.xkzhangsan.atomicpack.bank;import java.util.concurrent.atomic.AtomicLong;public class Account {private AtomicLong balance new AtomicLong();p…

Redis与Zookeeper实现分布式锁的区别

Redis与Zookeeper实现分布式锁的区别 1.分布式锁解决方案 1.采用数据库 不建议 性能不好 jdbc 2.基于Redis实现分布式锁&#xff08;setnx&#xff09;setnx也可以存入key&#xff0c;如果存入key成功返回1&#xff0c;如果存入的key已经存在了&#xff0c;返回0. 3.基于Zookee…

JavaFX技巧12:在CSS中定义图标

当您是像我这样来自Swing的UI开发人员时&#xff0c;您很有可能仍在代码中直接设置图像/图标。 最可能是这样的&#xff1a; import javafx.scene.control.Label; import javafx.scene.image.ImageView;public class MyLabel extends Label {public MyLabel() {setGraphic(new…

被嫌弃的eval和with

前面的话 eval和with经常被嫌弃&#xff0c;好像它们的存在就是错误。在CSS中&#xff0c;表格被嫌弃&#xff0c;在网页中只是用表格来展示数据&#xff0c;而不是做布局&#xff0c;都可能被斥为不规范&#xff0c;矫枉过正。那关于eval和with到底是什么情况呢&#xff1f;本…

短信猫常用AT指令

AT指令短信猫通讯中起着重要的作用&#xff0c;能够通过AT指令控制手机的许多行为&#xff0c;包括拨叫号码、按键控制、传真、GPRS等。AT指令基本用法&#xff1a;1. 测试命令(Test Command)在AT指令后面加上“?”即构成测试命令。例如“ATCSCS?”会列举出所有支持的字符集。…

第八次点评

本周心得&#xff1a; 本周没有作业 &#xff0c;批改的上周的作业。需求分析以及团队的明确分工是开发前准备的要素。本次批改主要侧重于需求分析的调研。 博客园地址https://www.cnblogs.com/zhaojh123/ 博客园点评博客&#xff1a; https://www.cnblogs.com/yanqignkui-123/…

JDBC、Tomcat为什么要破坏双亲委派模型?

问题一&#xff1a;双亲委派模型是什么 如果一个类加载器收到了加载某个类的请求&#xff0c;则该类加载器并不会去加载该类&#xff0c;而是把这个请求委派给父类加载器&#xff0c;每一个层次的类加载器都是如此&#xff0c;因此所有的类加载请求最终都会传送到顶端的启动类加…

JavaFX技巧8:美丽深层

如果要为JavaFX开发UI框架&#xff0c;请养成一种习惯&#xff0c;始终将自定义控件拆分为控件类和外观类。 来自Swing自己&#xff0c;这对我来说并不明显。 Swing还使用MVC概念并将实际的组件呈现委托给UI委托&#xff0c;但是扩展Swing的人们大多将其控件之一子类化&#xf…

dpdk之路-环境部署

dpdk实验环境部署 1、实验环境说明 vmware workstatioin 12 centos 7.5.1804 dpdk-stable-18.11.1 2、实验步骤 &#xff08;1&#xff09;虚拟机安装 http://vault.centos.org/7.5.1804/isos/x86_64/从链接下载CentOS-7-x86_64-DVD-1804.iso&#xff0c;安装时需要准备3张虚拟…

管理好我的业务人员

我所在的一家公司属于一家典型的以业务员为主的公司&#xff0c;没有业务员就无法生存下去的这样一家公司。但在平时的一些管理方面我经常会发现以下几点问题&#xff1a;1. 某些业务人员有时候认为天高皇帝远&#xff0c;我在外面工作&#xff0c;公司不可能派人跟踪管理的。2…

initial、inherit、unset、revert和all

前面的话 在CSS中&#xff0c;有4个关键字理论上可以应用于任何的CSS属性&#xff0c;它们是initial(初始)、inherit(继承)、unset(未设置)、revert(还原)。而all的取值只能是以上这4个关键字。本文将介绍initial、inherit、unset、revert和all initial 表示元素属性的初始默认…

基于知识图谱的医疗诊断系统论文

本作品禁止任何人/企业申请专利&#xff0c;禁止任何人使用本作品参加任何比赛或作为毕业设计&#xff0c;如使用本作品源码进行商业用途务必联系作者。 一.科学性 1.研究意义 信息科技经过 60 余年的发展&#xff0c;已经普及到社会生活的每一个角落。随着信息技术在国家治理、…

SpringBoot:SpringBoot简介

SpringBoot ...如今&#xff0c;有关SpringBoot的话题很多。 那么&#xff0c;SpringBoot是什么&#xff1f; SpringBoot是一个新的Spring产品组合项目&#xff0c;它通过大幅度减少所需的配置量来构建可立即投入生产的Spring应用程序。 Spring Boot通过基于运行时可用的类路径…

华为云(ECS)-linux服务器中-Ubuntu图形界面安装-解决root登录受限-VNCviwer/Teamviwer远程访问教程...

安装ubuntu-desktop 1.更新软件库 apt-get update2.升级软件 apt-get upgrade3.安装桌面 apt-get install ubuntu-desktop 解决root登录受限 华为云登录进去是guest用户&#xff0c;不能选择登录用户且不需要密码就即可登录。 登录进去会如下警告信息&#xff1a; 首先下载…