Frage

Ich habe folgenden jQuery-Skript auf meiner Website Schalter Reiter ohne die Seite neu zu laden. Ich bin mit jQuery Core v1.3.2 (NICHT 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>

Ich möchte eine andere Instanz dieses Skript auf der gleichen Seite hinzuzufügen, aber einfach kopieren / einfügen diese mit unterschiedlichen Variablennamen nicht funktioniert. Irgendwelche Ideen?

EDIT: Hier ist mein HTML und JS für die zweite Instanz. Das Problem ist, wenn ich in der zweiten Instanz auf eine Registerkarte klicken, es blendet alle Inhalte divs in der ersten Instanz, und vice versa. Ich möchte, dass sie voneinander unabhängig sein.

<!-- 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>
War es hilfreich?

Lösung 2

fand ich eine gute Lösung auf dieser Seite: jQuery Tabs - mehrere Sätze auf auf Seite

Es ist weniger Code-Duplizierung diese Weise auch. (Nur, was es nicht tut, ist können Sie die Zurück-Taste verwenden, aber ich kann damit leben.)

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();

Andere Tipps

Sie haben eine Reihe von Regionen in Ihrem Code, wo Sie hartcodierte Elemente haben. Ich denke, Sie beabsichtigen, einen anderen Behälter für die neuen Registerkarten-Set zu verwenden, so dass Sie sicherstellen werden wollen, dass Sie die Teile des Codes ändern, wenn Sie sich für eine minimale Menge an Veränderung gehen.

<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>

Wirklich obwohl, sind Sie wahrscheinlich besser gedient, indem sie alles ein bisschen so eingestellt, dass Sie nicht auf einem Intervall angewiesen zu sein.

$(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();
  }
});

Ich glaube, dass zweites Beispiel soll nahe kommen, das gleiche zu erreichen (wenn Sie Ihre HTML-Struktur zu sehen, würde mir helfen, das zu überprüfen) und wird einfacher für eine anderen Satz von Elementen anzupassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top