我有一个简单的元素列表,如下所示:
<ul class="items-list">
<li class="item item-1"></li>
<li class="item item-2"></li>
<li class="item item-3"></li>
<li class="item item-4"></li>
</ul>
我选择列表
items = document.getElementsByClassName('items-list')[0]
最后在
for..in
循环中,我想提取类名 'item-*'
。
因为我想在没有 jQuery 或其他库的情况下实现它,我想知道如何以最优雅的方式做到这一点,比如
if (item.classList.contains('item-.*'))
do_something()
some
(ES5) 类是否与您的正则表达式匹配:
if(item.className.split(' ').some(function(c){ return /item-.*/.test(c); }))
do_something()
/* or */
if([].some.call(item.classList, function(c){ return /item-.*/.test(c); }))
do_something()
或者,在 ES6 中,使用 箭头函数,您可以将其简化为
if(item.className.split(' ').some(c => /item-.*/.test(c)))
do_something()
/* or */
if([].some.call(item.classList, c => /item-.*/.test(c)))
do_something()
但是当然,如果您想要最大性能,请使用循环:
for (var i=0, l=item.classList.length; i<l; ++i) {
if(/item-.*/.test(item.classList[i])) {
do_something();
break;
}
}
您可以使用正则表达式来测试className是否包含
item-
if (/item-/.test(item.className)) {
// ...
}
var items = document.getElementsByClassName('items-list')[0];
for (var i = 0, len = items.children.length; i < len; i++) {
if (/item-/.test(items.children[i].className)) {
console.log(items.children[i].className);
// or doSomething();
}
}
由于没有提到答案
Array.from()
,我将使用我自己的版本:
// now you have a real array, so you can call any Array method
const classNames = Array.from(item.classList);
// now you can perform your checks on the array
const classNameHasGivenPattern = classNames.some(className => /item-/.test(className));
if (classNameHasGivenPattern) {
// ...
}