Вы можете сделать еще несколько улучшений, для вашего основного вопроса вы можете использовать .find()
для решения проблемы .children()
вместо этого:
$(this).parents('.tab-block').children('.tab-sections').children('section').hide();
Поднимитесь на .tab-block
, используя .closest()
, затем .find()
, что вы хотите внутри, например:
$(this).closest('.tab-block').find('.tab-sections section').hide();
Дляостальное, да, есть больше оптимизаций, нет необходимости в начальных циклах .each()
, поскольку они все повторяют одно и то же, и вы можете дополнительно оптимизировать свое первоначальное скрытие и создание цепочек внутри .click()
* обработчик 1025 *, например:
$('.tab-sections section:not(:first-child)').hide(); // Hide all content that not the first
$('.tab-list li:first-child').addClass('active');
$('.tab-list li').click(function() {
$(this).addClass('active').siblings().removeClass('active'); // Add "active" class to selected tab, remove any other "active" class
$(this).closest('.tab-block').find('.tab-sections section').hide(); // Hide tabs.
var activeTab = $(this).find('a').attr('href'); // Find the href attribute value to identify the active tab + content
$(activeTab).fadeIn('fast'); // Fade in the active ID content
return false;
});
Если вы используете jQuery 1.4.1+, вы можете еще больше оптимизировать его с помощью .delegate()
, изменив это:
$('.tab-list li').click(function() {
К этому:
$('.tab-list').delegate('li', 'click', function() {
Это прикрепляет один click
обработчик на элемент .tab-list
, а не один на <li>
.