Twitter 부트 스트랩-탭-URL이 변경되지 않음


109

저는 Twitter Bootstrap과 "탭"을 사용하고 있습니다.

다음 코드가 있습니다.

<ul class="nav nav-tabs">
    <li class="active"><a data-toggle="tab" href="#add">add</a></li>
    <li><a data-toggle="tab" href="#edit" >edit</a></li>
    <li><a data-toggle="tab" href="#delete" >delete</a></li>
</ul>

탭은 제대로 작동하지만 URL에 #add, #edit, #delete가 추가되지 않았습니다.

data-toggleURL 변경을 제거 했지만 탭이 작동하지 않습니다.

이것에 대한 해결책이 있습니까?


1
이 문제를 해결하는 플러그인 : github.com/timabell/jquery.stickytabs
Tim Abell

답변:


269

이 코드를 사용해보십시오. URL에 탭 href를 추가하고 페이지로드시 해시를 기반으로 탭을 엽니 다.

$(function(){
  var hash = window.location.hash;
  hash && $('ul.nav a[href="' + hash + '"]').tab('show');

  $('.nav-tabs a').click(function (e) {
    $(this).tab('show');
    var scrollmem = $('body').scrollTop() || $('html').scrollTop();
    window.location.hash = this.hash;
    $('html,body').scrollTop(scrollmem);
  });
});

1
아주 잘 작동합니다. +1. 하지만 selector에서 "hash && $ .."의 이유는 show tab인데 "hash &&"를 의미하는 것은 무엇입니까? 감사합니다
richardhell ​​2013

4
&&AND, 왼쪽이 true ( hash0이 아니거나 null 또는 비어 있음)이고 오른쪽이 true이면 무언가를 수행합니다. 그러나 줄은 a로 끝나 ;므로 이전 ;에 할 일이 없으며 탭이 표시되거나 표시되지 않고 .tab('show')반환 되는 항목 은 중요하지 않지만 계속 시도합니다. 이런 식으로 논리를 평가할 때 방정식의 첫 번째 부분 (앞 &&)이 거짓이면 계속 평가할 필요가 없으므로 탭이 표시되지 않습니다. 다음과 같은 동일한 효과를 얻을 수 있습니다.if(hash){ $('ul.nav a[href="' + hash + '"]').tab('show'); }
vahanpwns

1
TL; DR : a && b;try를 의미 a하고 true 인 경우에만 try b. 비어 있지 않으면 문자열은 참입니다.
vahanpwns

8
"#"URL을 사용할 때 맨 위에 페이지를 다시로드하도록하려면 어떻게해야합니까? 지금은 탭이 시작되는 곳으로 스크롤됩니다. 실제 페이지로 스크롤하고 싶습니다
kibaekr 2014

1
잘 작동하지만 Bootstrap 3
Zzirconium

49

완전한 솔루션에 필요한 세 가지 구성 요소가 있습니다.

  1. URL에 해시가있는 경우 페이지가로드 될 때 올바른 탭을 표시합니다.
  2. 탭이 변경 될 때 URL의 해시를 변경합니다.
  3. URL (뒤로 / 앞으로 버튼)에서 해시가 변경되면 탭을 변경하고 첫 번째 탭이 올바르게 순환되는지 확인합니다.

여기에 언급 된 의견이나 수용된 답변이 이러한 모든 시나리오를 처리한다고 생각하지 않습니다.

상당히 관련되어 있기 때문에 작은 jQuery 플러그인으로 가장 적합하다고 생각합니다 : https://github.com/aidanlister/jquery-stickytabs

다음과 같이 플러그인을 호출 할 수 있습니다.

$('.nav-tabs').stickyTabs();

나는 이것에 대한 블로그 게시물을 만들었습니다. http://aidanlister.com/2014/03/persisting-the-tab-state-in-bootstrap/


나는 그것을 자신의 git repo : github.com/timabell/jquery.stickytabs- 플러그인에 감사드립니다.
Tim Abell 2014

이 솔루션은 @tomaszback의 솔루션이 아닌 뒤로 / 다음 검색에서도 작동하므로 +1합니다. 감사!
bitfidget

