DOM算法系列004-判断给定节点是否为body元素

news2024/11/23 3:45:34

UID: 20221218221939
aliases:
tags:
source:
cssclass:
created: 2022-12-18


如果我们要判定给定的一个节点是不是页面body与元素节点,该如何判断呢?
一般来说, 一个HTML页面内只有一个body元素
但是,如果我们非要在页面内写超过一个body标签,会是什么结果呢?
比如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <body id="mybody">mybody</body>
</body>
<script>
    window.onload = function () {
        var body = document.getElementsByTagName('body');
        console.log(body);
    };
</script>
</html>

我们发现,它只查找到了我们定义了id的这个body元素,没有有包含页面顶级的body元素。会不会查找时只会返回我们书写的最后一个body呢?

再修改一下:

<body>
    <body id="mybody">
       <body id="mybody22">mybody</body>
    </body>
</body>

这次我们嵌套了三层body:

并没有返回最后书写的#mybody22,而是依旧返回了 #mybody, 所以上述猜测是错误的。
我们把mybody 的 id 去掉再试试:

<body>
    <body>
       <body id="mybody22">mybody</body>
    </body>
</body>

这次返回了mybody22
难道是因为加了id影响的?
我们再次修改:

<body id="root">
    <body>
       <body id="mybody22">mybody</body>
    </body>
</body>

果然如此,查找时会返回第一个带有ID属性的body 元素。
等等,如果不是ID属性呢,如果时其他属性呢,我们再次修改:

<body name="top">
    <body>
        <body name="mybody22">mybody</body>
    </body>
</body>

这次返回的也是顶级body, 目前来看,使用getElementsByTagName 查找页面中所有的body 标签时,返回的应该时第一个具有具体属性的节点。并且,此时如果查看页面的Elements树,发现页只保留了返回的该节点,页面中其他的body标签节点消失了:

而根据MDN规范的表述,getElementsByTagName 预期应该返回所有符合条件的节点集合,根据我们以上的实验并不是如此,至少在传入的tagName为body时。 所以说,这可能时浏览器实现中的一个Bug,或者,浏览器是根据其他某个规范执行的这样的操作,我们目前还不得而知。

这是不是个bug我们暂且放一边,因为我们真正关心的是:
不管我们写多少个body, 页面中最终渲染出来只会保留一个
也就是说,当指定节点的tagNameBODY 时,意味着它就是页面中唯一的那个body 标签:

function isBody(node) {
	return node && node.tagName === 'BODY';
}

好了,这就是判断给定节点是否是body节点的方法了。
ueditor.js的源码中,这个方法是这么写的:

isBody:function (node) {

 return node && node.nodeType == 1 && node.tagName.toLowerCase() == 'body';

 },

这里有两点:

  • 他将tagName做了小写化处理,我觉得没必要,因为所有浏览器返回的bodytagName都是大写的,直接用大写判断就可以了
  • 他考虑到了节点的nodeType属性,我觉得也没有必要,因为符合tagName===BODY的一定就是我们页面中那个body元素,页面中其他类型的节点,不可能再有符合这个条件的。

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

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

相关文章

Spring boot 整合 redis

Spring boot 整合 redis一、Spring boot 整合redis1.1 启动redis1.2 redis desktop manager1.3 常用命令二、操作2.1 依赖包2.2 配置2.3 简单测试2.4 StringRedisTemplate一、Spring boot 整合redis 1.1 启动redis 命令行启动 redis-server redis-cli1.2 redis desktop mana…

基于electronbot作品bootLoader设计

文章目录 前言 一、芯片程序区规划和流程 1、flash区规划 2、两区运行流程 3、bootLoader代码体现 4、electronbot代码体现&#xff1a; 二、bootLoader代码设计 1.下载程序步骤 2.通讯协议格式 三、libusb开发及需要注意的事情 1、bootLoader复合设备 2、electronbot复合设备…

基础算法系列--[基本数据结构KMP]

文章目录前言链表单链表双链表栈和队列栈队列单调KMP前言 今天要搞的是基本的一些数据结构&#xff0c;当然咱们这个不是那么“正经”。当然今天也没啥代码&#xff0c;因为太简单了&#xff08;其实我也想水一下~&#xff09; 链表 单链表 单链表这个东西&#xff0c;应该…

Prometheus+Grafana

K8S prometheusK8S1.Prometheus&#xff08;普罗米修斯&#xff09;2.Prometheus可以做什么3.Prometheus的特点4.prometheus 相关组件二、prometheus与zabbix的区别zabbix架构区别三、prometheus架构分析1.TSDB2.时间序列数据库的特点3.prometheus 相关组件1.prometheus 核心组…

【计算机网络】实验五 网络层与链路层协议分析(PacketTracer)

一、实验目的 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二、实验内容&#xff1a; 4.1 路由器交换机的基本配置 打开下面的实验文件&#xff0c;按提示完成实验。 4.2…

直流微电网中潮流(Matlab代码实现)

