Javascript 删除所有空的 innerHTML 子元素
Javascript remove all empty innerHTML elements children
ul
元素已动态加载 li a
个子元素,有时 li a
会填充空的 innerHTML。如何删除所有具有空 a
子元素的 li
元素?
Current(错误 Uncaught TypeError: Cannot read 属性 'innerHTML' of null)
var stepList = document.querySelector(".parent"),
listItems = stepList.children;
for (var i = 0; i < listItems.length; i++) {
if (listItems[i].firstElementChild.innerHTML === "") {
listItems[i].remove();
}
}
开始
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
目标
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
<script>
//list of all anchor elements in your HTML DOM
onload = function() {
var anchors = document.getElementsByTagName("a");
for(var i = 0; i < anchors.length; i++) {
var anchor = anchors[i];
if(anchor.innerHTML == "") {
anchor.parentNode.removeChild(anchor); //removes the anchor
}
}
}
</script>
<a href="x">Something</a>
<a href="x"></a>
<a href="x">Something</a>
<a href="x">Something</a>
当您遍历列表并删除内容时,它会关闭索引。改为向后循环:
let lis = document.querySelector(".parent").children
for (let i = lis.length - 1; i >= 0; i--) {
if (lis[i].firstElementChild.innerHTML === "") {
lis[i].remove()
}
}
<ul class="parent">
<li><a href="">One</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href="">Two</a></li>
<li><a href="">Three</a></li>
</ul>
您的代码存在问题,当您删除项目时,子项实际上会减少,因此您将所有内容都向下移动了一个索引。人们通常会向后循环以阻止此错误。
Perosnally 我只会使用带有 querySelectorAll 和 forEach 循环的 empty pseudo class 选择器。
var emptyAnchors = document.querySelectorAll("li > a:empty")
emptyAnchors.forEach(function (a) {
a.parentNode.remove()
})
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
VERY CHEEKY pure-css 解决方案:使 a
标签而不是 li
标签显示列表项要点。然后只需将 display: none
应用于所有空的 a
标签! (它们包含的 li
元素自然会扁平化为 height: 0
,因为它们将是 display: block
,并且完全没有内容。)
li {
position: relative;
display: block;
}
a {
position: relative;
display: list-item;
}
a:empty {
display: none;
}
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
请注意,css 解决方案并不总是理想的,因为即使视觉上看起来不错,页面的语义标记可能仍处于不理想的状态。
ul
元素已动态加载 li a
个子元素,有时 li a
会填充空的 innerHTML。如何删除所有具有空 a
子元素的 li
元素?
Current(错误 Uncaught TypeError: Cannot read 属性 'innerHTML' of null)
var stepList = document.querySelector(".parent"),
listItems = stepList.children;
for (var i = 0; i < listItems.length; i++) {
if (listItems[i].firstElementChild.innerHTML === "") {
listItems[i].remove();
}
}
开始
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
目标
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
<script>
//list of all anchor elements in your HTML DOM
onload = function() {
var anchors = document.getElementsByTagName("a");
for(var i = 0; i < anchors.length; i++) {
var anchor = anchors[i];
if(anchor.innerHTML == "") {
anchor.parentNode.removeChild(anchor); //removes the anchor
}
}
}
</script>
<a href="x">Something</a>
<a href="x"></a>
<a href="x">Something</a>
<a href="x">Something</a>
当您遍历列表并删除内容时,它会关闭索引。改为向后循环:
let lis = document.querySelector(".parent").children
for (let i = lis.length - 1; i >= 0; i--) {
if (lis[i].firstElementChild.innerHTML === "") {
lis[i].remove()
}
}
<ul class="parent">
<li><a href="">One</a></li>
<li><a href=""></a></li>
<li><a href=""></a></li>
<li><a href="">Two</a></li>
<li><a href="">Three</a></li>
</ul>
您的代码存在问题,当您删除项目时,子项实际上会减少,因此您将所有内容都向下移动了一个索引。人们通常会向后循环以阻止此错误。
Perosnally 我只会使用带有 querySelectorAll 和 forEach 循环的 empty pseudo class 选择器。
var emptyAnchors = document.querySelectorAll("li > a:empty")
emptyAnchors.forEach(function (a) {
a.parentNode.remove()
})
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
VERY CHEEKY pure-css 解决方案:使 a
标签而不是 li
标签显示列表项要点。然后只需将 display: none
应用于所有空的 a
标签! (它们包含的 li
元素自然会扁平化为 height: 0
,因为它们将是 display: block
,并且完全没有内容。)
li {
position: relative;
display: block;
}
a {
position: relative;
display: list-item;
}
a:empty {
display: none;
}
<ul class="parent">
<li>
<a href="">One</a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href="">Two</a>
</li>
<li>
<a href="">Three</a>
</li>
</ul>
请注意,css 解决方案并不总是理想的,因为即使视觉上看起来不错,页面的语义标记可能仍处于不理想的状态。