이것은 훌륭하고 잘 작동하지만 URL에 해시가있는 페이지를로드 할 때는 그렇지 않습니다. 내가 잘못한 일인지 확인하기 위해 계속해서 파고들 것입니다. 그러나 나는 +1을 줄 것이다
MattBoothDev

27

를 사용 하면 플러그인이 탭을 처리 data-toggle="tab" 하도록 요청 하며, 탭을 처리하는 동안 preventDefault이벤트 ( github의 코드)를 호출 합니다 .

자신의 탭 활성화를 사용하고 이벤트가 진행되도록 할 수 있습니다.

$('.nav-tabs a').click(function (e) {
    // No e.preventDefault() here
    $(this).tab('show');
});

그리고 속성을 제거해야합니다. data-toggle="tab"

의심 스러운 경우 문서를 확인하십시오 .


11

앵커 요소가 이미 URL 해시를 변경하므로 onhashchange 이벤트를 수신하는 것도 좋은 옵션입니다. @flori가 이미 언급했듯이이 방법은 브라우저 뒤로 버튼과 함께 잘 작동합니다.

var tabs$ = $(".nav-tabs a");

$( window ).on("hashchange", function() {
    var hash = window.location.hash, // get current hash
        menu_item$ = tabs$.filter('[href="' + hash + '"]'); // get the menu element

    menu_item$.tab("show"); // call bootstrap to show the tab
}).trigger("hashchange");

마지막으로 리스너를 정의한 직후에 이벤트를 트리거하면 페이지로드시 올바른 탭을 표시하는 데 도움이됩니다.


3

문제에 대한 나의 해결책 :

먼저 다음과 같이 data-valuea링크 에 새 속성을 추가 합니다.

<ul class="nav nav-tabs">
    <li class="active">
        <a data-toggle="tab" href="#tab-add" data-value="#add">add</a>
    </li>
    <li>
        <a data-toggle="tab" href="#tab-edit" data-value="#edit">edit</a>
    </li>
    <li>
        <a data-toggle="tab" href="#tab-delete" data-value="#delete">delete</a>
    </li>
</ul>

둘째, 탭의 ID를 변경 (예 :에서 add로) tab-add하고 tab-접두사 를 포함하도록 href도 업데이트 합니다.

<div class="tab-content">
    <div class="tab-pane" id="tab-add">Add panel</div>
    <div class="tab-pane" id="tab-edit">Edit panel</div>
    <div class="tab-pane" id="tab-delete">Panel panel</div>
</div>

그리고 마지막으로 js 코드 :

<script type="text/javascript">
    $(function () {
        var navTabs = $('.nav-tabs a');
        var hash = window.location.hash;
        hash && navTabs.filter('[data-value="' + hash + '"]').tab('show');

        navTabs.on('shown', function (e) {
            var newhash = $(e.target).attr('data-value');
            window.location.hash = newhash;
        });
    })
</script>

다음은 jsFiddle입니다 .하지만 jsFiddle에서 사용하는 iframe 때문에 작동하지 않지만 내 솔루션의 소스를 읽을 수 있습니다.


3

Bootstrap 3 탭을 사용하는 CakePHP와 동일한 문제가 있으며 외부 URL 및 앵커로 보낼 때 많은 솔루션을 검토 한 후 메뉴가 손실되는 섹션으로 이동합니다.

덕분에 : http://ck.kennt-wayne.de/2012/dec/twitter-bootstrap-how-to-fix-tabs

