2012-04-03 4 views
1

핵심 질문콘텐츠 전달에 대한 아이디어. 도움이 필요

내 목표를 달성하기위한 개념이 필요합니다. 제가 선택한 방법으로 DOM을 올바르게 탐색 할 수있는 방법에 대한 아이디어가 떠오르고 있습니다.


목표

당신은 내가 처음 일을하고 무엇을 알고 있어야합니다 :

내가 내 템플릿의 <section> 요소에 HTML 콘텐츠를 호출하는 아약스를 사용합니다. 그런 다음 해당 HTML 컨텐트에서 class="pageNav" 태그가있는 요소를 호출하여 하위 네비게이션을 보유하고이를 기본 템플릿에있는 id="subNav"에 복사합니다.

function subNavContent () { 
    var navContent = document.getElementsByClassName('pageNav')[0]; 
    document.getElementById('subNav').innerHTML = navContent.innerHTML; 
} 

지금은 내가 적절한 배열 값을 할당해야한다이 일을 함께 가지고있는 문제는이를 달성하기 위해 :

새로운 내용이 함께되고 onStateChange 이벤트에서 호출 될 때 나는 이렇게
// i is the current content pages sub navigation 
navContent = document.getElementsByClassName('pageNav')[i] 

사용자가 페이지 콘텐츠를 호출 할 때만 class="pageNav"이 DOM에로드되며 이는 navContent[i] 위치를 지정합니다. 그래서 이것은 나의 딜레마입니다.

예 : 홈 페이지가로드되었습니다. contentNav[0] 위치. 연락처는 다음 사용자가로드합니다 class="pageNav"에 대한 contentNav[1] 위치가됩니다.


실제 질문은 있습니까?

내 예제와 같이 DOM에로드 될 때 페이지의 배열 값을 전달할 수있는 방법이 있습니까? 이 다음 페이지에 출마 될 때 복사 navContent[0]class="pageNav"의 배열 값을 다시 설정 한 후

나는 어쩌면 DOM에서 class="pageNav" 내용을 삭제 수 있을까요? 내 생각 와


또한 노력 나는이 생각을하지만 성공을 놀겠되고있다.

subNavContent (); 
    subNavClear (); 

나는이 생각했던 :

function subNavClear () { 
    var wrap = document.getElementById('contentBody'); 
    var nav = document.getElementsByClassName('pageNav')[0]; 
    wrap.removeChild(nav); 
} 

그래서 결과 기능이 순서대로 초기화 될 것이다 : 그것은과 같이 옮겨진 후 내가 생각하는 것은 DOM에서 해당 콘텐츠를 class="pageNav"을 삭제했다 배열 값이 contentNav[0] 인 것에 대해 걱정하지 않아도됩니다. DOM을 생성하고 복사 한 다음 DOM에서 삭제하기 때문에 다음로드 할 때 contentNav[0]이 할당 될 것이라고 생각합니다.

원하는 경우보세요 : The Mind Company.이 코드는 설명했다 않는 요청


Snipplets.

HTML :

<body> 
<!-- Header Areas: (Constent visual)--> 
<header> 
    <div id="headTopRow"> 
     <div id="headerElement"> 

      <nav id="subNav" class="aniSubNavOpen drop-shadow lifted"> 
      </nav> 

     </div> 
    </div> 

</header> 

<!-- Content Areas: (Variable visual)--> 
<div id="contentBody"> 
    <br> 
    <section class="aniDown" id="homePage"> 
     <script>checkPage ('homePage', 'home.html', 'main');</script> 
    </section> 
    <section class="aniDown" id="aboutPage"></section> 
    <section class="aniDown" id="lessonsPage"></section> 
    <section class="aniDown" id="productPage"></section> 
    <section class="aniDown" id="contactPage"></section> 
</div> 

<!-- Footer Area: (Constant visual)--> 
<footer> 
</footer> 
</body> 

