使用Javascript附加元素仅适用于.innerHTML,但不适用于XML子节点
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用Javascript附加元素仅适用于.innerHTML,但不适用于XML子节点,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3016字,纯文字阅读大概需要5分钟。
内容图文
![使用Javascript附加元素仅适用于.innerHTML,但不适用于XML子节点](/upload/InfoBanner/zyjiaocheng/681/96770b871c2741b8910d86ee47573577.jpg)
可能有更简单的方法可以执行此操作,但是我正在尝试一些新方法.
基本要点是,我想在静态网站上每页每人头拥有一个JS和一个jQuery附件.我希望能够将元素附加到身体,但也要添加到头部.我的文件是:
home.html
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="eco.js"></script>
</head>
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
<head>
<link href='eco.css' type='text/css' rel='stylesheet' />
<link href='home.css' type='text/css' rel='stylesheet' />
</head>
但是,这不起作用(成功请求并检索了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对象,该对象表示一个通用XML DOM,该XML DOM与HTML DOM不兼容.
在将XML文件解析为XML之后追加子节点时,最终插入的是XML元素,而不是HTML元素.由于HTML处理器仅理解HTML链接元素,因此当它们来自XML DOM时无法识别它们-它们成为未知元素,并且没有其预期的含义.
当直接附加响应标记时,该标记被解释为HTML,因为您正在页面中直接使用HTML DOM.这使您的链接元素可以按预期工作,并引用供页面使用的外部样式表.
下面的示例带有一个非head元素,它使用问题中的相同方法演示了b元素在HTML和XML之间的区别.在HTML中,它表示text that is meant to stand out from a paragraph,并带有关联的默认样式.在纯XML中,它只是一个任意元素,没有默认样式.在Firefox和IE中,尽管IE根本不插入XML元素,而是抛出WrongDocumentError,但每个b元素也可以正确响应命名空间的CSS选择器(即使它们与HTML元素一起使用XHTML命名空间).包含的CSS在Chrome中也不能很好地工作-大概是因为,与IE一样,试图将HTML和XML纠缠在一起并不是最明智的选择.
$(function() {
var html = '<b>HTML b element</b>';
var xml = '<root><b>XML b element</b></root>';
$('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;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<p class="html"></p>
<p class="xml"></p>
有趣的是,如果您使用xml.querySelector(“ head”).innerHTML而不是xml.querySelector(“ head”).childNodes,尽管Element对象不是HTMLElement(即xml),它似乎也可以工作. HTMLElement的querySelector(“ head”)实例返回false).根据this new answer by Louis,在Firefox和Chrome的最新版本中,innerHTML表示XML元素节点的内容的XML序列化,这解释了此行为.但是,不应依赖innerHTML的这种特殊功能,因为它与跨浏览器不兼容.
最终,最好的选择是首先不要将文档解析为XML.只需直接附加responseText即可将其视为常规HTML片段,因为jQuery能够处理HTML片段.
内容总结
以上是互联网集市为您收集整理的使用Javascript附加元素仅适用于.innerHTML,但不适用于XML子节点全部内容,希望文章能够帮你解决使用Javascript附加元素仅适用于.innerHTML,但不适用于XML子节点所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。