2016-08-16 4 views
0

Как правильно использовать функцию eq для нескольких классов? Поскольку div с классом «a» не является последующим, я не могу использовать функцию «eq» для обновления своего класса. Если divs с классом «b» удаляются, функция работает отлично. Вот скрипка https://jsfiddle.net/9w8zhg7d/4/. У меня есть следующий HTML:Использование jQuery '.eq()' с несколькими классами

<div class="a current"> 
</div> 
<div class="a"> 
</div> 
<div class="b"> 
</div> 
<div class="b"> 
</div> 
<div class="a"> 
</div> 
<div class="a"> 
</div> 

и следующий JavaScript:

Class = { 
    a: ".a", 
    highlighted: ".a.current", 
    init: function() { 
     $(this.a).click(this.toggleA.bind(this)); 
    }, 
    toggleA: function(e) { 
     e.preventDefault(); 
     $(this.highlighted).removeClass("current"); 
     var target = $(e.target); 
     var clickedA = target.closest(this.a); 
     var clickedIndex = clickedA.index(); 
     $(".a").eq(clickedIndex).addClass("current"); 
     console.log(clickedIndex); 
     $(".b").eq(clickedIndex).css("display", "inline-block"); 
    } 
}; 

Class.init(); 

Любая помощь очень ценится!

+0

'.eq()' вообще не работает с * classes *, он работает над тем, какие элементы находятся в вашем объекте jQuery. Поэтому, если вы хотите применить его во всех элементах '.a' и' .b', просто выберите их все: '$ (". A ,.b "). eq (x)'. (Сказав это, я не понимаю, что вы пытаетесь сделать. В вашем примере есть четыре a и только два b, поэтому я не вижу, как эти элементы относятся к каждому другое. Я не понимаю, как вы используете '.closest()', но это выглядит неправильно, потому что в html показано, что все элементы являются братьями и сестрами.) – nnnnnn

+0

Мне любопытно, что вы пытаетесь выполнить? может быть, что использование '.eq' может быть не лучшим вариантом, если мы знаем, что вы пытаетесь выполнить. –

+0

Если вы посмотрите на скрипку, вы увидите, что щелчок на первых двух а работает правильно, но третий и четвертый a не получает «текущий» класс при нажатии. Remove, div и функция b работают для всех A. Я хочу, чтобы он работал таким образом с помощью div 'b' в миксе. – JordanBarber

ответ

2

Если я правильно понимаю ваш вопрос, вы хотите знать, индекс конкретного .a элемента, которая была нажата, игнорируя все остальные элементы. В этом случае вы просто должны использовать .index() method правильно:

var clickedIndex = $(this.a).index(e.target); 

При вызове .index() без аргументов, как в вашем коде, он находит индекс первого элемента в JQuery объекта относительно его братьев и сестер, а не по отношению к другие элементы в объекте jQuery. Код, который я показал, говорит, чтобы сначала выбрать все элементы .a, а затем в этих элементах только определить положение элемента e.target.

Вы также слишком усложнили настройку класса current - не имеет смысла использовать .closest(), потому что это для навигации по DOM, и все ваши элементы - братья и сестры. Вы можете просто сказать:

$(e.target).addClass("current"); 

Я не понимаю, как вы хотите применить индекс щелкнули .a элемента к .b элементов, потому что есть четыре .a «ы и только два .b», но все еще положить, что я сказал выше, вместе с вашим кодом дает что-то вроде этого:

Class = { 
 
    a: ".a", 
 
    highlighted: ".a.current", 
 
    init: function() { 
 
    $(this.a).click(this.toggleA.bind(this)); 
 
    }, 
 
    toggleA: function(e) { 
 
    e.preventDefault(); 
 
    $(this.highlighted).removeClass("current"); 
 
    var target = $(e.target).addClass("current"); 
 
    var clickedIndex = $(this.a).index(e.target); 
 
    console.log(clickedIndex); 
 
    $(".b").removeClass("current").eq(clickedIndex).addClass("current"); 
 
    $(".c").removeClass("current").eq(clickedIndex).addClass("current"); 
 
    } 
 
} 
 

 
Class.init();
.a,.b { width:50px; height:50px; background:black; display:inline-block; } 
 
.c { width:20px; height:20px; background:blue; display:inline-block; } 
 
.a.current{ background:red; } 
 
.c.current, .b.current{ background:green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<div class="a current"></div> 
 
<div class="a"></div> 
 
<div class="b"></div> 
 
<div class="b"></div> 
 
<div class="a"></div> 
 
<div class="a"></div> 
 
<div class="related"> 
 
    <div class="c"></div> <div class="c"></div> <div class="c"></div> <div class="c"></div> 
 
</div>

(или обновленную версию скрипки: https://jsfiddle.net/9w8zhg7d/8/)

+0

Прошу прощения, я упростил скрипку и код, чтобы сделать это быстрее, но не понял, что я удалил основной момент. Элемент clicked не является тем, что будет получать текущий класс, а скорее другой набор div. Вот почему мне нужно получить индекс щелчка и применить его (через «eq») к индексу другого набора divs – JordanBarber

+0

Право. Но я думаю, что код в моем ответе точно показывает, как это сделать. Вы можете видеть, как вы нажимаете на элементы 'a', правильный указатель появляется в консоли, а также обновляет соответствующие элементы' b' ... Поэтому просто адаптируйте эту демонстрацию к вашей реальной ситуации. Похоже, основная проблема, с которой вы столкнулись, заключалась в том, что вы неправильно использовали '.index()' для этого сценария. – nnnnnn

+0

Я обновил свой ответ, чтобы добавить дополнительный набор элементов, чтобы лучше имитировать вашу реальную ситуацию. – nnnnnn

0

Хорошо, я чувствую, что решение, которое вы предлагаете, может быть слишком сложным. Вы рассматривали это решение?

HTML:

<div class="container"> 
    <div class="a current"></div> 
    <div class="a"></div> 
    <div class="b"></div> 
    <div class="b"></div> 
    <div class="a"></div> 
    <div class="a"></div> 
</div> 

CSS:

.container { 
    display: flex; 
    flex-wrap: wrap; 
    width: 100%; 
} 

.container > div { 
    width:50px; 
    margin: 1em; 
    height:50px; 
    background:black; 
} 

.a.current{ 
    background:red; 
} 

Javascript:

$('.container > div').on('click', function() { 
    $('.container > div').removeClass("current"); 
    $(this).addClass('current') 
}); 

Это будет просто применить .current к одной щелкнуло, и при удалении его из всех. Ориентация на родителя позволяет использовать эту функциональность без необходимости работать с классом специфики дочерних div.

JsFiddle: https://jsfiddle.net/9w8zhg7d/7/

+0

Не забывайте, что '.a.current' должен быть' .container> div.current' в CSS сейчас :) – Aziz

+0

@ Азиз Я, я думал об этом. Но я не был уверен в его первоначальном намерении, поэтому я просто оставил это так. Возможно, он уходит из стиля «.b.current»? Shrug. –

Смежные вопросы