2016-09-07 2 views
2

У меня есть некоторые дивы, как это:JQuery выбрать элемент путем сопоставления слов в данных атрибутов

<div class="item item1" data-tags="sky,sea,roads"></div> 
<div class="item item2" data-tags="sea"></div> 
<div class="item item3" data-tags="sky,roads"></div> 
<div class="item item4" data-tags="roads"></div> 

Я пытаюсь сделать фильтр с JQuery, так что если я выбираю «небо», только item1 и item3 будет видимый. Вот что я пытался:

$('body').on('click', '.photo-gallery > nav > ul > li > a', function (event) { 
    var tag = $(this).data('tag'); 
    $('.item').not('.item[data-tags^="'+tag+'"]').fadeOut(); 
    $('.item[data-tags^="'+tag+'"]').fadeIn(); 
}); 

Это работает, если значения атрибута data-tags совершенно уникальны, как мой пример выше. Но я знаю, что это не будет работать, если теги что-то вроде этого:

<div class="item item1" data-tags="skyteck,sea,roads"></div> 
<div class="item item2" data-tags="sky,blue sea,loanly roads"></div> 

Теперь, если я выбираю «небо» он получит бот item1 и item2, поскольку они оба матча «небо». Как я могу решить эту проблему?

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

+0

не могли бы вы добавить HTML код блока фотогалереи? –

+0

Как часто вам приходится делать этот поиск? Я бы ожидал, что вы, вероятно, просто прекратите разделять теги на массивы и просматривать их, если вы делаете это только несколько раз. Атрибут использования – andyg0808

+0

содержит селектор типа '$ ('. Item [data-tags * ="' + tag + '"]')'. Единственное, что вам нужно иметь в виду, это будет относиться к тегу как 'sky' и' bluesky' как к одному. – vijayP

ответ

3

Для этого вы можете использовать filter() до split()tags и найти данный тег в результирующем массиве. Попробуйте это:

//$('body').on('click', '.photo-gallery > nav > ul > li > a', function (event) { 
 
$('body').on('click', 'a', function(e) { // simplified for this example 
 
    e.preventDefault(); 
 
    var tag = $(this).data('tag'); 
 
    $('.item').fadeOut().filter(function() { 
 
    return $(this).data('tags').split(',').indexOf(tag) != -1; 
 
    }).fadeIn(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="item item1" data-tags="sky,sea,roads">sky, sea, roads</div> 
 
<div class="item item1" data-tags="skyteck,sea,roads">skyteck, sea, roads</div> 
 
<div class="item item2" data-tags="sea">sea</div> 
 
<div class="item item3" data-tags="sky,roads">sea, roads</div> 
 
<div class="item item4" data-tags="roads">roads</div> 
 

 
<br /><br /> 
 

 
<a href="#" data-tag="sky">Sky</a> 
 
<a href="#" data-tag="roads">Roads</a> 
 
<a href="#" data-tag="sea">Sea</a>

+0

Это отличное решение! благодаря –

0

Вы можете достичь этого с помощью фильтра() метод Ваш код JS должен быть

$('body').on('click', '.photo-gallery > nav > ul > li > a', function (event) { 
 
    var tag = $(this).data('tag'); 
 
    $('.item[data-tags]').filter(function(index) { 
 
    var all_tags=$(this).data('tags').split(','); 
 
    return !($.inArray(tag, all_tags) >= 0); 
 
    }).fadeOut(); 
 
    $('.item[data-tags]').filter(function(index) { 
 
     var all_tags=$(this).data('tags').split(','); 
 
     return $.inArray(tag, all_tags) >= 0; 
 
    }).fadeIn(); 
 
});

0

Попробуйте, как это. "[data-tags * =" + tag + "]", добавив здесь * = он найдет строку aproximatly match. Таким образом,

 $('body').on('click', '.photo-gallery > nav > ul > li > a', function(event) { 
     var tag = $(this).data('tag'); 
     $('.item').not("[data-tags*=" + tag+ "].item").fadeOut(); 
     $("[data-tags*=" + tag+ "].item").fadeIn(); 
     }); 

Надеюсь, что это сработает для вас.