当用户单击链接而不是加载整个新页面时,我通过 ajax 请求加载新页面的 HTML 数据(并且还使用查询字符串让服务器每次都不发送导航栏数据)然后,我将来自 ajax 请求的结果数据放入 DOMParser,以允许我从 id 为“content”的 div 中获取内容,并替换当前文档的“context”div 的innerHTML。
通过此方法发出请求后,尽管 newDOM 中的任何脚本标记在放入内容 div 后都不会运行。另外,它似乎也在 newDOM 中运行,因为如果您有一个脚本可以在加载时立即编辑文档,那么当您注销 newDOM 时就没有任何效果
AjaxRequest(href, function(data) {
var parser = new DOMParser();
var newDOM = parser.parseFromString(data.responseText, "text/html");
//Setup new title
var title = '';
if (newDOM.getElementsByTagName('title').length > 0 && newDOM.getElementsByTagName('title')[0] !== null) {
title = newDOM.getElementsByTagName('title')[0].innerHTML;
} else {
title = rawhref;
}
document.title = title;
history.pushState({}, title, rawhref);
if (newDOM.getElementById('content') === null) {
//If there is an error message insert whole body into the content div to get full error message
document.getElementById('content').appendChild(newDOM.getElementsByTagName('body')[0]);
} else {
document.getElementById('content').appendChild(newDOM.getElementById('content'));
}
MapDOM();
if (typeof(onPageLoad) == "function") {
onPageLoad();
}
});
注意:变量“rawhref”只是不带 ?noheader 的请求 URL,以便用户更容易返回历史记录。 注意:此外,在任何新加载之后,我还有一个函数可以覆盖任何新的 a 标记,以便它可以通过此方法在下一个新页面中工作。
此外,如果答案不使用 jQuery,那将是更好的选择。
最佳答案
有人刚刚回答了这个问题,当我测试它时,他们删除了他们的解决方案......嗯,非常感谢你是谁,对于将来遇到此问题的任何人,这里是他们展示的代码,但是我没有时间完全理解它为什么有效......但我认为可以解决它。
function subLoader(dest, text) {
var p = new DOMParser();
var doc = p.parseFromString(text, 'text/html');
var f = document.createDocumentFragment();
while (doc.body.firstChild) {
f.appendChild(doc.body.firstChild);
}
[].map.call(f.querySelectorAll('script'), function(script) {
var scriptParent = script.parentElement || f;
var newScript = document.createElement('script');
if (script.src) {
newScript.src = script.src;
} else {
newScript.textContent = script.textContent;
}
scriptParent.replaceChild(newScript, script);
});
dest.appendChild(f);
}
关于Javascript - DOM 解析器加载 ajax 请求,脚本无法运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41582850/