需要删除前缀为nf-
的元素上的某些类,并保留所有其他类。元素可以有一个或多个带有前缀的类。
<div class="custom-nf">
<div class="input nf-input-outer nf-validation">
<div class="nf-container">
<div class="nf-outer nf-outer-input nf-outer-validation">
<div class="nf-middle">
<div class="nf-inner">
<label for="dummy" class="nf-label"></label>
<input id="dummy" type="text" class="nf-input"></div>
</div>
</div>
</div>
</div>
</div>
我有下面的脚本,它获取类前缀为nf-
的所有元素,然后为每个元素查看classList属性,并为每个类决定当前类字符串是否与正则表达式中定义的前缀匹配。如果为true,则从元素中删除该类。
(function(){
// get elements with nf- prefix class
var nfClasses = document.querySelectorAll('.custom-nf [class*="nf-"]');
// each element found
Array.prototype.forEach.call(nfClasses, function(element){
// each class per element with classList
Array.prototype.forEach.call(element.classList, function(el){
// only for classes that match prefix nf-
if (el == el.match(/^nf-.*/g)) {
// remove nf- class from the element
element.classList.remove(el);
}
});
});
})();
现在代码似乎运行正常并删除带有前缀的类,但内部forEach部分不会删除在classList数组中显示为奇数索引的类。以下是代码运行后HTML的样子:
<div class="custom-nf">
<div class="input nf-validation">
<div class="">
<div class="nf-outer-input">
<div class="">
<div class="">
<label for="dummy" class=""></label>
<input id="dummy" type="text" class=""></div>
</div>
</div>
</div>
</div>
</div>
运行代码将减少剩余的类,依此类推,直到所有类都消失,但这不实用,并且不知道元素可能与前缀有多少个类。
如果你想看一下,我有一个JSFiddle并且正在运行。
为什么内部forEach跳过奇数索引,我该如何纠正呢?
答案 0 :(得分:1)
从回调内部修改element.classList
会更改数组的索引,从而跳过刚删除的元素旁边的元素。
只需更改外部回调:
(function() {
// get elements with nf- prefix class
var nfClasses = document.querySelectorAll('.custom-nf [class*="nf-"]');
// each element found
Array.prototype.forEach.call(nfClasses, function(element) {
// here you gather class names to remove
var toRemove = [];
// each class per element with classList
Array.prototype.forEach.call(element.classList, function(el) {
// only for classes that match prefix nf-
if (el.match(/^nf-.*/)) {
// remove nf- class from the element
toRemove.push(el);
}
});
// now actually remove those classes
toRemove.forEach(function(el) {
element.classList.remove(el);
});
});
})();
中查看该动作