目录 1 概述 1.1 直流电网中的潮流 1.2 创新点和相关工作 1.3 本文结构 2 数学/网络模型 2.1 主-从操作 2.2 孤岛运行 3 牛顿法 4 案例及Matlab代码实现 1 概述 潮流是一个非线性问题&#xff0c;需要用牛顿法求解具有恒定功率端子的直流微电网。本文提出了牛顿法在…

曙光来临!Nature终于发现了新冠特效药?或将彻底终结新冠时代!

百趣代谢组学文献分享&#xff1a;2022年即将过去&#xff0c;随着疫苗的全面接种和三年以来“动态清零”的坚持&#xff0c;我们在应对新冠病毒如潮水般的攻击中取得了阶段性成果。虽然大家陆陆续续投入到正常的工作生活中&#xff0c;但是我们都知道新冠并未被“打败”&#…

MySQL中这14个有用的小知识,快学起来吧

前言 我最近用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

如何在产品开发中讨论概念设计?

每当你看到一辆在路上行驶的汽车、书桌上的笔记本电脑、工业包装生产线、医院设备、家用仪器和其他形式的概念设计创意产品会感到难以置信&#xff0c;这就是我们在产品开发中讨论概念设计的原因。 概念设计是一个尚未解决或到目前为止尚未令人满意的问题。这是一个深思熟虑的解…

研究区域制图 | 在 ArcGIS Pro中创建地图布局

研究区域制图 | 在 ArcGIS Pro中创建地图布局 数据准备 首先需要两个图层&#xff0c;一个是市区图层&#xff0c;一个是省行政区划图层&#xff0c;我这里以吉林省以及吉林省长春市为例 新建布局 选择横向A5即可 添加参考线 不知道你们知不知道这个功能&#xff0c;反正小…

kotlin协程笔记:Dispatchers

Kotlin 的 launch 会调用 startCoroutineCancellable()&#xff0c;接着又会调用 createCoroutineUnintercepted()&#xff0c;最终会调用编译器帮我们生成 SuspendLambda 实现类当中的 create() 方法。 public fun CoroutineScope.launch(context: CoroutineContext EmptyC…

【JVM】本地方法栈与堆与方法区

文章目录1. 本地方法栈2. 堆3. 方法区1. 本地方法栈 本地方法栈和虚拟机栈有点类似&#xff0c;均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。 但是不同之处在于本地方法栈服务的对象是JVM执行的native方法&#xff0c;而虚拟机栈服务的是JVM…

[附源码]Nodejs计算机毕业设计教师职称评定系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

免费提供POSMV的GNSS数据解算服务,验潮仪丢失的一种补救

前两天有个网友问干活的区域附近是否有长期验潮站&#xff0c;因为他的临时验潮仪丢失了&#xff0c;随后问了一下搞水文的同事&#xff0c;他推了一个网址&#xff1a; http://publictide.nmdis.org.cn/tide?SiteGroup3&TideType0&#xff0c;中文名叫&#xff1a;潮汐潮…

C型利钠肽 ,101135-67-5

Bz-VGR-pNA, chromogenic substrate for trypsin and for bacterial trypsin-like proteases.Bz-VGR-pNA&#xff0c;胰蛋白酶和细菌胰蛋白酶样蛋白酶的显色底物。 编号: 127015中文名称: C型利钠肽 (TYR0)-C-PEPTIDE (DOG)英文名: (Tyr0)-C-Peptide (dog)CAS号: 101135-67-5单…

机房动环监控系统3大价值,第一个太惊艳了

在中小学、大学院校中&#xff0c;机房已经是不可缺少的部分&#xff0c;但由于管理缺陷、设备复杂等缘故&#xff0c;学校机房得不到安全保障。 因此&#xff0c;要实现学校机房监控系统&#xff0c;来对机房的运行情况实时监测&#xff0c;以此提高风险预防及设备运行环境质量…

C++利用模板实现消息订阅和分发

解耦是编写程序所遵循的基本原则之一&#xff0c;多态是提高程序灵活性的重要方法。C语言支持重载&#xff0c;模板&#xff0c;虚函数等特性&#xff0c;为编写高性能可扩展的程序提供了利器。编写大型项目时&#xff0c;免不了需要各个模块之间相互调用&#xff0c;从而产生了…

【LeetCode题目详解】(四)20.有效的括号、225.用队列实现栈

目录 一、力扣第20题&#xff1a;有效的括号 1.解题思路 2.写出代码 3.完整代码 二、力扣第225题&#xff1a;用队列实现栈 1.思路分析 2.代码实现 3.完整代码 总结 一、力扣第20题&#xff1a;有效的括号 题目链接&#xff1a;20. 有效的括号 - 力扣&#xff08;Leetc…

计算机毕设Python+Vue学生寝室管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

哈夫曼树的构造及应用

哈夫曼树的构造及应用 文章目录哈夫曼树的构造及应用带权路径长度哈夫曼树定义哈夫曼树的性质&#xff1a;构造哈夫曼树构造哈夫曼树存储及生成算法算法框架代码实操:应用: 哈夫曼编码带权路径长度 设二叉树具有n个带权值的叶子节点,那么从根节点到各个叶子节点的路径长度与相应…