JQuery проверить, если элемент имеет класс, начинающийся с некоторой строки - PullRequest
13 голосов
/ 19 апреля 2010

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

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

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

Ответы [ 6 ]

16 голосов
/ 19 апреля 2010

Осторожно с $('#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">
5 голосов
/ 19 апреля 2010

Попробуйте Атрибут начинается с селектора . В качестве бонуса, нет необходимости в дополнительных, если.

$('#dialog li[class^="C"]').each(function() {
    // do something
});
1 голос
/ 18 апреля 2012

Вы можете попробовать этот селектор. Это будет работать, если есть два или более классов, таких как «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");
}
1 голос
/ 19 апреля 2010

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

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

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

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

0 голосов
/ 19 апреля 2010

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

$('#dialog li').filter( function() { 
  // return true for every element that matches your condition
  return this.className.match(/^c/) != null;
}).each(function(){
  //do something
}
0 голосов
/ 19 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...