帮助优化一些正常运行的jQuery

时间:2010-12-30 06:21:56

标签: javascript jquery html jquery-selectors

我有一些简单的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>

2 个答案:

答案 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个点击事件。

您可以找到工作样本here,但我认为您也可以查看this