2012-07-05 3 views
4

따라서 사이트 STVPlus에서는 부트 스트랩과 탭 스크립트를 사용하여 다양한 TV 프로그램의 에피소드 및 기사 목록을 표시합니다. 페이지가로드되면 (일반적으로) 제대로 작동하고 탭을 선택하면 해당 div가 표시되는 문제가 있습니다. 그러나 이미 활성화 된 div를 선택하면 페이지가 아래로 이동합니다. 또한 episodes hash tag link과 같은 해시 태그로 페이지를로드하면 페이지가 완전히로드 될 때 자동으로 아래로 이동합니다. 나는 크롬 개발자 도구를 사용하여 JS 코드를 단계별로 시험해 보았지만 아무 것도 발견 할 수 없었다.탭을 한 번 클릭하면 페이지가 아래로 이동합니다.

도움을 주시면 감사하겠습니다.

샘플 코드 :

$(function() 
{ 
    $('.sidebar').jScrollPane(); 

    // Bind an event to window.onhashchange that, when the hash changes, gets the 
    // hash and adds the class "selected" to any matching nav link. 
    $(window).hashchange(function(){ 
    var hash = location.hash; 


    if (hash == '#episodes'){ 
     //e.preventDefault(); 
     $('.nav-pills a:last').tab('show'); 
    }else{ 
     //e.preventDefault(); 
     $('.nav-pills a:first').tab('show'); 
    } 

    }) 

    // Since the event is only triggered when the hash changes, we need to trigger 
    // the event now, to handle the hash the page may have loaded with. 
    $(window).hashchange(); 
    return false; 
}); 

에피소드는 사업부 컨테이너는 너무

<div class="tab-pane" id="episodes"> ..... </div> 

처럼 당신이 클릭 탭으로, 나는 최신 jQuery를 사용하므로

<ul class="nav nav-pills pull-right" data-tabs="tabs"> 
    <li class="active"><a href="<?php echo current_url(); ?>#articles">Latest Articles</a></li> 
    <li><a href="<?php echo current_url(); ?>#episodes">Upcoming Episodes</a></li> 
    </ul> 

같다 http://benalman.com/projects/jquery-hashchange-plugin/

+0

사용하는 코드의 최소 버전을 게시해야한다. 해시 태그에 바인딩하는 대신 적절한 초기화를 사용하지 않는 이유는 무엇입니까? 그렇게하면 클릭 수를 가로 챌 수 있습니다. 페이지 점프는 HTML의 기능으로, 직접성 (해시로 된 ID)을 선택하거나 자신의 해시 태그 <-> 탭 매처를 넣을 수 있습니다. – Sherbrow

+0

감사합니다. 샘플 코드를 추가했습니다. 그것의 특징이라면, jquery는 그 권리를 막을 수있을 것입니다. 나는 아직 행운을 피하기 위해 장소에서 preventdefault를 시도했다. 어떻게 페이지 이동을 막을 수 있습니까? – viperfx

+0

나는 그것을 막을 수 있다고 생각지 않습니다.내가 아는 한 브라우저 일 뿐이며 JS는 너무 낮을 수도 있습니다. 탭 알약이 아닌 '해시 체인지'를 듣고 싶니? – Sherbrow

답변

3

이것은 내 문제에 관한 나의 접근 방법입니다 :

어떤 경우에는 document.location.hash 폴백 (제외 부분 제외)을 제외하고 hashchange 플러그인이 필요한지 잘 모르겠습니다.

다음 코드는 수동으로 활성화 된 클래식 부트 스트랩 탭과 해시와 일치하는 탭을 표시하는 onready 코드 비트를 사용합니다.

var hasHash = false; 
var hash = document.location.hash; 
if(hash) { 
    hasHash = true; 
    var $toggleTab = $('a[href='+hash+']'); 
    if($toggleTab.length) $toggleTab.tab('show'); 
} 

탭 활성화 다음 HTML을 기반으로

$('.nav > li > a').click(function(event) { 
    event.stopPropagation(); 
    var $this = $(this); 
    $this.tab('show'); 
    if(hasHash) document.location.hash = $this.attr('href'); 
}); 

:

<ul class="nav nav-pills" data-tabs="tabs"> 
    <li class="active"><a href="#articles" data-target="#articles-tab">Latest Articles</a></li> 
    <li><a href="#episodes" data-target="#episodes-tab">Upcoming Episodes</a></li> 
</ul> 
<div class="tab-content"> 
    <div class="tab-pane" id="episodes-tab">episodes</div> 
    <div class="tab-pane active" id="articles-tab">articles</div> 
</div> 

Demo (jsfiddle)Hash demo (jsfiddle)

+1

안녕하세요, 코드 주셔서 감사합니다. 나는 그것을 시도하고 여전히 이전보다 훨씬 더 아래로 점프 : – viperfx

+0

@ viperfx 당신도 html을 (ID)를 변경하고 작동하지 않는 페이지가 있습니까? – Sherbrow

+0

아, 네가 맞아, 나는 그 변화를 알지 못했다. 고맙습니다. 지금은 잘 작동 중입니다! 이 줄에 문제가 생기면'var $ toggleTab = $ ('a [href ='+ hash + ']'); '해시 태그 앞에 현재 URL을 추가하여 같은 페이지에 있는지 확인합니다. 유일한 문제는 해시 태그가있을 때 페이지로드시 태그를 전환하는 것입니다. – viperfx

4

이 @Sherbrow의 대답은 나를 위해 작동하지 않았다. 그러나 다음 코드는 :

$('.nav-tabs li a').click(function(e) { 
    history.pushState(null, null, $(this).attr('href')); 
}); 

부트 스트랩 3.2.0에서 테스트되었습니다.

이 코드는 Twitter Bootstrap: How To Prevent Jump When Tabs Are Clicked에서 가져 왔습니다.

+0

매우 효과 .. 나를 위해 일해라 .. !! – sajalsuraj

0

이 문제를 해결하는 다른 방법은 탭로드 후 'scrollTop'을 호출하는 것입니다. 나는 이렇게한다 :

$("ul.nav-tabs > li > a").on("shown.bs.tab", function (e) { 
    var id = $(e.target).attr("href").substr(1); 
    window.location.hash = id; 
    setTimeout(function() { $("body").scrollTop(0); }, 50); 
}); 
관련 문제