替换XML问题

时间:2011-07-09 03:14:50

标签: javascript jquery xml replacewith

在检查了jQuery源代码之后,我发现我遇到的问题是因为replaceWith调用html而不是XML文档。 replaceWith不应该在XML文档上工作吗?

我发现这个公认的简单解决方法,以防将来有人需要它,这将完成我想要做的事情:

xml.find('b').each(function() {
    $(this).replaceWith($('<c>yo</c>')) // this way you can custom taylor the XML based on each node's attributes and such
});

但我仍然想知道为什么简单的方法不起作用。


我对jQuery了解不多,但这不应该有用吗?

xml = $.parseXML('<a><b>hey</b></a>')
$(xml).find('b').replaceWith('<c>yo</c>')

而不是xml代表<a><c>yo</c></a>,它失败并代表<a></a>。我做错什么了吗?我正在使用jQuery 1.6.2。

编辑:

作为旁注,如果我尝试使用replaceWith的函数版本,就像这样:

$(xml).find('b').replaceWith(function() {
    return '<c>yo</c>' // doesn't matter what I return here
})

我收到此错误:

TypeError: Cannot call method 'replace' of undefined

编辑2:

然而

replaceAll有效,但我需要使用函数版本,所以我不能满足于此:

$('<c>yo</c>').replaceAll($(xml).find('b')) // works

编辑3:

这也有效:

xml.find('b').replaceWith($('<c>yo</c>')) // but not with the $() around the argument

2 个答案:

答案 0 :(得分:2)

这看起来像replaceWith()的设计限制或错误。

当我跑步时:

$(xml).find('b').replaceWith(function() {
    return '<c>yo</c>';
})

我收到"this[0].innerHTML is undefined"个例外。 See this jsFiddle

钻入xmlb节点没有innerHTML成员 - 这有点意义,因为它不是HTML。 ;)

因此,看起来replaceWith()可能并不总是与XML相配。 Consider reporting a bug

答案 1 :(得分:0)

是肯定的。这是旧的bug,它仍然存在。你可以解决它:

$.ajax
  dataType: "xml"
  ...
  success:  (data) ->
    $(data).find("section").each ->
      ugly_but_working_clone = $($(".existing_dom_element").append(this).html())