我有一个HTML集合,我希望在单击集合中的第二个项目时删除项目0-2和项目19-28。我在这里缺少什么?
//Add on OnClick command to the second element of the HTML collection.
document.getElementsByClassName("esg-filterbutton")[1].addEventListener("click", myFunction);
//Remove elements 0-2 and 19-28 from the collection.
function myFunction(){
while (i<3 && i>18 && i<29){
.esg-filterbutton.remove();
}
}
谢谢,
乔纳森
答案 0 :(得分:1)
您似乎忘记了实际引用该集合,您的循环也无效。
此代码应该按您的要求执行:
document.getElementsByClassName("esg-filterbutton")[1].addEventListener("click", myFunction);
var filters = document.getElementsByClassName("someClassName");
//Remove elements 0-2 and 19-28 from the collection.
function myFunction(){
for (var i = 0;i<29; i++){
if (i === 3) { // Skip elements 3 to 18
i = 19;
continue;
}
filters[i].remove();
}
}
答案 1 :(得分:1)
我的回答删除了元素0-2和12-14 ...看看是否有助于你
提示:点击&#39;过滤器&#39;按钮和打开控制台以查看结果
//Add on OnClick command to the second element of the HTML collection.
document.getElementById("esg-filterbutton").addEventListener("click", myFunction);
//Remove elements 0-2 and 12-14 from the collection.
function myFunction() {
var elementArray = document.getElementsByClassName('filter');
var reducedElementArray = [];
for (var index = 0; index < elementArray.length; index++) {
if (!(index >= 0 && index <= 2) &&
!(index > 11 && index < 15)) {
reducedElementArray.push(elementArray[index]);
}
}
for (var index = 0; index < reducedElementArray.length; index++) {
console.log(reducedElementArray[index]);
}
}
&#13;
<ul>
<li class="filter">1</li>
<li class="filter">2</li>
<li class="filter">3</li>
<li class="filter">4</li>
<li class="filter">5</li>
<li class="filter">6</li>
<li class="filter">7</li>
<li class="filter">8</li>
<li class="filter">9</li>
<li class="filter">10</li>
<li class="filter">11</li>
<li class="filter">12</li>
<li class="filter">13</li>
<li class="filter">14</li>
</ul>
<button id="esg-filterbutton">Filter</button>
&#13;
答案 2 :(得分:1)
为了避免对函数中的范围进行硬编码的问题,可以通过编程方式使用一些辅助函数来构建范围。我已经尝试了一种函数式编程方法来解决这个问题。
对于此示例,我们将使用范围0-2和5-6。
var ranges = ['0-2', '5-6'];
首先,将getElementsByClassName
替换为querySelectorAll
。这将允许我们使用静态节点列表而不是实时节点列表。
var divs = document.querySelectorAll(".esg-filterbutton");
单击第二个项目时,将范围传递到myFunction
。
divs[1].addEventListener("click", myFunction.bind(this, ranges));
getBounds
返回范围的上限和下限。
function getBounds(str) {
return str.split('-').map(Number);
}
createRange
使用下限和上限返回单个填充范围。
function createRange(range) {
var bounds = getBounds(range), out = [];
for (var i = bounds[0]; i <= bounds[1]; i++) out.push(i);
return out;
}
combineRanges
使用concat
将多个范围连接在一起。
function concat() {
return function (p, c) {
return p.concat(c);
}
}
function combineRanges(arr) {
return arr.reduce(concat());
}
getArrayRange
和formatRanges
创建要连接的范围。
function getArrayRange(createRange) {
return function (el) {
return createRange(el);
}
}
function formatRanges(ranges) {
return ranges.map(getArrayRange(createRange));
}
最后removeElementFrom
返回要在myFunction
中使用的函数。
function removeElementFrom(arr) {
return function (el) {
arr[el].remove();
}
}
最后,myFunction
接受ranges
作为参数,使用上述函数组合它们,然后删除这些范围内的每个元素。
function myFunction(ranges) {
var arr = combineRanges(formatRanges(ranges)).forEach(removeElementFrom(divs));
}
DEMO。点击&#34; 1&#34;删除ranges
数组中包含的元素。
答案 3 :(得分:0)
如果您将集合视为数组,请使用.splice(index,howmanyElements)
方法删除元素列表。如果您不检查任何其他详细信息,则循环可能会导致性能问题,避免循环