$(document).ready(function()
 {  
//Redirecciona al tab, usando un prefijo al cargar por primera vez, al usar redirect en cake #_Pagos    
//Redirecciona al tab, usando #Pagos
/* Automagically jump on good tab based on anchor; for page reloads or links */
 if(location.hash) 
  {
     $('a[href=' + location.hash + ']').tab('show');         
  }


//Para evitar el bajar al nivel del tab, (al mostrarse el tab subimos)
$('a[data-toggle="tab"]').on('shown.bs.tab', function(e) 
{
    location.hash = $(e.target).attr('href').substr(1);
    scrollTo(0,0);      
});



//Actualiza el URL con el anchor o ancla del tab al darle clic
 /* Update hash based on tab, basically restores browser default behavior to
 fix bootstrap tabs */
$(document.body).on("click", "a[data-toggle]", function(event) 
  {
    location.hash = this.getAttribute("href");
  });


//Redirecciona al tab, al usar los botones de regresar y avanzar del navegador.
/* on history back activate the tab of the location hash if exists or the default tab if no hash exists */   
$(window).on('popstate', function() 
{
  //Si se accesa al menu, se regresa al tab del perfil (activo default), fixed conflict with menu
  //var anchor = location.hash || $("a[data-toggle=tab]").first().attr("href");
  var anchor = location.hash;
  $('a[href=' + anchor + ']').tab('show');

});   

});//Fin OnReady

2

해시 변경에 반응하는 간단한 방법도 있습니다 (예 : 뒤로 버튼). tomaszbak 솔루션에 hashchange 이벤트 리스너를 추가하기 만하면됩니다.

$(function(){
  // Change tab on load
  var hash = window.location.hash;
  hash && $('ul.nav a[href="' + hash + '"]').tab('show');

  $('.nav-tabs a').click(function (e) {
    $(this).tab('show');
    var scrollmem = $('body').scrollTop();
    window.location.hash = this.hash;
    $('html,body').scrollTop(scrollmem);
  });

  // Change tab on hashchange
  window.addEventListener('hashchange', function() {
    var changedHash = window.location.hash;
    changedHash && $('ul.nav a[href="' + changedHash + '"]').tab('show');
  }, false);
});

1

나는 Bootstrap 3.3. *을 사용하고 있으며 위의 솔루션 중 어느 것도 도움이되지 않았으며 답변 1로 표시되었습니다. 나는 방금 아래 스크립트를 추가하고 일했습니다.

$(function(){
    var hash = document.location.hash;
    if (hash) {
       $('.navbar-nav a[href="' + hash + '"]').tab('show');
    }
    $('a[data-toggle="tab"]').on('click', function (e) {
       history.pushState(null, null, $(this).attr('href'));
    });
});

도움이 되었기를 바랍니다.


0

여기에data-toggle="tab" 설명 된 구문을 사용한다고 가정하면 가장 간단 합니다 .

$(document).on('shown.bs.tab', function(event) {
  window.location.hash = $(event.target).attr('href');
});

이렇게하면 URL이 변경되지만 링크를 클릭하여 특정 탭을 열 때 이동할 수 없습니다.
Khrys 2014-06-18

0

Ruby on Rails 또는 다른 서버 측 스크립트를 사용하는 경우 anchor경로에 옵션 을 사용하는 것이 좋습니다. 페이지가로드되면 URL 해시를 사용할 수 없기 때문입니다. 링크 또는 양식 제출을 통해 올바른 탭을 제공 할 수 있습니다.

<%= form_for @foo, url: foo_path(@foo, anchor: dom_id(foo)) do |f| %>
# Or
<%= link_to 'Foo', foo_path(@foo, anchor: dom_id(foo)) %>

창이 ID로 점프하는 것을 방지하기 위해 접두사를 사용하는 경우 :

<%= form_for @foo, url: foo_path(@foo, anchor: "bar_#{dom_id(foo)}") do |f| %>

그렇다면 CoffeeScript :

  hash = document.location.hash
  prefix = 'bar_'
  $('.nav-tabs a[href=' + hash.replace(prefix, '') + ']').tab 'show' if hash
  $('.nav-tabs a').on 'shown.bs.tab', (e) ->
    window.location.hash = e.target.hash.replace '#', '#' + prefix

또는 JavaScript :

var hash, prefix;

hash = document.location.hash;
prefix = 'bar_';

if (hash) {
  $('.nav-tabs a[href=' + hash.replace(prefix, '') + ']').tab('show');
}

$('.nav-tabs a').on('shown.bs.tab', function(e) {
  window.location.hash = e.target.hash.replace('#', '#' + prefix);
});

이것은 Bootstrap 3에서 작동합니다.


0

