置換が何かであり、要素の子の途中で置換することについて話しているため、単一の要素を挿入したり、直接削除して追加したりするよりも注意が必要です。
function replaceTargetWith( targetID, html ){
/// find our target
var i, tmp, elm, last, target = document.getElementById(targetID);
/// create a temporary div or tr (to support tds)
tmp = document.createElement(html.indexOf('<td')!=-1?'tr':'div'));
/// fill that div with our html, this generates our children
tmp.innerHTML = html;
/// step through the temporary div's children and insertBefore our target
i = tmp.childNodes.length;
/// the insertBefore method was more complicated than I first thought so I
/// have improved it. Have to be careful when dealing with child lists as
/// they are counted as live lists and so will update as and when you make
/// changes. This is why it is best to work backwards when moving children
/// around, and why I'm assigning the elements I'm working with to `elm`
/// and `last`
last = target;
while(i--){
target.parentNode.insertBefore((elm = tmp.childNodes[i]), last);
last = elm;
}
/// remove the target.
target.parentNode.removeChild(target);
}
使用例:
replaceTargetWith( 'idTABLE', 'I <b>can</b> be <div>anything</div>' );
デモ:
.innerHTML
一時的な divを使用することで が生成され、苦労せずに挿入する必要がありますTextNodes
。Elements
ただし、一時的な div 自体を挿入するのではなく (これにより不要なマークアップが作成されます)、その子をスキャンして挿入することができます。
...それか、jQuery とそのreplaceWith
メソッドの使用を検討してください。
jQuery('#idTABLE').replaceWith('<blink>Why this tag??</blink>');
2012/11/15更新
上記の EL 2002 のコメントへの応答として:
常に可能であるとは限りません。たとえば、createElement('div')
そのinnerHTMLを に設定すると<td>123</td>
、このdivは<div>123</div>
(jsは不適切なtdタグを捨てます)
上記の問題は明らかに私の解決策も無効にします-それに応じて上記のコードを更新しました(少なくともtd
問題については)。ただし、特定の HTML では、何をしてもこれが発生します。すべてのユーザー エージェントは、独自の解析ルールを使用して HTML を解釈しますが、ほとんどすべてのユーザー エージェントが不適切な HTML を自動修正しようとします。あなたが話していることを正確に達成する唯一の方法(いくつかの例で)は、HTML を DOM から完全に取り出し、それを文字列として操作することです。これは、次のマークアップ文字列を実現する唯一の方法です(jQuery もこの問題を回避できません)。
<table><tr>123 text<td>END</td></tr></table>
次に、この文字列を取得して DOM に挿入すると、ブラウザによっては次のようになります。
123 text<table><tr><td>END</td></tr></table>
<table><tr><td>END</td></tr></table>
残っている唯一の質問は、そもそもなぜ壊れた HTML を実現したいのかということです。:)