javascript - JavaScript 页面状态
问题描述
我正在尝试将页面状态放在一起,但无法返回原始主页状态。在我单击链接 1 后,它会转到该页面,但是一旦我单击“返回”,什么都没有发生,并且控制台显示 id 名称“返回”为空。我猜是因为 id 在第一页状态中不存在?
这是我的代码:
const PageState = function() {
let currentState = new homeState(this);
this.init = function() {
this.change(new homeState);
}
this.change = function(state) {
currentState = state;
}
};
// HOME
const homeState = function(page) {
document.querySelector('#output-heading').textContent = null;
document.querySelector('#output-content').innerHTML = `
<div id="link-1">Link 01</div>
<div id="link-2">Link 02</div>
<div id="link-3">Link 03</div>
`;
};
// LINK 02
const secondState = function(page) {
document.querySelector('#output-heading').textContent = 'Page 02';
document.querySelector('#output-content').innerHTML = `
<p>This is the second page.</p>
<div id="back">GO BACK</div>
`;
};
// LINK 03
const thirdState = function(page) {
document.querySelector('#output-heading').textContent = 'Page 03';
document.querySelector('#output-content').innerHTML = `
<p>This is the third page.</p>
<div id="back">GO BACK</div>
`;
};
// INIT PAGESTATE
const page = new PageState();
// INIT FIRST STATE
page.init();
// UI VARS
const one = document.getElementById('link-1'),
two = document.getElementById('link-2'),
three = document.getElementById('link-3');
back = document.getElementById('back');
one.addEventListener('click', (e) => {
page.change(new firstState);
e.preventDefault();
});
two.addEventListener('click', (e) => {
page.change(new secondState);
e.preventDefault();
});
three.addEventListener('click', (e) => {
page.change(new thirdState);
e.preventDefault();
});
back.addEventListener('click', (e) => {
page.change(new homeState);
e.preventDefault();
});
<div class="container-output">
<h4 id="output-heading"></h4>
<div id="output-content"></div>
</div>
解决方案
在我单击链接 1 后,它会转到该页面,但是一旦我单击“返回”,什么都没有发生,并且控制台显示 id 名称“返回”为空。我猜是因为 id 在第一页状态中不存在?
是的,这就是问题所在。
您可以改为执行以下操作:
const homeState = function() {
document.querySelector("#output-heading").textContent = null;
document.querySelector("#output-content").innerHTML = `
<div id="link-1">Link 01</div>
<div id="link-2">Link 02</div>
<div id="link-3">Link 03</div>
`;
const one = document.getElementById("link-1");
const two = document.getElementById("link-2");
const three = document.getElementById("link-3");
one.addEventListener("click", (e) => {
generatePageState("Page 01", "This is the first page.");
});
two.addEventListener("click", (e) => {
generatePageState("Page 02", "This is the second page.");
});
three.addEventListener("click", (e) => {
generatePageState("Page 03", "This is the third page.");
});
};
const generatePageState = function(heading, text) {
document.querySelector("#output-heading").textContent = heading;
document.querySelector("#output-content").innerHTML = `
<p>${text}.</p>
<div id="back">GO BACK</div>
`;
const back = document.getElementById("back");
back.addEventListener("click", (e) => {
homeState();
});
};
homeState();
<div class="container-output">
<h4 id="output-heading"></h4>
<div id="output-content"></div>
</div>
导航到页面后#output-content
是动态设置的。链接被段落和按钮替换,所以现在按钮在布局中,我们可以向它添加事件侦听器。
推荐阅读
- java - 如何进行循环延迟?(JavaFX)
- html - 如何使一个 div 垂直滚动,而另一个不具有两个 inline-block div?
- html - 如何通过 HTML 代码在 MVC 中绑定我的模型?
- entity-framework - Entity Framework 2.1 映射的问题
- d3.js - d3-fetch 和 UTF-16 LE
- windows - 如何在 Windows 10 上重置密码列表
- java - 集合、单例、垃圾回收
- c# - Xamarin Forms 中的异步 Web 服务请求使用使用回调的公司库
- arrays - 如果你有一个对象的对象,哪个类是可比较的?
- javascript - 在同一个类中调用 EventEmitter 两次?