전환 기능 :

function subNavContent () { 
    var navContent = document.getElementsByClassName('pageNav')[0]; 
    document.getElementById('subNav').innerHTML = navContent.innerHTML; 
} 

    function sectionAssure(classID, url) {   
      var tmp = ''; 
      var sel = document.getElementsByTagName('section'); 

      for (var i=0; i<sel.length; i++){ 
       if (sel[i].id == classID) { 
        tmp = 'block'; 
       } 
       else { 
        tmp = 'none'; 
       } 
       sel[i].style.display = tmp; 
      } 
    } 

    function loadContent (classID, url, type) { 
     var xmlhttp; 

     if (window.XMLHttpRequest) { 
      xmlhttp = new XMLHttpRequest(); 

      xmlhttp.onreadystatechange = function() { 
       if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { 
        document.getElementById(classID).innerHTML=xmlhttp.responseText; 
        subNavContent (); 
       } 
      }; 

     xmlhttp.open("GET", url, true);    
     xmlhttp.send(); 
     } 
     return; 
    } 

    function checkPage (classID, url) { 
     sectionAssure (classID, url);  
     loadContent (classID, url); 
    } 

솔루션!

@Dennis에게 감사드립니다. 다른 방법을 사용했지만 원칙은 동일합니다.

function subNavContent (classID) { 
    var sec = document.getElementById(classID); 
    document.getElementById('subNav').innerHTML = sec.getElementsByClassName('pageNav')[0].innerHTML; 
} 
+2

당신이 어떤 노력 –

+0

@Juan 멘데스에 넣어 볼 수 있지만, 당신이 요구하는지 말해 하드 알아. 미안, 어쩌면 내가 너와 다른 사람들을 위해 분명히 할 수있는 어딘가가 있을까? 이미 너무 오랜 시간이 걸려서 더 오래 사용할 수 없었습니다. –

+1

당신은 pjax를보아야합니다 : http://pjax.heroku.com/ –

답변

1

수동으로 display:blockdisplay:none을 설정하는 대신 클래스를 사용할 수 있습니다. .active되어있는 구간을 선택하고 거기에서 pageNav 선택

var navContent = document.getElementsByClassName('active')[0].getElementsByClassName('pageNav')[0] 

CSS를

#contentBody > section { display:none; } 
#contentBody > section.active { display: block; } 
+0

HTML 구조로 자바 스크립트 예제에서 여전히 '.active'에 적절한 배열 값을 호출해야하지 않습니까? 나는 내 구조 때문에 활성 블록이 DOM에 동일하게로드 될 것이라고 생각한다 (즉, 사용자 순서 선택). 이것이 나에게 아이디어를주지는 않지만. –

+0

그 아이디어를 가져 주셔서 감사합니다. 비록 제가 다른 경로를 택했으나 본질적인 개념은 같았습니다. 대신 'document.getElementById ('subNav '). innerHTML = document.getElementById (classID) .getElementsByClassName ('pageNav ') [0] .innerHTML; –

+0

보이는 섹션은 클래스 '활성'을 가진 유일한 섹션이므로 요소 배열에서 선택할 필요가 없습니다. – Dennis

1

페이지 상태를 처리하고 표시되어야하는 콘텐츠를 감지하는 좋은 방법은 html5 기록 API입니다. 또한 URL이 내용 변경시 업데이트된다는 이점이 있습니다 ("마음 회사"에서 누락 된 내용). 모질라 페이지 나 구글을 참고하십시오. https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history

+0

다른 페이지 요소가 이전 상태로 되돌아가는 문제는 아니겠습니까? –

+0

아니, 그게 좋은 부분이야. 페이지 내용이 다시로드되지 않습니다. –

+0

replaceState()를 지원할 수있는 함수가 있습니다. 오, 더 많은 독서! 이상한 웹. 고맙다. 나는 이걸 좀 더 보게 될 것이다. –