Переход к дополнительным вкладкам внутри основных вкладок с другой страницы - PullRequest
0 голосов
/ 13 сентября 2018

Использование разных уровней вкладок для отображения большого количества информации.У меня 2 уровня вкладок.1-й уровень является основной категорией.2-й уровень - это подкатегория.

В настоящее время, когда я передаю href вкладки уровня 1 с другой страницы, я перехожу на конкретную вкладку.Чего я хочу добиться, так это нажать кнопку на другой странице и перейти непосредственно ко 2-му уровню вкладок.

Например: рассмотрим 2 основные вкладки (вкладки 1-го уровня) Marvel и DC
Hulkи Человек-паук - 2 вкладки под вкладкой Marvel
Супермен и Бэтмен - 2 вкладки под вкладкой DC

Чего я хочу добиться, так это если я помещаю кнопку Бэтмена на другую страницу, нажав на нее,Я на вкладке Бэтмен категории DC.

Мой код выглядит следующим образом:

<!--Level 1 tabs-->
    <a href="#marvel" data-toggle="tab">Marvel</a>
    <a href="#dc" data-toggle="tab">dc</a>

    <!--Level 1 content-->

    <div class="tab-content">
      <div class="tab-pane fade in active" id="marvel">

    <!--Level 2 tabs-->
    <ul class="nav nav-pills nav-stacked col-md-2">
       <li class="active><a href="#marvel_1" data-toggle="pill">Hulk</a></li>
      <li><a href="#marvel_2" data-toggle="pill">SpiderMan</a></li>
    </ul>

  <!--Level 2 Container-->
        <div class="tab-pane active" id="marvel_1">
            <p>The Hulk Tab!</p>
        </div>

        <div class="tab-pane" id="marvel_2">
            <p>The Spiderman Tab!</p>
        </div>
   </div> <!--End: Marvel Main Tab-->
 </div> <!--End: Tab Content-->

   <div class="tab-content">
      <div class="tab-pane fade in" id="dc">

    <!--Level 2 tabs-->
    <ul class="nav nav-pills nav-stacked col-md-2">
       <li class="active><a href="#dc_1" data-toggle="pill">Superman</a></li>
      <li><a href="#dc_2" data-toggle="pill">Batman</a></li>
    </ul>

  <!--Level 2 Container-->
        <div class="tab-pane active" id="dc_1">
            <p>The SuperMan Tab!</p>
        </div>

        <div class="tab-pane" id="dc_2">
            <p>The Batman Tab!</p>
        </div>
   </div> <!--End: DC Main Tab-->

С другой страницы, когда я нажимаю

   <a href="description.html#marvel">Marvel</a>

Где description.htmlэто страница, содержащая вкладки.jQuery на странице описания:

  <script>
    $(function () {
       var activeTab = $('[href=' + location.hash + ']');
       activeTab && activeTab.tab('show');
    });
    </script>

Переносит на конкретную вкладку Marvel или Dc с другой страницы.То, чего я хочу добиться, - это перейти на вкладку «Человек-паук» или вкладку «Бэтмен» под вкладкой «DC».

Сводка: В настоящее время при переходе на 1-й уровень вкладок с другой страницы требуется перейти на 2-й уровень непосредственно с другой страницы.

Рассмотрим:

-Марвел
- Халк
--SpiderMan

-DC
- Супермен
-Batman
В настоящее время перейдя на вкладку dc напрямую через ссылку привязки с другой страницы, хотите перейти непосредственно к Batman

1 Ответ

0 голосов
/ 14 сентября 2018

обычно вы хотите использовать переменные url вместо хеша местоположения, чтобы достичь этого. но недостатком является то, что история браузера не распознает, как вы перебираете страницы с разными героями (что позволяет вам использовать кнопки вперед / назад). поэтому вам придется создать дополнительный код, чтобы это работало.

так что вот решение, где мы «храним» всю необходимую информацию в хеше местоположения. чтобы упростить синтаксический анализ, мы используем специальные символы в качестве разделителей (что происходит так же, как если бы вы использовали переменные url): & для различия между различными переменными и = для разделения пар ключ-значение. хэш нового местоположения будет выглядеть так: #universe=dc&hero=aquaman

скрипт преобразует это в объект с именем selectedHero, так что значения доступны с selectedHero.universe и selectedHero.hero

