我试图在特定超时(等待动画完成)之后从特定类的DOM中删除所有元素。
我已经尝试在实时列表(getElmentsByClassName)和节点列表(querySelectorAll)中使用for循环。在这两种情况下,只删除一个元素。
function removeElems() {
elems = document.querySelectorAll('.header');
for (e of elems) {
setTimeout(function() {e.remove();}, 1000);
}
}
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>
我不确定为什么它不起作用,我正在寻找一个解释,为什么它以它的方式执行而不是实际删除所有元素。
谢谢!
(如果你很友好地提供工作代码的例子,那么香草JS就好了。)
好吧,如果你使用let
或const
正确声明你的变量,它将被修复,因为e
将作为循环的每次迭代的范围。
function removeElems() {
const elems = document.querySelectorAll('.header');
for (const e of elems) {
setTimeout(function() {e.remove();}, 1000);
}
}
但是,这些多个setTimeout调用是多余的。只需将循环移动到单个回调即可。
function removeElems() {
const elems = document.querySelectorAll('.header');
setTimeout(function() {
for (const e of elems) {
e.remove();
}
}, 1000);
}
一种选择是将e
上的变量setTimeout
(元素)作为第三个参数传递。
function removeElems() {
let elems = document.querySelectorAll('.header');
for (const e of elems) {
setTimeout(function(o) { //2. Receive the element in variable o
o.remove(); //3. Remove the o variable
}, 1000, e); //1. Pass the element here
}
}
removeElems();
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>
您可以使用forEach循环遍历所有标头
function removeElems() {
const parent = document.getElementById('container');
const elems = document.querySelectorAll('.header');
elems.forEach((node) => {
setTimeout(function() {
parent.removeChild(node);
}, 1000);
});
}
查看您发布的当前代码:
function removeElems() {
elems = document.querySelectorAll('.header');
for(e of elems) {
setTimeout(function() {
console.log(e);
e.remove();
}, 1000 );
}
}
removeElems();
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>
请注意,e
只调用最后一个header
。
您可以使用以下内容:
function removeElems() {
elems = document.querySelectorAll('.header');
for(let i = 0; i < elems.length; i++) {
setTimeout(function() {
elems[i].remove();
}, 1000 );
}
}
removeElems();
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>
延迟后删除所有。要么:
var i = 0;
var elems = document.querySelectorAll('.header');
function removeElems() {
if( i < elems.length) {
setTimeout(function() {
elems[i].remove();
i++;
removeElems();
}, 1000 );
}
}
removeElems();
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>
从第一个开始删除元素1。
或者从最后:
var elems = document.querySelectorAll('.header');
var i = elems.length-1;
function removeElems() {
if( i >= 0) {
setTimeout(function() {
elems[i].remove();
i--;
removeElems();
}, 1000 );
}
}
removeElems();
<div id="container">
<div class="header">1</div>
<div class="header">2</div>
<div class="header">3</div>
<div class="header">4</div>
<div class="header">5</div>
<div class="header">6</div>
</div>