使用Javascript附加元素可以使用.innerHTML,但不能使用XML子节点

有可能更简单的方法来做到这一点,但我正在尝试一些新的东西。

基本要点是我希望在我的静态网站上每页每页有一个JS和一个jQuery附件。 我希望能够将元素附加到身体上,但也可以。 我的文件是:

home.html的

    

eco.js

 window.addEventListener("load", function() { var ajax = new XMLHttpRequest(); ajax.onload = postdata; ajax.open("GET", ADDRESS, true); ajax.send(); } ); function postdata() { var xml = jQuery.parseXML(this.responseText); $("head").append(xml.querySelector("head").childNodes); } 

和common.xml

     

但是,这不起作用(请求并成功检索common.xml)。 Chrome开发工具显示xml节点也成功附加到头部。 然而,该页面并未反映出这些变化,特别是css未被纳入。 但是,如果我改变了

  var xml = jQuery.parseXML(this.responseText); $("head").append(xml.querySelector("head").childNodes); 

 $("head").append(this.responseText); 

(并修复common.xml以删除不需要的标记)然后页面反映更改。 谁能解释一下这里发生了什么?

谢谢!

jQuery.parseXML()返回一个XMLDocument对象,该对象表示与HTML DOM不兼容的通用XML DOM。

在将XML文件解析为XML后附加子节点时,最终插入的是XML元素,而不是HTML元素。 由于HTML处理器只能理解HTML link元素,因此当它们来自XML DOM时它不会识别它们 – 它们变成未知元素,并且没有它们的预期含义。

直接附加响应标记时,该标记将被解释为HTML,因为您正在直接使用页面中的HTML DOM。 这允许您的link元素按预期工作,引用外部样式表以与页面一起使用。


以下示例使用非head元素,演示了如何使用问题中的相同方法在HTML和XML之间区分b元素。 在HTML中,它表示旨在从段落中脱颖而出的文本 ,以及相关的默认样式。 在纯XML中,它只是一个任意元素,没有默认样式。 在Firefox和IE中,每个b元素也正确响应命名空间的CSS选择器(注意它们甚至使用HTML元素使用XHTML命名空间),尽管IE根本不插入XML元素,而是抛出WrongDocumentError 。 所包含的CSS在Chrome中也不能很好地工作 – 大概是因为,与IE一样,试图将HTML和XML纠缠在一起并不是最聪明的事情。

 $(function() { var html = 'HTML b element'; var xml = 'XML b element'; $('p.html').append(html); var xmlDoc = jQuery.parseXML(xml); $('p.xml').append(xmlDoc.querySelector(':root').childNodes); }); 
 @namespace 'http://www.w3.org/1999/xhtml'; b::before { content: 'Default namespace '; } |b::before { content: 'Non-namespaced '; } /* Any or no namespace */ *|b { color: blue; }