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

标签 javascript html ajax

当用户单击链接而不是加载整个新页面时,我通过 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/

相关文章:

javascript - 将格式输入类型 ='date' 从 mm-dd-yyyy 更改为 dd-mm-yyyy Laravel

jquery - 从 colorbox 内的表单序列化帖子

Javascript - 如何在对对象文字的ajax调用中绑定(bind) 'this'

c# - 将代码从 Java 转换为 C#/ASP.NET

javascript - 无法在客户端获取 socket.io

javascript - 使用javascript选中复选框后如何验证 "textarea"

css - 完美中心的内容栏,附有左右栏

javascript - 具有长时间步长的重力(使用 javascript)

html - 高度属性html中的响应表?

php - Yii2 ajax 错误请求 (#400)