【问题标题】:jQuery core tabs script - multiple instances?jQuery核心选项卡脚本 - 多个实例?
【发布时间】:2011-03-11 15:41:57
【问题描述】:

我的网站上有以下 jQuery 脚本,可以在不重新加载页面的情况下切换标签。我正在使用 jQuery 核心 v1.3.2(不是 jQuery UI)

<!-- JS -->
<script type="text/javascript">
    $(function() {
        var tabify = function () {
            var id = $('#content > div').hide().attr('aria-hidden', 'true').filter(window.location.hash || ':first').show().attr('aria-hidden', 'false').attr('id');
            $('#content > ul > li').removeClass('selected').find('a[href=#' + id + ']').parent().addClass('selected');
        }
        setInterval(tabify, 100);
        tabify();
    });
</script>

<!-- HTML -->
<div id="content">

  <ul>
    <li><a href="#blog" role="tab">Blog</a></li>
    <li><a href="#videos" role="tab">Videos</a></li>
    <li><a href="#photos" role="tab">Photos</a></li>
  </ul>            

  <div id="blog" role="tabpanel" aria-labelledby="tab1" aria-hidden="false">Blog Content</div>
  <div id="videos" role="tabpanel" aria-labelledby="tab2" aria-hidden="true">Videos Content</div>
  <div id="photos" role="tabpanel" aria-labelledby="tab3" aria-hidden="true">Photos Content</div>                       

</div>

我想在同一页面上添加此脚本的另一个实例,但仅使用不同的变量名称复制/粘贴它是行不通的。有什么想法吗?

编辑:这是我的第二个实例的 HTML 和 JS。问题是当我在第二个实例中单击一个选项卡时,它会在第一个实例中隐藏所有内容 div,反之亦然。我希望它们彼此独立。

<!-- JS -->
<script type="text/javascript">
    $(function() {
        var tabifyplayer = function () {
            var idplayer = $('#discography > div').hide().attr('aria-hidden', 'true').filter(window.location.hash || ':first').show().attr('aria-hidden', 'false').attr('idplayer');
            $('#discography > ul > li').removeClass('selected').find('a[href=#' + idplayer + ']').parent().addClass('selected');
        }
        setInterval(tabifyplayer, 100);
        tabifyplayer();
    });
</script>

<!-- HTML -->
<div id="discography">
  <ul>
    <li><a href="#cor-player" role="tab">Chance of Rain (2009)</a></li>
    <li><a href="#debutcd-player" role="tab">Debut CD (2007)</a></li>
  </ul>

  <div id="cor-player" role="tabpanel" aria-labelledby="tab1" aria-hidden="false">Content Goes Here</div>
  <div id="debutcd-player" role="tabpanel" aria-labelledby="tab2" aria-hidden="true">Content Goes Here</div>
</div>

【问题讨论】:

    标签: jquery jquery-tabs jquery-1.3.2


    【解决方案1】:

    您的代码中有许多区域已硬编码元素。我想您打算为新标签集使用另一个容器,因此如果您要进行最少的更改,则需要确保更改代码的这些部分。

    <script type="text/javascript">
      $(function() {
        var tabify = function () {
          var id = $('#content > div') // Hard Coded content container.
                    .hide()
                    .attr('aria-hidden', 'true')
                    .filter(window.location.hash || ':first')
                    .show()
                    .attr('aria-hidden', 'false')
                    .attr('id');
          $('#content > ul > li') // Hard Coded tab elements.
            .removeClass('selected')
            .find('a[href=#' + id + ']')
            .parent()
            .addClass('selected');
        }
        setInterval(tabify, 100);
        tabify();
      });
    </script>
    

    实际上,稍微调整一下所有内容可能会更好地为您服务,这样您就不会依赖间隔。

    $(function () {
      var mine = $('#content > ul > li > a').click(function () {
        $(this)
          .parent()
          .addClass('selected')
          .siblings('li')
          .removeClass('selected');
    
        $('#content > div')
          .filter($(this).attr('href') || ':first')
          .show().attr('aria-hidden', 'false')
          .siblings('div')
          .hide().attr('aria-hidden', 'true');
      });
    
      if (window.location.hash != undefined) {
        mine.filter('[href=' + window.location.hash + ']').click();
      } else {
        mine.filter(':first').click();
      }
    });
    

    我相信第二个示例应该接近实现相同的效果(尽管查看您的 HTML 结构可以帮助我验证这一点)并且更容易适应另一组元素。

    【讨论】:

    • 我已经用所有相关代码更新了我的问题。您的建议会导致一些不稳定的导航,因此单击的选项卡不会为您提供正确的 div。
    • @sam-nabi - 感谢您添加一些额外的代码。我稍微调整了我的方法 (filter($(this).attr('href') || ':first') 以解决我认为导致奇怪导航的问题。如果有帮助,请告诉我。
    • 我们到了那里......它运行良好(两个实例),除了三件事: 1. 在页面加载时,所有 div 都被展开。只应显示第一个 div;其他的应该隐藏。 2. 单击选项卡会使页面向下滚动到相应的锚点。有没有办法将窗口位置保持在原来的位置? 3. 按后退按钮没有任何作用。它应该转到先前加载的选项卡。对不起,如果这些是微不足道的;我还没有完全理解 PHP!
    • @sam-nabi - 我又做了一些修改。这是否解决了您描述的一些错误行为?另外,这不是 PHP,这是 Javascript。
    • Javascript,对。这是漫长的一天。不幸的是,您的更改似乎没有任何区别......
    【解决方案2】:

    我在这个页面上找到了一个很好的解决方案:jQuery tabs - multiple sets on on page

    这种方式也减少了代码重复。 (它唯一不做的就是让你使用后退按钮,但我可以忍受。)

    jQuery.fn.minitabs = function(speed,effect) {
      var id = "#" + this.attr('id')
      $(id + ">div:gt(0)").hide();
      $(id + ">ul>li>a:first").addClass("selected");
      $(id + ">ul>li>a").click(
        function(){
          $(id + ">ul>li>a").removeClass("selected");
          $(this).addClass("selected");
          $(this).blur();
          var re = /([_\-\w]+$)/i;
          var target = $('#' + re.exec(this.href)[1]);
          var old = $(id + ">div");
          old.hide();
          target.show()
          return false;
        }
     );
    }
    $('#tabset1').minitabs();
    $('#tabset2').minitabs();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      相关资源
      最近更新 更多