JQuery проверить, имеет ли элемент класс, начинающийся с некоторой строки

Мне нужно прокрутить некоторые элементы на странице, а затем для каждого из них, если у него есть класс, начинающийся, например, с "C", что-то делать.

$('#dialog li').each(function(){
    if ($(this).hasClass("^C")){
         //do something
    }
}

Это может показаться глупым, но какой селектор/метод следует использовать в условии if?

Ответ 1

Обратите внимание на $('#dialog li[class^="C"]')! Он будет соответствовать только элементам, атрибут класса которых начинается с "C", а не с классом, начинающимся с C. Например, он не будет соответствовать <li class="foo Clown">.

AFAIK, что вы хотите, невозможно с помощью jQuery. Вам нужно будет пройти через классы и проверить каждый отдельно. Что-то вроде:

$('#dialog li').filter(function(){
  var classes = this.className.split(/\s/);
  for (var i = 0, len = classes.length; i < len; i++) 
    if (/^C/.test(classes[i])) return true;
  return false;
}).each( ... )

Альтернативно вам следует рассмотреть возможность изменения вашего подхода и дать всем элементам дополнительный класс и фильтр. Это добавляет, что его также можно использовать в CSS:

<li class="Clown Clown-Funny">
<li class="Clown Clown-Sad">
<li class="Clown Clown-Rodeo">

Ответ 3

Я не думаю, что есть встроенный селектор для тестирования классов, начинающихся со строки.

Существует селектор, проверяющий, начинается ли атрибут с строки, поэтому, если вы знаете, что ваши элементы имеют только один класс (или всегда начинаются с рассматриваемого класса), вы можете сделать:

$(this).is("class^='C'")

Если, однако, вы не можете гарантировать одно из вышеуказанных условий, вам придется вручную разделить и протестировать каждый класс, определенный на элементе, как описано здесь.

Ответ 4

Попробуйте что-то вроде $('#dialog li[class^="C"]')

Ответ 5

Для более сложных фильтров, чем "начинается с", вы можете использовать функцию filter():

$('#dialog li').filter( function() { 
  // return true for every element that matches your condition
  return this.className.match(/^c/) != null;
}).each(function(){
  //do something
}

Ответ 6

Вы можете попробовать этот селектор. Это будет работать, если есть два или более классов, таких как "Clown foo doo" и

Вы можете попробовать что-то вроде этого $('#dialog li[class*="C"]'), и в этом случае выберете все, что содержит букву "C", для примера "exCelence foo".

Если вы заинтересованы в том, чтобы подсчитать, сколько классов начинается с "C" независимо от их положения (независимо от того, находятся ли они в начале, в и или где-то посередине), вы можете попробовать что-то вроде этого:

$('#dialog li[class^="C"]').each(function() {
  var classes = div.attr("class").split(" "); 
  var count = 0; 
  $.each(classes, function(i, v){ if(v.indexOf('C')!=-1) count++; });
  if (count == 1)   alert("It has one 'C' class");
  if (count>1) alert("It more than one 'C' class");
}