6

jQuery ソースを調べたところ、問題はXML ドキュメントに対して存在しないreplaceWith呼び出しが原因であることがわかりました。XML 文書では動作しないはずですかhtml?replaceWith

将来誰かがそれを必要とする場合に備えて、私がやろうとしていることを達成する、この確かに簡単な回避策を見つけました:

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
4

2 に答える 2

2

replaceWith()これは、設計上の制限またはバグのように見えます。

私が実行すると:

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

"this[0].innerHTML is undefined"例外 があります。この jsFiddle を参照してください

にドリルダウンするxmlと、bノードには innerHTML メンバーがありません。これは HTML ではないため、少し意味があります。;)

そのため、replaceWith()XML が常に適切に機能するとは限らないようです。 バグの報告を検討してください

于 2011-07-09T04:26:26.200 に答える
0

はい。これは古いバグで、まだ存在しています。あなたはそれを回避することができます:

$.ajax
  dataType: "xml"
  ...
  success:  (data) ->
    $(data).find("section").each ->
      ugly_but_working_clone = $($(".existing_dom_element").append(this).html())
于 2012-05-21T16:54:17.380 に答える