核心问题
我需要帮助提出一个概念来实现我的目标。我无法想出如何使用我选择的方法正确导航 DOM 的想法。
目标
你应该先知道我在做什么:
我使用 ajax 将 HTML 内容调用到<section>
模板的元素中。然后我从这些 HTML 内容中调用一个class="pageNav"
标记元素,该元素包含它的子导航并将其复制到id="subNav"
位于主模板中的一个。当从 onStateChange 事件调用新内容时,我会这样做:
function subNavContent ( ) {
var navContent = document.getElementsByClassName('pageNav')[0];
document.getElementById('subNav').innerHTML = navContent.innerHTML;
}
现在我这样做的问题是我必须分配正确的数组值来实现这一点:
// i is the current content pages sub navigation
navContent = document.getElementsByClassName('pageNav')[i]
更清楚地说,class="pageNav"
仅当用户调用页面内容时才将其加载到 DOM 中,这就是指定navContent[i]
位置的内容。所以这是我的困境。
示例:主页是加载contentNav[0]
位置。联系人接下来由用户加载,这将contentNav[1]
是class="pageNav"
.
真正的问题?
是否有某种方法可以在页面加载到 DOM 时传递页面的数组值,就像在我的示例中一样?
我可以class="pageNav"
在复制后从 DOM 中删除内容以将数组值重置class="pageNav"
为navContent[0]
在为下一页运行时吗?
我的想法的进一步努力
我一直在玩弄这个想法,但没有成功。我的想法是在class="pageNav"
传输后从 DOM 中删除该内容,如下所示:
function subNavClear ( ) {
var wrap = document.getElementById('contentBody');
var nav = document.getElementsByClassName('pageNav')[0];
wrap.removeChild(nav);
}
因此生成的函数将按以下顺序启动:
subNavContent ( );
subNavClear ( );
我认为这将使我不必担心contentNav[0]
. 我会认为,因为我在创建和复制它之后从 DOM 中删除了它,所以下一个要加载的将被分配contentNav[0]
。
如果您喜欢,请看一看:The Mind Company。
每个请求的片段 此代码按说明执行。
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;
}