@BoltClock为这个问题提供了一个很好的答案,表明这一点(目前,就是使用CSS规范3)不能单靠CSS来实现。
@BoltClock提到可以通过使用伪选择器:empty
来定位空的元素(这是一个奇怪的定义,如解释的)。此伪选择器仅在CSS 3中可用,并且不会选择仅包含空白作为内容的元素。
@BoltClock指出,清理只包含空格的元素作为内容的唯一方法是修复HTML,但这不完全正确。这也可以通过实现Javascript来实现。
注意!我提供的Javascript解决此问题可能需要很长时间才能执行,所以最好的方法是在可能的情况下清理原始HTML。如果这是不可能的,那么这可以作为解决方案,只要你没有太多的DOM树。
我会过怎样自己编写剧本的步骤走...
所有首先,启动页面加载后的一切。
这应该是非常明显的。在运行脚本之前,您需要确保DOM已经完全加载。添加event listener
页面加载:
window.addEventListener("load", cleanUpMyDOM);
...,当然,在此之前,创建一个名为function
cleanUpMyDOM
。我们将在这个函数中编写我们其余的逻辑。
第二,收集我们正在检查的元素。
在我们的示例中,我们将检查整个DOM,但这是我们的脚本可能会非常广泛并可能导致页面无响应的地方。您可能想要限制正在迭代的节点数量。
我们可以使用document.querySelectorAll
来获取有问题的节点。这个函数的好处在于它可以平衡DOM树,我们不需要递归每个节点的子节点。
var nodes = document.querySelectorAll("*");
正如我前面所说,这段代码会抓取EVERY DOM节点,这可能不是一个好主意。
例如,我正在使用WordPress,并且一些内部页面中有一些垃圾。幸运的是,他们都是div.body
元素的子元素,因此我可以将我的选择器更改为document.querySelectorAll("div.body p")
,它将只递归地选择div.body
元素的子元素,即p
元素。这将大大优化我的脚本。
第三个,迭代节点并找到空的。
我们将为nodes
数组创建一个循环并检查其中的每个节点。然后我们将检查节点是否为空。如果它是空的,我们将向它应用一个名为blank
的类。
我只是在臀部拍摄而已,所以如果你发现这段代码有错误,请告诉我。
for(var i = 0; i < nodes.length; i++){
nodes[i].innerHTML = nodes[i].innerHTML.trim();
if(!nodes[i].innerHTML)
nodes[i].className += " blank";
}
我肯定有写上面的一环更清洁的方式,但这应该把工作做好。
最后,你所需要做的就是将你的CSS空白元素作为目标。
添加此规则,以你的样式表:
.blank {
display:none;
}
有你有它!所有的“空白”节点都被隐藏了。
对于那些谁只想向前跳,这里是完成脚本:
function cleanUpMyDOM(){
var nodes = document.querySelectorAll("*");
for(var i = 0; i < nodes.length; i++){
nodes[i].innerHTML = nodes[i].innerHTML.trim();
if(!nodes[i].innerHTML)
nodes[i].className += " blank";
}
}
window.addEventListener("load", cleanUpMyDOM);
再次,如果你发现我的代码的任何问题,请让我知道在下面的意见。
希望这会有所帮助!
P.S.很多人可能会想知道为什么你会这样做,因为它确实感觉不好。我会避免这样做,但我正处于一个开始考虑它的状况。我网站上的页面内容是通过所见即所得的编辑器创建的。这个内容是由营销团队不断创建和修改的,我非常不知所措地处理了对他们失误的支持。它不是我的工作来修复WordPress的所见即所得的编辑器(我也不想),但我可以写一个非常简单的脚本,可以为我处理一些工作。对于我来说,这绝对是更好的答案,除了培训支持团队在编辑时管理他们的空白。
你能提供JSFiddle上的代码示例吗? –
https://jsfiddle.net/fzax9qj1/ – Deadpool
你用jQuery标记了这个 - 你可以添加你自己的空检查谓词,如果这可以满足你的目的。 – Pointy