使用jQuery替换页面内容时出现TypeError: n.head is null错误的咨询
这个报错的原因其实很好理解:当你用$("html").html(data)直接替换整个<html>标签内的所有内容时,jQuery内部的一些操作依赖于document.head元素,但在替换过程中,旧的<head>被移除,新的<head>还没被浏览器完全解析渲染出来,导致jQuery找不到head元素,就抛出了这个"n.head is null"的错误。
修复方案(两种简单可靠的方式)
方式1:用原生JS直接重写整个文档(最推荐)
放弃用jQuery的html()方法替换,改用原生JS的document.open()、document.write()和document.close(),这三个方法会让浏览器重新渲染整个页面,相当于加载了一个新的HTML文档,所有的样式、脚本都会正常解析和执行,完美适配你的场景:
修改你的sendXml函数里的done回调:
.done(function (data) { // 重写整个文档 document.open(); document.write(data); document.close(); })
这样做的好处是,浏览器会像处理普通页面加载一样,自动解析返回的HTML里的<head>(包括Bootstrap样式、Highcharts脚本)和<body>,window.onload里的代码也会正常触发,完全不会有jQuery的兼容性问题。
方式2:用jQuery分部分替换head和body
如果你坚持要用jQuery,可以把返回的HTML拆分成head和body两部分,分别替换,避免直接操作整个<html>标签:
.done(function (data) { // 创建一个临时容器解析返回的HTML const tempContainer = $('<div>').html(data); // 提取新的head和body内容 const newHeadContent = tempContainer.find('head').html(); const newBodyContent = tempContainer.find('body').html(); // 分别替换现有页面的head和body $('head').html(newHeadContent); $('body').html(newBodyContent); // 手动触发window.onload里的逻辑(因为替换内容不会自动触发onload) window.onload(); })
注意:这种方式需要手动触发window.onload函数,因为替换DOM内容不会像页面加载那样自动触发onload事件,否则你的Highcharts图表不会渲染。
额外小提醒
你的sendXml函数里的url变量没有定义,记得改成正确的请求地址,比如可以用$('form').attr('action')获取表单的action属性值,或者直接写死后端接口的路径(比如'/submit-xml'),不然AJAX请求会失败哦。
内容的提问来源于stack exchange,提问作者leo.demiurg

