[javascript] 트위터 부트 스트랩 탭 : 페이지 새로 고침 또는 하이퍼 링크의 특정 탭으로 이동

Twitter의 Bootstrap Framework 및 해당 Bootstrap Tabs JS를 사용하는 웹 페이지를 개발 중 입니다. 몇 가지 사소한 문제를 제외하고는 효과적입니다. 그 중 하나는 외부 링크에서 특정 탭으로 직접 이동하는 방법을 모릅니다. 예를 들면 다음과 같습니다.

<a href="facility.php#home">Home</a>
<a href="facility.php#notes">Notes</a>

외부 페이지에서 링크를 클릭하면 홈 탭과 메모 탭으로 각각 이동해야 합니다.



답변

여기에 문제에 대한 해결책이 있습니다. 그러나 그것은 다른 사람들을 도울 수 있습니다.

// Javascript to enable link to tab
var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#' + url.split('#')[1] + '"]').tab('show');
}

// Change hash for page-reload
$('.nav-tabs a').on('shown.bs.tab', function (e) {
    window.location.hash = e.target.hash;
})


답변

최신 정보

부트 스트랩 3의 변경 .on('shown', ...).on('shown.bs.tab', ....)


이것은 @dubbe 답변과 SO 수락 답변을 기반으로합니다 . window.scrollTo(0,0)제대로 작동하지 않는 문제를 처리 합니다. 문제는 표시된 탭에서 URL 해시를 교체하면 브라우저가 페이지의 요소이기 때문에 해당 해시로 스크롤한다는 것입니다. 이 문제를 해결하려면 해시가 실제 페이지 요소를 참조하지 않도록 접두사를 추가하십시오.

// Javascript to enable link to tab
var hash = document.location.hash;
var prefix = "tab_";
if (hash) {
    $('.nav-tabs a[href="'+hash.replace(prefix,"")+'"]').tab('show');
}

// Change hash for page-reload
$('.nav-tabs a').on('shown', function (e) {
    window.location.hash = e.target.hash.replace("#", "#" + prefix);
});

사용 예

id = “mytab”인 탭 패널이있는 경우 다음과 같이 링크를 추가해야합니다.

<a href="yoursite.com/#tab_mytab">Go to Specific Tab </a>


답변

click해당 탭 링크 에서 이벤트를 트리거 할 수 있습니다 .

$(document).ready(function(){

  if(window.location.hash != "") {
      $('a[href="' + window.location.hash + '"]').click()
  }

});


답변

이것은 스크롤링을 방지하는 dubbe 솔루션의 개선 된 구현입니다.

// Javascript to enable link to tab
var url = document.location.toString();
if (url.match('#')) {
    $('.nav-tabs a[href="#'+url.split('#')[1]+'"]').tab('show') ;
}

// With HTML5 history API, we can easily prevent scrolling!
$('.nav-tabs a').on('shown.bs.tab', function (e) {
    if(history.pushState) {
        history.pushState(null, null, e.target.hash);
    } else {
        window.location.hash = e.target.hash; //Polyfill for old browsers
    }
})


답변

제공된 JavaScript 솔루션이 작동 할 수 있지만 추가 JavaScript는 필요하지 않지만 약간의 관점에서는 논리가 필요합니다. 다음과 같은 표준 URL 매개 변수를 사용하여 링크를 작성하십시오.

<a href = "http://link.to.yourpage?activeTab=home">My Link</a>

그런 다음 activeTab의 값을 감지하여 적절한 ‘class = “active”‘를 작성하십시오. <li>

의사 코드 (귀하의 언어로 구현). 참고이 예에서 매개 변수가 제공되지 않은 경우 ‘홈’탭을 기본 활성으로 설정했습니다.

$activetabhome = (params.activeTab is null or params.activeTab == 'home') ? 'class="active"' : '';
$activetabprofile = (params.activeTab == 'profile') ? 'class="active"' : '';

<li $activetabhome><a href="#home">Home</a></li>
<li $activetabprofile><a href="#profile">Profile</a></li>


답변

나는 if … else의 큰 팬이 아니다. 더 간단한 접근 방식을 취했습니다.

$(document).ready(function(event) {
    $('ul.nav.nav-tabs a:first').tab('show'); // Select first tab
    $('ul.nav.nav-tabs a[href="'+ window.location.hash+ '"]').tab('show'); // Select tab by name if provided in location hash
    $('ul.nav.nav-tabs a[data-toggle="tab"]').on('shown', function (event) {    // Update the location hash to current tab
        window.location.hash= event.target.hash;
    })
});
  1. 기본 탭을 선택하십시오 (일반적으로 첫 번째 탭).
  2. 탭으로 전환하십시오 (이러한 요소가있는 경우 jQuery가 처리하도록하십시오). 잘못된 해시가 지정되면 아무 일도 일어나지 않습니다
  3. [선택 사항] 다른 탭을 수동으로 선택한 경우 해시 업데이트

요청 된 해시로 스크롤을 처리하지 않습니다. 하지만 그래야 합니까?


답변

부트 스트랩 3의 경우 :

$('.nav-tabs a[href="#' + tabID + '"]').tab('show');

https://jsfiddle.net/DTcHh/6638/