18

我的物品有以下类别:

<div class="class-x some-class-1 other-class"></div>
<div class="some-class-45 class-y"></div>
<div class="some-class-123 something-else"></div>

我想知道是否有一种简单的方法:

  1. 仅获取所有带some-class-前缀的类。
  2. 从每个元素中删除它们。
  3. 他们的名字(不是对应的 DOM 元素)在一个变量中吗?

我可以很容易地选择这样的元素,jQuery( "div[class^='some-class-'], div[class*=' some-class-']" )但是如何用最短和最易读的代码将其类名提取到变量(可以是一些全局对象)?

4

4 回答 4

20

像这样?

var arrClasses = [];
$("div[class*='some-class-']").removeClass(function () { // Select the element divs which has class that starts with some-class-
    var className = this.className.match(/some-class-\d+/); //get a match to match the pattern some-class-somenumber and extract that classname
    if (className) {
        arrClasses.push(className[0]); //if it is the one then push it to array
        return className[0]; //return it for removal
    }
});
console.log(arrClasses);

小提琴

.removeClass()接受一个回调函数来执行一些操作并返回要删除的类名,如果没有要删除的内容则不返回任何内容。

于 2013-06-28T15:04:55.123 回答
4

您可以遍历所有元素,使用正则表达式提取类名,并将它们存储在一个数组中:

var classNames = [];
$('div[class*="some-class-"]').each(function(i, el){
    var name = (el.className.match(/(^|\s)(some\-class\-[^\s]*)/) || [,,''])[2];
    if(name){
        classNames.push(name);
        $(el).removeClass(name);
    }
});
console.log(classNames);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="class-x some-class-1 other-class"></div>
<div class="some-class-45 class-y"></div>
<div class="some-class-123 something-else"></div>

于 2013-06-28T15:05:06.260 回答
3

您可以遍历每个找到的节点并遍历类以找到匹配项;如果找到,请删除该类并记录它:

var found = [];

$('div[class*="some-class-"]').each(function() {
  var classes = this.className.split(/\s+/),
  $this = $(this);

  $.each(classes, function(i, name) {
      if (name.indexOf('some-class-') === 0) {
          $this.removeClass(name);
          found.push(name);
      }
  });
});

请注意,像这样的选择器div[class*="some-class-"]非常昂贵,并且由于无论如何您都需要执行额外的处理,因此迭代所有div标签并处理它们会更容易:

var elements = document.getElementsByTagName('div'),
found = [];

$.each(elements, function(i, element) {
    var classes = element.className.split(/\s+/);

    $.each(classes, function(i, name) {
        if (name.indexOf('some-class-') === 0) {
            $(element).removeClass(name);
            found.push(name);
        }
    });
});

现代浏览器公开Element.classList了可用于操作类名和Array.forEach迭代的内容:

var found = [];

[].forEach.call(document.getElementsByTagName('div'), function(element) {
    (function(names, i) {
        while (i < names.length) {
            var name = names[i];
            if (name.indexOf('some-class-') === 0) {
                names.remove(name);
                found.push(name);
            } else {
                ++i;
            }
        }
    }(element.classList, 0));
});
于 2013-06-28T15:18:33.900 回答
0

简单的方法

您可以创建自己的过滤器:

$.fn.hasClassStartsWith = function(className) {
    return this.filter('[class^=\''+className+'\'], [class*=\''+className+'\']');
}

var divs = $('div').hasClassStartsWith("some-class-");
console.log(divs.get());

见小提琴

于 2013-06-28T15:09:01.777 回答