单页Webapp中的Javascript执行问题
我一直在尝试设计一个单页webapp(一个游戏),将不同的HTML文档动态加载到单个网页中 我使用纯Javascript(没有库),并使用XMLhttprequest下载HTML文件并在单个网页上动态显示它们。除了Javascript之外,这一切都非常有效 因为我的Javascript无法知道在任何时候加载了哪个动态文档,所以我的所有脚本都在尝试运行,并且在脚本尝试访问页面上不存在的元素时,会导致大量错误 我需要能够动态下载和运行Javascript文件,或者我需要能够检测我正在显示的HTML文档,并且只激活相关的Javascript代码 有人知道我的问题的解决方案吗,或者有更好的想法吗 谢谢单页Webapp中的Javascript执行问题,web,web-applications,single-page-application,Web,Web Applications,Single Page Application,我一直在尝试设计一个单页webapp(一个游戏),将不同的HTML文档动态加载到单个网页中 我使用纯Javascript(没有库),并使用XMLhttprequest下载HTML文件并在单个网页上动态显示它们。除了Javascript之外,这一切都非常有效 因为我的Javascript无法知道在任何时候加载了哪个动态文档,所以我的所有脚本都在尝试运行,并且在脚本尝试访问页面上不存在的元素时,会导致大量错误 我需要能够动态下载和运行Javascript文件,或者我需要能够检测我正在显示的HTML文
Barry我能理解你的问题,你想根据特定场景动态加载所有内容, 首先在呈现HTML时,我建议您使用MVC和observer模式, 其次,要动态加载脚本,您需要 场景1: 加载(['script1','script2']) 场景2: 加载(['script2','script3'])) 场景3: 加载(['script1'])
这就是你想要的吗?我已经设法自己编写了解决方案,谢谢 解决方案说明。
let website_data;
(function() {
let request = new XMLHttpRequest();
request.open("GET", "/json/mysites.json");
request.onreadystatechange = function() {
if(request.readyState === 4 && request.status === 200)
{
website_data = JSON.parse(this.responseText);
load_webpage(0);
}
}
request.send();
})()
function load_webpage(x)
{
let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById("app").innerHTML = xhttp.responseText;
load_javascript(x);
}
};
xhttp.open("GET", website_data[x].html_address);
location.hash = website_data[x].hash;
xhttp.send();
}
function load_javascript(x)
{
let element;
// gets a list of all
let scripts = document.getElementsByTagName("script");
let t = scripts.length;
while (t--)
{
if(scripts[t].hasAttribute('data-jsloader') && scripts[t].getAttribute('data-jsloader') != x)
{
console.log(scripts[t].getAttribute('data-jsloader'));
scripts[t].parentNode.removeChild(scripts[t]);
}
}
console.log(document.getElementsByTagName("script"));
// load javascript files
for(let i = 0; i < website_data[x].js_script.length; i++)
{
// console.log("Adding Javacscript File: " + website_data[x].js_script[i]);
element = document.createElement('script');
element.setAttribute("data-jsloader", x.toString());
element.setAttribute("type", "text/javascript");
element.setAttribute("src", website_data[x].js_script[i]);
document.getElementsByTagName("head")[0].appendChild(element);
}
}
Index.html(加载网页内容的位置)
主销
为什么人们会记下提问的人?真烦人。我只是想得到一些帮助,我只是想最好地解释一下情况。我感谢你的建议,不过我自己已经设法解决了如何做到这一点。我已经用我的代码更新了stackoverflow页面。
[
{
"page_number":0,
"html_address":"/views/splashpage.html",
"hash": "splashpage.html",
"js_script":["/js/background.js","/js/splashpage.js"]
},
{
"page_number":1,
"html_address":"/views/menu.html",
"hash": "menu.html",
"js_script":["/js/menu.js"]
},
{
"page_number":2,
"html_address":"/views/lobby.html",
"hash": "lobby.html",
"js_script":["/js/lobby.js"]
},
{
"page_number":3,
"html_address":"/views/kingpin.html",
"hash": "game.html",
"js_script":["/js/cards.js",
"/js/chat.js",
"/js/chips.js",
"/js/ws_client.js",
"/js/betting_controls.js",
"/js/kingpin.js",
"/js/footer.js",
"/js/ads_and_purchases.js"]
}
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kingpin</title>
<!-- index css -->
<link rel="stylesheet" href="css/index.css">
</head>
<body>
<div id="app"></div>
</body>
</html>