我有一些简单的jQuery,它添加了一些标签功能。这是基于我在某处发现的东西(不记得在哪里),但此时它可能大部分都是原创的。我遇到了一些选择器的麻烦,所以我不得不做一些看起来很尴尬的事情(参见.children()。children part)。尴尬的部分源于添加在单个页面上处理多组选项卡的功能。
我可能使用选择器错了吗?你能在这里看到还有其他改进空间吗?
这是jQuery:
// Create and manage tab blocks
$('.tab-sections section').hide(); // Hide all tabs
$('.tab-list').each(function(){ // Make the first tab active
$('.tab-list li:first-child').addClass('active');
});
$('.tab-sections').each(function(){ // Make the first tab's content visible
$('.tab-sections section:first-child').show();
});
$('.tab-list li').click(function() {
$(this).siblings().removeClass('active'); // Remove any "active" class
$(this).addClass('active'); // Add "active" class to selected tab
// Hide tabs. This looks awkward, but .children('.tab-sections section') wouldn't work
$(this).parents('.tab-block').children('.tab-sections').children('section').hide();
// Find the href attribute value to identify the active tab + content
var activeTab = $(this).find('a').attr('href');
$(activeTab).fadeIn('fast'); // Fade in the active ID content
return false;
});
这是HTML:
<div class="tab-block grad-tabs">
<ul class="tab-list">
<li><a href="#tab1" title="tab 1">Tab 1</a></li>
<li><a href="#tab2" title="tab 2">Tab 2</a></li>
<li><a href="tab3" title="tab 3">Tab 3</a></li>
</ul>
<div class="tab-sections">
<section id="tab1">
<h2>Tab 1</h2>
<p>Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
</section>
<section id="tab2">
<h2>Tab 2</h2>
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.</p>
</section>
<section id="tab3">
<h2>Tab 3</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
</section>
</div>
</div>
答案 0 :(得分:1)
您可以进行一些改进,对于您的主要问题,您可以使用.find()
来解决.children()
问题,而不是:
$(this).parents('.tab-block').children('.tab-sections').children('section').hide();
使用.closest()
然后.find()
向上转到.tab-block
,你想要的内容如下:
$(this).closest('.tab-block').find('.tab-sections section').hide();
对于其余部分,是的还有更多优化,不需要初始.each()
循环,因为它们都重复执行相同的操作,您可以进一步优化.click()
内的初始隐藏和链接处理程序,像这样:
$('.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>
一个。
答案 1 :(得分:0)
您可能对此感兴趣
var sections = $('.tab-sections section');
sections.hide();
$('.tab-list li:first-child').addClass('active');
$('.tab-sections section:first-child').show();
$('.tab-list').delegate("li", "click", function() {
$(this).addClass('active').siblings().removeClass('active');
sections.hide();
var activeTab = $(this).children('a').attr('href');
$(activeTab).fadeIn('fast');
});
这里我已经缓存了这些部分,因为它在页面操作期间被多次使用。
再次使用jquery delegate方法,而不是向3个li
元素中的每一个添加1个点击事件。