innerHTML能在XML元素中使用吗?

8
根据《JavaScript权威指南》的说法:“尽管名字是innerHTML,但它既可以用于HTML元素,也可以用于XML元素”。然而,当我尝试访问XML Element对象的innerHTML属性时,会返回undefined。
var xml = $.ajax({url: "test.xml", async: false}).responseXML.documentElement;
console.log(xml.innerHTML); // displays "undefined" in console log

这个行为的解释是什么?
test.xml:
<?xml version="1.0" encoding="utf-8"?>
<foo><bar>baz</bar></foo>

你的响应XML长什么样? - BoltClock
修改问题以包含XML响应。 - Josh Johnson
4个回答

9

早期的回答并未涉及到截至2014年9月存在的较新版本的浏览器。当使用以下代码创建XML文档时:

var parser = new DOMParser(); 
var doc = parser.parseFromString(data, "text/xml");

假设data是一个XML字符串,那么以下内容为真:

  • 在Firefox 28和Chrome 36中,doc节点包含innerHTML字段,其中包含节点内容的XML序列化。

  • 在IE 9、10和11、Safari 7.0和Opera 12中,doc节点既没有innerHTML字段也没有xml字段。我无法找到可以代替这些字段的东西。除了在这些浏览器中使用XMLSerializer外,似乎没有其他选择。


这太奇怪了。我不会预期innerHTML属性在除HTMLElement对象之外的任何对象上起作用。我想知道这是否是最新标准的预期行为?顺便说一下,我回到这个问题并发现你的答案,同时回答这个问题 - BoltClock

7

解释是这本书在这一点上是错误的。

IE中的XML元素具有非标准的xml属性,可提供等效于innerHTML的功能。对于其他浏览器,您需要使用XMLSerializer


我希望不是这样的(我有最新版!)。谢谢回复。 - Josh Johnson
你可能会期望一本如此厚重的书籍中会有一些错误,但这并不完全是排版错误,并且这已经是第六版了,所以我还是有点惊讶。 - Tim Down
@BoltClock:书籍经常是错误的,即使通常非常好的JavaScript权威指南也是如此。我认为我没有一本没有任何错误的JS书籍。 - Tim Down
我知道。那只是为了缓和气氛 :) - BoltClock

4

HTML5定义了XML元素上存在innerHTML属性(尽管名称中使用XML解析器/序列化程序)。目前还没有任何实现。Opera一段时间以来一直支持XHTML中的innerHTML(但不支持XML),但是使用HTML解析器/序列化程序。


HTML5为什么要涉及XML? - Tim Down
来自DOM解析和序列化规范。看起来好像有一些HTML泄漏到了XML世界中。 - Ludovic Kuty

-1
你可以这样做,但我更倾向于使用jQuery,因为它更容易实现。jQuery的方式是选择你想要的元素容器。然后,你可以使用html()属性来改变或获取你的元素的innerHTML。
$("myxmltag").html("<achildtag>Hello</achildtag><anotherchildtag>World!</anotherchildtag>");

有关此属性的更多信息,请参阅:http://api.jquery.com/html/

此外,不要忘记 html() 和 text() 之间的区别,您可以使用其他属性使用 jQuery 操作节点中的元素,例如 append()、prepend()、after() 等等...


1
jQuery的html()文档明确指出该方法不适用于XML文档。 - Josh Johnson
我不知道为什么,但它对我起作用了。嗯,我想这是因为我手动创建了XML,我的意思是,我没有从服务器获取它。 - Jesufer Vn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接