pushState 在不应该执行的时候执行
pushState Executing When Not Supposed To
我正在使用 HTML 历史记录 API 来操纵浏览器历史记录堆栈,以在我的网站上使用 JavaScript 控制导航。我设置的更改页面的功能工作正常,但奇怪的是,当我将 pushState
添加到每个单独的页面更改时,pushState
会自动触发,因此函数中的最后一页更改总是最后一个执行。这意味着被推送的状态总是最后的页面更改语句。
JavaScript:
// Change Page Function
function ChangeContent (page) {
var pages={"homepage":{title: "homepage"},"servicespage":{title: "servicespage"},"estimatespage":{title: "estimatespage"}};
HideNav();
//Show home page
for(var homepage in pages) {
if(page!==homepage) {
document.getElementById(homepage).style.display='none';
}
else {
document.getElementById(homepage).style.display='block';
history.pushState("homepage", "Home", "home" );
window.scrollTo(0,0);
}
}
//Show services page
for(var servicespage in pages) {
if(page!==servicespage) {
document.getElementById(servicespage).style.display='none';
}
else {
document.getElementById(servicespage).style.display='block';
history.pushState( "servicespage", "Our Services", "services");
window.scrollTo(0,0);
}
}
//Show estimates page
for(var estimatespage in pages) {
if(page!==estimatespage) {
document.getElementById(estimatespage).style.display='none';
}
else {
document.getElementById(estimatespage).style.display='block';
history.pushState( "estimatespage", "Get An Estimate", "estimates");
window.scrollTo(0,0);
}
}
}
当您 运行 此代码时,不是每个单独的页面都在单击该页面时推送它的状态,推送的状态始终是估计页面状态。我试过使用 else if
语句,并且尝试将每个 for
语句嵌入到自执行函数中,希望它可以解决某种范围问题,但我没有运气。
这是我的 onPopstate
函数:
// History State Change Display
window.onpopstate = function (event) {
var state = event.state;
console.log(state);
// Change History State Display To Home Page
if (state === "homepage") {
document.getElementById("homepage").style.display = 'block';
} else {
document.getElementById("homepage").style.display = 'none';
}
// Change History State Display To Services Page
if (state === "servicespage") {
document.getElementById("servicespage").style.display = 'block';
} else {
document.getElementById("servicespage").style.display = 'none';
}
// Change History State Display To Estimates Page
if (state === "estimatespage") {
document.getElementById("estimatespage").style.display = 'block';
} else {
document.getElementById("estimatespage").style.display = 'none';
}
};
出于某种原因,我点击的每个新页面都有 URL 扩展名 /estimatespage
,然后当我点击后退按钮时,它只是以与写入页面相反的顺序循环浏览页面在页面更改功能中,并正确更新 URL。
我不完全确定这里的问题是什么,但我认为我正在自动推送所有页面的状态,这很奇怪,因为其余代码仅在正确的页面出现时执行已选择。
任何帮助将不胜感激,因为我认为这可能比我想象的更明显。
HTML
<div id="nav">
<div class="headerlist" onclick="ChangeContent('homepage');">Home</div>
<div class="headerlist" onclick="ChangeContent('servicespage');">Services</div>
<div class="headerlist" onclick="ChangeContent('estimatespage');">Estimates</div>
</div>
<div id=homepage></div>
<div id=servicespage></div>
<div id=estimatespage></div>
您在 ChangeContent()
中有三个 for
循环。所有三个循环都在测试完全相同的条件——只是使用了重命名的变量。
保持样式大致相同,您可以试试这个,请注意,这个单个循环将替换 ChangeContent()
:
中的所有三个循环
for ( var p in pages ) {
if ( page !== p ) {
document.getElementById( p ).style.display = 'none';
}
else {
document.getElementById( p ).style.display = 'block';
if ( p === "homepage" )
history.pushState( "homepage", "Home", "home" );
else if ( p === "servicespage" )
history.pushState( "servicespage", "Our Services", "services");
else if ( p === "estimatespage" )
history.pushState( "estimatespage", "Get An Estimate", "estimates");
window.scrollTo( 0, 0 );
}
}
我正在使用 HTML 历史记录 API 来操纵浏览器历史记录堆栈,以在我的网站上使用 JavaScript 控制导航。我设置的更改页面的功能工作正常,但奇怪的是,当我将 pushState
添加到每个单独的页面更改时,pushState
会自动触发,因此函数中的最后一页更改总是最后一个执行。这意味着被推送的状态总是最后的页面更改语句。
JavaScript:
// Change Page Function
function ChangeContent (page) {
var pages={"homepage":{title: "homepage"},"servicespage":{title: "servicespage"},"estimatespage":{title: "estimatespage"}};
HideNav();
//Show home page
for(var homepage in pages) {
if(page!==homepage) {
document.getElementById(homepage).style.display='none';
}
else {
document.getElementById(homepage).style.display='block';
history.pushState("homepage", "Home", "home" );
window.scrollTo(0,0);
}
}
//Show services page
for(var servicespage in pages) {
if(page!==servicespage) {
document.getElementById(servicespage).style.display='none';
}
else {
document.getElementById(servicespage).style.display='block';
history.pushState( "servicespage", "Our Services", "services");
window.scrollTo(0,0);
}
}
//Show estimates page
for(var estimatespage in pages) {
if(page!==estimatespage) {
document.getElementById(estimatespage).style.display='none';
}
else {
document.getElementById(estimatespage).style.display='block';
history.pushState( "estimatespage", "Get An Estimate", "estimates");
window.scrollTo(0,0);
}
}
}
当您 运行 此代码时,不是每个单独的页面都在单击该页面时推送它的状态,推送的状态始终是估计页面状态。我试过使用 else if
语句,并且尝试将每个 for
语句嵌入到自执行函数中,希望它可以解决某种范围问题,但我没有运气。
这是我的 onPopstate
函数:
// History State Change Display
window.onpopstate = function (event) {
var state = event.state;
console.log(state);
// Change History State Display To Home Page
if (state === "homepage") {
document.getElementById("homepage").style.display = 'block';
} else {
document.getElementById("homepage").style.display = 'none';
}
// Change History State Display To Services Page
if (state === "servicespage") {
document.getElementById("servicespage").style.display = 'block';
} else {
document.getElementById("servicespage").style.display = 'none';
}
// Change History State Display To Estimates Page
if (state === "estimatespage") {
document.getElementById("estimatespage").style.display = 'block';
} else {
document.getElementById("estimatespage").style.display = 'none';
}
};
出于某种原因,我点击的每个新页面都有 URL 扩展名 /estimatespage
,然后当我点击后退按钮时,它只是以与写入页面相反的顺序循环浏览页面在页面更改功能中,并正确更新 URL。
我不完全确定这里的问题是什么,但我认为我正在自动推送所有页面的状态,这很奇怪,因为其余代码仅在正确的页面出现时执行已选择。
任何帮助将不胜感激,因为我认为这可能比我想象的更明显。
HTML
<div id="nav">
<div class="headerlist" onclick="ChangeContent('homepage');">Home</div>
<div class="headerlist" onclick="ChangeContent('servicespage');">Services</div>
<div class="headerlist" onclick="ChangeContent('estimatespage');">Estimates</div>
</div>
<div id=homepage></div>
<div id=servicespage></div>
<div id=estimatespage></div>
您在 ChangeContent()
中有三个 for
循环。所有三个循环都在测试完全相同的条件——只是使用了重命名的变量。
保持样式大致相同,您可以试试这个,请注意,这个单个循环将替换 ChangeContent()
:
for ( var p in pages ) {
if ( page !== p ) {
document.getElementById( p ).style.display = 'none';
}
else {
document.getElementById( p ).style.display = 'block';
if ( p === "homepage" )
history.pushState( "homepage", "Home", "home" );
else if ( p === "servicespage" )
history.pushState( "servicespage", "Our Services", "services");
else if ( p === "estimatespage" )
history.pushState( "estimatespage", "Get An Estimate", "estimates");
window.scrollTo( 0, 0 );
}
}