2009-11-29 1 views
0

Я пытаюсь группировать связанные элементы, используя имя класса. Они, в свою очередь, связаны друг с другом, поскольку все они используют один и тот же префикс для имени класса. Пример:jquery, выбрав конкретный класс из элемента

<ul> 
    <li class="category-fruit"></li> 
    <li class="category-grain"></li> 
    <li class="category-meat"></li> 
    <li class="category-fruit"></li> 
    <li class="category-meat"></li> 
</ul> 

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

В то время как легко выбрать конкретный LI с определенным классом, как бы я мог выбрать определенный класс из зависающего LI?

Таким образом, в псевдокоде

$("li").hover(function(){ 
    $(this).[get-the-class-beggining-with"category"] 
}) 

Я предполагаю, что это связано с использованием начинается с селектора ([атрибут^= значение])

+0

Чтобы уточнить ваш вопрос. Вы говорите, что если «категория-мясо» зависает, все остальные 'li's' с' category-meat' также должны быть выбраны? То же самое касается «категории-фрукты». Если он завис, вы хотите показать как это (первый ли), так и другой плод (четвертый ли), как зависание? –

+0

, то есть правильно –

ответ

1

После @ удивительном свинца CMS, я разместил working example этого раствора JSBin.

Я придумал решение, которое позволяет иметь дополнительные занятия по li's и, после того, как он находит правильные братьев и сестер он кэширует его для использования в будущем, чтобы ускорить выполнение:

$(function(){ 
    $("li").hover(function(){ 
     var $this = $(this), 
      $cache = $this.data('hoverCache'); 

     if(!$cache){ 
      var category = this.className.match(/category\-.+?\b/)  
      $this.data('hoverCache', $this.siblings('.' + category).andSelf().addClass('hover')); 
     } else { 
      $cache.addClass('hover'); 
     } 

    }, function(){ 
     var $cache = $(this).data('hoverCache'); 
     if($cache) $cache.removeClass('hover'); 
    }); 
}) 

Так это не запутаться в этом оптимизированной, например, здесь соответствующий код на свой вопрос:

var category = this.className.match(/category\-.+?\b/); 
$(this).siblings('.' + category).andSelf(); 

Это находит категорию из className (там могут быть дополнительные классы), а затем он находит других детей того же р arent, используя .siblings, а затем включает в себя, чтобы вы могли одновременно добавить класс hover.

Я протестировал этот код с помощью Firefox и предоставленного HTML-кода, и он отлично поработал. Дайте мне знать, если это не то, что вам нужно!

+0

спасибо. Мне нужно изучить это немного, но выглядит интересно! –

+0

@DA Я обновил свой ответ, чтобы вы могли просто перейти к соответствующим частям, относящимся к вашему вопросу. Дайте мне знать, если это понятно. –

+0

@ dcneiner ах! да, это проясняет ситуацию. Умная! Благодаря! –

3

Вы можете использовать attributeStartsWith селектор:

$("li[class^=category]").hover(/*...*/); 

Просмотрите пример с вашей разметкой here.

Edit: Чтобы получить имя класса вы можете использовать this.className или используйте функцию attr, например:

$("li[class^=category]").each(function(){ 
    var className = $(this).attr('className'); 
    // this.className, or attr('class'), which will be mapped to className 
}); 

И, кстати, вы можете также использовать метод filter(fn) для выбора li элементы, которые их имя класса начинается с «категории»:

$("li").filter(function() { 
    return /category-.+/.test(this.className); 
}).hover(/*...*/); 
+0

, который будет выбирать объект dom с этим классом, но что, если я хочу захватить все имя самого класса? –

+0

$ ('li') .attr ('class'); –

+0

Внутри функции 'hover'' this.className' будет самым быстрым способом получить все классы, применяемые к текущему 'li'. Если есть только один, то большой.Если нет, фильтрация еще должна быть применена. –