Javascript-DOM解析器加载ajax请求,脚本不运行

Javascript-DOM解析器加载ajax请求,脚本不运行,javascript,html,ajax,Javascript,Html,Ajax,当用户点击一个链接而不是加载一个全新的页面时,我通过一个ajax请求加载新页面的HTML数据(还有一个查询字符串,我让服务器每次都不发送导航条数据),然后通过DOMParser输入ajax请求的结果数据,让我只从div中获取id为的内容“content”并替换当前文档的“context”div的innerHTML 通过此方法执行请求后,尽管newDOM中的任何脚本标记在放入content div后都不会运行。此外,它在newDOM中时也会运行,因为如果您有一个脚本在加载文档时立即编辑文档,则注销

当用户点击一个链接而不是加载一个全新的页面时,我通过一个ajax请求加载新页面的HTML数据(还有一个查询字符串,我让服务器每次都不发送导航条数据),然后通过DOMParser输入ajax请求的结果数据,让我只从div中获取id为的内容“content”并替换当前文档的“context”div的innerHTML

通过此方法执行请求后,尽管newDOM中的任何脚本标记在放入content 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();
  }
  });
注意:变量“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