Правильный способ скрыть динамические элементы с помощью jQuery
У меня есть элемент div, который мой код заполнит динамическим количеством ссылок. Используя jquery, я хочу скрыть все ссылки, кроме первого. Это то, что я придумал, и это работает, мне просто интересно, если это лучший способ сделать это:
$("#panelContainer").each(function(n) {
$(this).children().hide();
$("#panelContainer a:first").show();
});
Ответы
Ответ 1
Вы можете немного сократить и ускорить его, используя :gt()
(больше чем) селектор, например:
$("#panelContainer :gt(0)").hide();
Это предполагает, что все дети являются якорями, что, по-видимому, относится к вашему вопросу, используйте a:gt(0)
, если вам нужно, чтобы затрагивать ссылки только, и есть другие элементы.
Это короче, потому что... ну, это короче. Это быстрее, потому что вы выбираете родителя один раз, потом дети и фильтруете вместо родителя, потомков, родителя и фильтрацию потомков. Кроме того, как и ваш оригинал, все ссылки будут отображаться в случае, если javascript отключен.
Ответ 2
$("#panelContainer a:not(:first-child)").hide();
Поскольку элементы a
добавляются динамически, может быть полезно добавить их в виде скрытых элементов, а затем показать первый (если он работает с намерением вашего приложения).
Следующее предполагает, что начальное состояние скрыто.
$("#panelContainer a:first-child").show(); // Instead of hiding many,
// you could show one.
Ответ 3
Есть только несколько альтернатив CSS только с примерами здесь. Прочитайте о совместимости селекторов в quirksmode. Может использоваться как селекторы в jQuery, а также с функцией hide()
.
Начиная с n + 2 или второго дочернего
#panelContainer :nth-child(n+2) {
display: none;
}
Все якоря, которые появляются после первого дочернего якоря
#panelContainer > a + a {
display:none;
}
@patrick, Все дочерние узлы, кроме первого
#panelContainer > :not(:first-child) {
display: none;
}
Еще раз спасибо @patrick за предложение этого супер-кросс-браузерного метода. Сначала скройте все ссылки, затем покажите первый
#panelContainer > a {
display: none;
}
#panelContainer > a:first-child {
display: inline;
}