在特定时间后删除 class 的所有元素
Removing all elements of class after specific time
我正在尝试在特定超时后(等待动画完成)从特定 class 的 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>
我不确定为什么它不起作用,我正在寻找一个解释,解释为什么它以它的方式执行,而不是实际删除所有元素。
谢谢!
(如果您愿意提供工作代码示例,请仅使用 vanilla JS。)
一个选项是将 setTimeout
上的变量 e
(元素)作为第三个参数传递。
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>
好吧,如果您使用 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);
}
您可以使用 forEach 循环遍历所有 headers
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>
从第一个元素开始逐个删除元素。
或从上次开始:
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>
我正在尝试在特定超时后(等待动画完成)从特定 class 的 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>
我不确定为什么它不起作用,我正在寻找一个解释,解释为什么它以它的方式执行,而不是实际删除所有元素。
谢谢!
(如果您愿意提供工作代码示例,请仅使用 vanilla JS。)
一个选项是将 setTimeout
上的变量 e
(元素)作为第三个参数传递。
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>
好吧,如果您使用 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);
}
您可以使用 forEach 循环遍历所有 headers
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>
从第一个元素开始逐个删除元素。
或从上次开始:
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>