#html #jquery
Вопрос:
У меня есть такая структура:
<div id="prev-button">
Previous
</div>
<ul class="thumbnails">
<li class="" data-skus="">
<a class="thumbnail active">
<img src=""></a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src=""></a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src=""></a>
</li>
</ul>
<div id="next-button">
Next
</div>
Мне нужно добавить new-class
id="prev-button"
, когда у первого <li>
есть active
класс для своего <a>
ребенка.
Когда у первого якоря нет active
класса, удалите new-class
из id="prev-button"
Кроме того, когда последний элемент списка имеет active
класс, добавленный в его дочерний якорь, то же new-class
самое должно быть добавлено в id="next-button"
.
Я попытался добавить new-class
в родительский список элемент, когда привязка имеет active
класс и не работает.
if ($('.thumbnail').is(".active")) {
$(this).parent().addClass("active");
}
Комментарии:
1. Подсказка: Используйте реальные элементы кнопок для обеспечения доступности или, по крайней мере, применяйте соответствующие роли ARIA .
2. Где ты набираешь этот код? Пожалуйста, пересмотрите свой пост, чтобы показать функционирующий фрагмент. jQuery доступен прямо из редактора фрагментов.
Ответ №1:
Вы можете использовать .index
, чтобы узнать последовательный порядок выбранного элемента. Таким образом, в зависимости от того, какой из них активен, следующее выражение:
$(".thumbnail.active").parent().index()
будет оцениваться как 0, 1 или 2.
Затем с toggleClass()
помощью вы можете установить «новый класс» на первой кнопке, когда и только если этот индекс равен 0, и нечто подобное можно сделать для другой кнопки.
Вот демо-версия:
// The argument to this function determines how the current selection should move:
// 0: don't move it; just apply the necessary CSS
// 1: move it down
// -1: move it up
function select(dir) {
let last = $(".thumbnail").length - 1;
let curr = $(".thumbnail.active").parent().index() dir;
if (curr >= 0 amp;amp; curr <= last) {
$(".thumbnail").removeClass("active").eq(curr).addClass("active");
$("#prev-button").toggleClass("disabled", curr == 0);
$("#next-button").toggleClass("disabled", curr == last);
}
}
$("#prev-button").click(select.bind(0, -1));
$("#next-button").click(select.bind(0, 1));
select(0); // initialise also on page load
#prev-button, #next-button {
padding: 5px;
text-align: center;
background: lightblue;
display: inline-block;
user-select: none;
cursor: pointer;
}
.active { background: yellow }
#prev-button.disabled, #next-button.disabled { background: silver }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="prev-button">
Previous
</div>
<ul class="thumbnails">
<li class="" data-skus="">
<a class="thumbnail active">
<img src="">first</a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src="">second</a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src="">third</a>
</li>
</ul>
<div id="next-button">
Next
</div>
Без parent().index()
:
Вышеизложенное довольно чувствительно к структуре документа. В качестве альтернативы вы можете использовать index
с аргументом, который работает так же, как indexOf
и с массивами:
// The argument to this function determines how the current selection should move:
// 0: don't move it; just apply the necessary CSS
// 1: move it down
// -1: move it up
function select(dir) {
let $links = $(".thumbnail");
let $active = $links.filter(".active");
let curr = $links.index($active) dir;
let last = $links.length - 1;
if (curr >= 0 amp;amp; curr <= last) {
$(".thumbnail").removeClass("active").eq(curr).addClass("active");
$("#prev-button").toggleClass("disabled", curr == 0);
$("#next-button").toggleClass("disabled", curr == last);
}
}
$("#prev-button").click(select.bind(0, -1));
$("#next-button").click(select.bind(0, 1));
select(0); // initialise also on page load
#prev-button, #next-button {
padding: 5px;
text-align: center;
background: lightblue;
display: inline-block;
user-select: none;
cursor: pointer;
}
.active { background: yellow }
#prev-button.disabled, #next-button.disabled { background: silver }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="prev-button">
Previous
</div>
<ul class="thumbnails">
<li class="" data-skus="">
<a class="thumbnail active">
<img src="">first</a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src="">second</a>
</li>
<li class="" data-skus="">
<a class="thumbnail">
<img src="">third</a>
</li>
</ul>
<div id="next-button">
Next
</div>
Комментарии:
1. Когда последний элемент списка добавляет активный класс к своему дочернему якорю, тот же новый класс должен быть добавлен в id=»кнопка далее»-Можем ли мы сделать это без использования какого-либо индекса? Этот метод мешает работе jscarousel lite, которую я использую. Что-то вроде $(‘ul li:последний ребенок a.активный’)…. Спасибо
2. Что касается вашей первой фразы: я считаю, что именно это делает мой ответ, когда вы запускаете фрагмент. Что касается вашего вопроса: вы можете обойтись без этого
index()
. Есть еще одна подписьindex
того, где вы передаете аргумент. Тогда это работает совершенно по-другому, и, возможно, это то, что вы ищете. Я добавил второй фрагмент, в котором используется эта идея.3. Я добавил код, и большие пальцы карусели прыгают с 2 на 2 и выше 1 (так как это последнее изображение), а также класс disabled не добавлен (существующий код уже объявлен .отключен, поэтому я изменил ваш код на disabled1 и, как я уже сказал, он не добавляет новый класс. Знаете ли вы, как добавить новый класс к кнопке «Далее» только тогда, когда у последнего li есть ребенок с .active ? $(‘ul li:последний ребенок a.активный’)- — — — что должно быть здесь, чтобы переключить новый класс для следующей кнопки? Спасибо
4. Извините, но все, что я могу сказать, это то, что в этом фрагменте это работает. Если у вас другая ситуация, я предлагаю вам опубликовать новый вопрос, содержащий код для воспроизведения возникшей у вас проблемы
5. Спасибо за всю вашу помощь. Опубликовать новый код невозможно, потому что галерея создается из html php jquery. Я попытался получить весь соответствующий код, но мне не удалось создать правильный jsfiddle.
Ответ №2:
Почему вы пытаетесь получить доступ к id="prev-button"
с $(this).parent().addClass("active");
? Родителем будет li
элемент. Почему бы не использовать $("#prev-button")
для доступа к кнопке prev?
Вы можете создать игровую площадку на Codepen.io чтобы поэкспериментировать, например. Я создал один такой, который является первым исправлением того, о чем вы просили: https://codepen.io/peter-krebs/pen/xxdxoPZ
https://api.jquery.com/ содержит массу ресурсов, которые вы можете прочитать с помощью примера кода. Не бойтесь заниматься самообразованием, не просто догадывайтесь, как это работает.