【问题标题】:jQuery nav arrays, looking for an elegant solutionjQuery nav 数组,寻找优雅的解决方案
【发布时间】:2011-06-02 17:27:40
【问题描述】:

我一直在想最优雅的方式来实现以下目标......

我有以下导航结构:

    <div class="menu-wrap">
    <ul id="smenu">
      <li><a class="selected" href="#">1</a></li>
      <li><a class="" href="#">2</a></li>
      <li><a class="" href="#">3</a></li>
      <li><a class="" href="#">4</a></li>
      <li><a class="" href="#">5</a></li>
      <li><a class="" href="#">6</a></li>
      <li><a class="" href="#">7</a></li>
    </ul>
  </div>

页面其他地方的这个div:

    <div class="desc-wrap">
    <p>blah blah blah</p>
    <p>blah blah blah</p>
    <p>blah blah blah</p>
    <p>blah blah blah</p>
    <p>blah blah blah</p>
    <p>blah blah blah</p>
    <p>blah blah blah</p>
</div>

默认情况下p都是隐藏的;如果我点击第一个 li,我希望第一个 p 出现,等等。简单吧?我已经用几种不同的方式让它工作了,但我一直在想我应该能够用更少的行来完成它。

这是我的超级蹩脚的,添加了类名:

        $("#smenu li").click(function() {
    $(".desc-wrap p").hide();       
});
$("li.desc-one").click(function() {
    $("p.desc-one").show();
});
$("li.desc-two").click(function() {
    $("p.desc-two").show();
});
$("li.desc-three").click(function() {
    $("p.desc-three").show();
});
$("li.desc-four").click(function() {
    $("p.desc-four").show();
});
$("li.desc-five").click(function() {
    $("p.desc-five").show();
});
$("li.desc-six").click(function() {
    $("p.desc-six").show();
});
$("li.desc-seven").click(function() {
    $("p.desc-seven").show();
});

这是我的数组尝试的开始,但你可以看到它的去向:

        var mappedPs = $(".desc-wrap p").map(function (index) {
    if (index == 0) {
        $(this).show();
    }
    else {
        $(this).hide();
    }
});
var mappedList = $("#smenu li").map(function (index) {
    if (index == 0) {
        $("#smenu li").click(function() {
            $(mappedPs[0]).show();
        });
    }
    else {
        $(mappedPs[1,2,3,4,5,6]).hide();
    }
});

我是否遗漏了一些明显的东西?我觉得这应该比结果简单得多......

【问题讨论】:

    标签: javascript jquery arrays navigation


    【解决方案1】:

    为什么不直接使用.index()

    $('#smenu li').click(function(){
        $('.desc-wrap p').hide().eq($(this).index()).show();
    });
    

    【讨论】:

    • 哇,我一直认为我应该最终得到的解决方案已经死了。完美!
    【解决方案2】:
    $('#smenu li').each(function(index) {
      $(this).click(function() {
        $('.desc-wrap p:eq('+index+')').show();
      });
    });
    

    或者(这将隐藏任何可见的段落标签)

    $('#smenu li').each(function(index) {
      $(this).click(function() {
        $('.desc-wrap p').hide().filter(':eq('+index+')').show();
      });
    });
    

    【讨论】:

    • 我建议编辑它以包含隐藏其他 p 元素的方法。但是 +1 可以按要求回答问题。 :)
    • @David Thomas:感谢您指出这一点。我已经更新了我的答案以反映这两种方法。
    • 这也很完美;两者都有优势吗? (忘了提到我还需要在点击时隐藏其他 p 标签 - 感谢您了解这一点)
    • @collin:第一个不隐藏其他段落标签,替代解决方案可以。
    • @devmatt:对不起,我的意思是把点击包装在另一个函数中,而不是下面使用 .index 调用的帖子有优势吗?只是为了满足我的好奇心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多