@tomaszbak 덕분에원래 솔루션에 대한 편집이 거부되고 그의 게시물에 댓글을 달 수 없기 때문에 약간 개선되고 더 읽기 쉬운 버전을 여기에 남겨 둘 것입니다.

기본적으로 동일한 작업을 수행하지만 브라우저 간 호환성 문제를 해결하면 그와 함께했습니다.

$(document).ready(function(){
   // go to hash on window load
   var hash = window.location.hash;
   if (hash) {
       $('ul.nav a[href="' + hash + '"]').tab('show');
   }
   // change hash on click
   $('.nav-tabs a').click(function (e) {
       $(this).tab('show');
       if($('html').scrollTop()){
           var scrollmem = $('html').scrollTop(); // get scrollbar position (firefox)
       }else{
           var scrollmem = $('body').scrollTop(); // get scrollbar position (chrome)
       }
       window.location.hash = this.hash;
       $('html,body').scrollTop(scrollmem); // set scrollbar position
   });
});

Rejected는 나를 위해 작동하지 않았습니다 (아마도 Firefox 버전 일 수도 있음). 어쨌든 var scrollmem = $ ( 'body'). scrollTop () || $ ( 'html'). scrollTop (); 감사!
tomaszbak

1
예. 내가 브라우저의 일이라는 것을 깨달았다 고 말하자마자 크롬에 빠르게 들어가서 확인하십시오. 편집 리뷰에 댓글을 달 수있는 방법이 있었으면 좋겠습니다.
Fuxy

0

다음은 history.pushState브라우저 기록을 사용하여 이전 탭으로 돌아갈 수 있도록 하는 옵션입니다.

  $(document).ready(function() {
  // add a hash to the URL when the user clicks on a tab
  $('a[data-toggle="tab"]').on('click', function(e) {
    history.pushState(null, null, $(this).attr('href'));
  });
  // navigate to a tab when the history changes
  window.addEventListener("popstate", function(e) {
    var activeTab = $('[href=' + location.hash + ']');
    if (activeTab.length) {
      activeTab.tab('show');
    } else {
      $('.nav-tabs a:first').tab('show');
    }
  });
});

0

위의 어느 것도 나를 위해 일하지 않았으므로 다음은 내 작업 방법입니다.

  1. class="tab-link"이 기능이 필요한 모든 링크에 추가
  2. 자바 스크립트에 다음 코드를 추가하세요.
    window.addEventListener
    (
        '팝 스테이트',
        함수 (이벤트)
        {
            tab_change ();
        }
    );

    tab_change () 함수
    {
        var hash = window.location.hash;
        해시 && $ ( 'ul.nav a [href = "'+ hash + '"]') .tab ( 'show');

        $ ( '.tab-link'). 클릭
        (
            함수 (e)
            {
                $ (this) .tab ( 'show');

                var scrollmem = $ ( 'body') .scrollTop () || $ ( 'html') .scrollTop ();
                window.location.hash = this.hash;
                $ ( 'html, body') .scrollTop (scrollmem);

                $ ( 'ul.nav-tabs a [href = "'+ window.location.hash + '"]') .tab ( 'show');
            }
        );
    }


0

OP가 JQuery를 사용한다고 말했지만 바닐라 JS를 사용하여 간단하게 수행 할 수 있습니다.

document.querySelectorAll('ul.nav a.nav-link').forEach(link => {
    link.onclick = () => window.history.pushState(null, null, link.attributes.href.value);
});

-2

이것은 또한 jquery 및 부트 스트랩을 사용할 때 실행되지 않는 극도로 모호한 탭 a href를 수정합니다.

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 

<script type="text/javascript">
$('.nav-tabs a').click(function (e) {
    // No e.preventDefault() here.
    $(this).tab('show');
});
</script>

<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.2.1/js/bootstrap.min.js"></script>

5
-1이 답변이 3 개월 전에 주어진 이전 답변에 정확히 동일한 코드를 사용하여 어떻게 값을 추가하는지 알 수 없습니다. 따라서 내 겸손한 의견으로는 유용한 답변이 아닙니다.
Nope
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.