以下是一种现代的本地JavaScript解决方案;实际上与2010年的jQuery解决方案非常相似。我从那个答案中进行了适应,用于我正在开发的项目,并想在这里分享它。
document.querySelectorAll("*:empty").forEach((x)=>{x.remove()});
document.querySelectorAll
返回一个
NodeList
,它实际上是一个数组,包含所有与作为参数给定的CSS选择器匹配的DOM节点。
forEach
循环遍历结果
NodeList
中的每个元素,并在其上运行匿名函数
(x)=>{x.remove()}
。
x
是列表中当前的元素,调用
.remove()
将其从DOM中删除。
希望这能对某些人有所帮助。令人惊讶的是,JavaScript在短短的8年时间里已经取得了长足的进步;从几乎总是需要一个库才能以简洁的方式编写这样复杂的东西到能够本地实现。
编辑
因此,上面详细介绍的方法在大多数情况下都可以正常工作,但它存在两个问题:
- 像
<div> </div>
这样的元素不被视为:empty
(而不是之间的空格)。 CSS Level 4选择器通过引入:blank
选择器来解决这个问题(它类似于空白,但会忽略空格),但目前只有Firefox支持它(以供应商前缀形式)。
- 自闭合标记被
:empty
捕获-并且这也将是:blank
的情况。
我编写了一个稍微大一点的函数来处理这两种用例:
document.querySelectorAll("*").forEach((x)=>{
let tagName = "</" + x.tagName + ">";
if (x.outerHTML.slice(tagName.length).toUpperCase() == tagName
&& /[^\s]/.test(x.innerHTML)) {
x.remove();
}
});
我们迭代页面上的每个元素。我们获取该元素的标签名称(例如,如果元素是一个div,则为
DIV
),并使用它构建一个闭合标签 - 例如
</DIV>
。
那个标签有6个字符长。我们检查元素HTML的大写的最后6个字符是否与之匹配。如果匹配,则继续。如果不匹配,则该元素没有闭合标签,因此必须是自闭合的。这比列表更可取,因为这意味着如果新的自闭合标签被添加到规范中,您不必更新任何内容。
然后,我们检查元素的内容是否包含任何空格。
/[^\s]/
是一个正则表达式。
[]
是一个正则表达式中的集合,并且将匹配其中出现的任何字符。如果
^
是第一个元素,则该集合变为
否定的 - 它将匹配不在集合中的任何元素。
\s
表示空格 - 制表符、空格、换行符。因此,
[^\s]
表示“任何非空格字符”。
根据匹配结果,如果标记不是自闭合的,并且其内容包含非空格字符,则我们将其删除。
当然,这比以前的一行代码要大一些,也不太优雅。但它应该对几乎所有情况都有效。