Javascript-DOM解析器加载ajax请求,脚本不运行
当用户点击一个链接而不是加载一个全新的页面时,我通过一个ajax请求加载新页面的HTML数据(还有一个查询字符串,我让服务器每次都不发送导航条数据),然后通过DOMParser输入ajax请求的结果数据,让我只从div中获取id为的内容“content”并替换当前文档的“context”div的innerHTML 通过此方法执行请求后,尽管newDOM中的任何脚本标记在放入content div后都不会运行。此外,它在newDOM中时也会运行,因为如果您有一个脚本在加载文档时立即编辑文档,则注销newDOM时不会产生任何效果Javascript-DOM解析器加载ajax请求,脚本不运行,javascript,html,ajax,Javascript,Html,Ajax,当用户点击一个链接而不是加载一个全新的页面时,我通过一个ajax请求加载新页面的HTML数据(还有一个查询字符串,我让服务器每次都不发送导航条数据),然后通过DOMParser输入ajax请求的结果数据,让我只从div中获取id为的内容“content”并替换当前文档的“context”div的innerHTML 通过此方法执行请求后,尽管newDOM中的任何脚本标记在放入content div后都不会运行。此外,它在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();
}
});
注意:变量“rawref”只是没有?noheader的请求URL,因此用户可以更轻松地返回其历史记录。
注意:在任何新的加载之后,我还有一个覆盖任何新标签的函数,这样它就可以在下一个新页面中通过这个方法工作
另外,如果答案不使用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);
}
您需要对任何新添加的脚本标记的文本内容调用
eval()
。@JaromandaX:我想您也可以使用Function
,或者DataURL,这是您的意思吗?必要吗?不,您可以添加dupe并添加新脚本,但是jQuery使用eval()进行load()
甚至html()
,它应该比使用缓慢的dom更快…但是jQuery使用的是
…我对jQuery使用的东西没有任何顾虑:pfor当然。我只是说eval在这个特定的环境中被广泛接受,因为它的广泛使用和简单性,即使这里没有人愿意公开推广evaL