как обычно, код помещается в функцию $( document ).ready(function(){.

создать функцию для чтения хеша местоположения и возврата данных в виде объекта.

  function getSelectedHero() {
      var mySelectedHero = {}; //initialize a new empty object
      var currentLocationHashValue = window.location.hash //read the location hash 
        .replace("#", "") //trim the '#' out of the string
        .split(/[&]+/); //split the string into an array

      $(currentLocationHashValue).each(function() { //loop through the freshly created array
        mySelectedHero[this.split(/[=]+/)[0]] = this.split(/[=]+/)[1]; //split the string into key/value pairs and assign them to the object, created at the beginning of the function 
      });
      return mySelectedHero; //return the object
    }

у нас есть основные части здесь. первый разбивает хеш из #universe=dc&hero=aquaman в массив с [0]="universe=dc" и [1]="hero=aquaman" во второй части мы перебираем все элементы массива (в данном случае есть только два, упомянутых выше) и снова разделяем их, создавая пары key -> value для нужного объекта. return доставляет следующий объект:

object{ universe: "dc", hero: "aquaman" }

теперь это можно легко использовать, чтобы выбрать правильную вкладку для выбранного героя

    function showSelectedHeroTab(selectedHero) {
      //don't forget to 'reset' the page, hiding all currently visible tabs
      $(".universe").hide();
      $(".hero").hide();

      //then open tab for selected hero
      $("#" + selectedHero.universe).show();
      $("#" + selectedHero.hero).show();
    }

это довольно просто, функция получает переданный объект, поэтому вы можете получить доступ к значениям, затем вы создаете свой селектор jquery с помощью "#"+ и своим именем переменной.

при включении только вышеперечисленных функций ничего не произойдет. поэтому мы изначально должны вызывать функции:

    var selectedHero = getSelectedHero();
    showSelectedHeroTab(selectedHero);

и, кроме того, мы хотим «обновлять» страницу всякий раз, когда изменяется хэш местоположения:

    $(window).on("hashchange", function() {
      var selectedHero = getSelectedHero();
      showSelectedHeroTab(selectedHero);
    }); 

этот код полностью пропускает какую-то обработку ошибок. поэтому, если хэш местоположения пуст, пара юниверс / герой не совпадает (например, marvel + batman) - так что вам придется добавить какую-то логику для пересылки на вкладку по умолчанию, когда данные непригодны для использования!

для целей тестирования я создал отдельную HTML-страницу, поэтому она выглядит иначе, чем ваша разметка, но, думаю, вы поймете, как переместить необходимые части в ваш код.

вот полный файл, включая html-разметку, скрипт и jquery cdn. просто скопируйте и вставьте в пустой файл, откройте в браузере и посмотрите, как он работает ...

<html>
<body>
    <div id="header">
        <p>
          <a href="#universe=dc&hero=superman">superman</a>
          <a href="#universe=dc&hero=batman">batman</a>
          <a href="#universe=dc&hero=aquaman">aquaman</a>
          <a href="#universe=dc&hero=flash">flash</a>
        </p>
        <p>
          <a href="#universe=marvel&hero=hulk">the hulk</a>
          <a href="#universe=marvel&hero=wolverine">wolverine</a>
          <a href="#universe=marvel&hero=ironman">iron man</a>
          <a href="#universe=marvel&hero=spiderman">spiderman</a>
        </p>
    </div>

<div id="body">
    <div id="marvel" class="universe">marvel: <br/>
        <div class="hero" id="hulk">
            hulk
        </div>
        <div class="hero" id="ironman">
            ironman
        </div>
        <div class="hero" id="wolverine">
            wolverine
        </div>
        <div class="hero" id="spiderman">
            spiderman
        </div>
    </div>
    <div id="dc" class="universe">dc: <br/>
        <div class="hero" id="superman">
            superman
        </div>
        <div class="hero" id="batman">
            batman
        </div>
        <div class="hero" id="aquaman">
            aquaman
        </div>
        <div class="hero" id="flash">
            flash
        </div>
    </div>
</div>

</body>

<script
    src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="crossorigin="anonymous">
</script>

<script>
    $( document ).ready(function() {            

        // we create a function to get the location hash 'data' as an object
        function getSelectedHero() {
          var mySelectedHero = {}; //initialize a new empty object
          var currentLocationHashValue = window.location.hash //read the location hash -> e.g. "#universe=dc&hero=batman"
            .replace("#", "") //trim the '#' out of the string -> "universe=dc&hero=batman"
            .split(/[&]+/) //split the string into an array -> [0]="universe=dc" [2]="hero=batman"
          $(currentLocationHashValue).each(function() { //loop through the freshly created array
            mySelectedHero[this.split(/[=]+/)[0]] = this.split(/[=]+/)[1]; //split the string into key/value pairs and assign them to the object, created at the beginning of the function 
          });
          return mySelectedHero; //return the object
        }

        // and we create a function, that opens the desired tab
        function showSelectedHeroTab(selectedHero) {
          //first make sure, nothing is shown 
          $(".universe").hide();
          $(".hero").hide();

          //then open tab for selected hero
          $("#" + selectedHero.universe).show();
          $("#" + selectedHero.hero).show();
          console.log (selectedHero);
        }

        //then we initally call the functions, to read the hash and show the tab 
        var selectedHero = getSelectedHero();
        showSelectedHeroTab(selectedHero);

        // additionally bind the event handler 'onhashchange' to fire when the location hash changes, to call the first two functions
        $(window).on("hashchange", function() {
        var selectedHero = getSelectedHero();
        showSelectedHeroTab(selectedHero);
        }); 
    });
</script>   
</html>
...