コールバックを使用した柔軟なアプローチを次に示します。
function replaceTextNodes(node, callback) {
if (node.nodeType === 1) {
for (var i = 0; i < node.childNodes.length; i++) {
replaceTextNodes(node.childNodes[i], callback);
}
} else if (node.nodeType === 3) {
node.textContent = callback(node.textContent);
}
}
replaceTextNodes(document.getElementById("divToProcess"), function (text) {
return text + text;
});
http://jsfiddle.net/QAyAM/
おそらくあなたが望んでいたように、これはすべてのイベントハンドラーなどを変更しないままにします。
編集: テキストを HTML に置き換える機能。このアプローチが正しい/良いかどうかは100%確信が持てません.誰かがコメントを持っている場合は、コメントしてください. :)
HTML のテスト:
<div id="divToProcess">
<div>Some text here</div>
<div id="id1">so hello me more <span class="class2">text</span> and more text</div>
<div class="class1">some more text <a href="xxxxxx">link text</a>
hello!! hello
<div>
</div>
JS:
function replaceTextNodesWithHTML(node, callback) {
if (node.nodeType === 1) {
for (var i = 0; i < node.childNodes.length; i++) {
replaceTextNodesWithHTML(node.childNodes[i], callback);
}
} else if (node.nodeType === 3) {
var parentNode = node.parentNode;
var div = document.createElement("div");
div.innerHTML = callback(node.textContent);
var childNodes = [].slice.call(div.childNodes);
if (childNodes.length > 0) {
parentNode.replaceChild(childNodes[childNodes.length - 1], node);
for (var i = childNodes.length - 2; i >= 0; i--) {
parentNode.insertBefore(childNodes[i], childNodes[i + 1]);
}
}
}
}
replaceTextNodesWithHTML(document.getElementById("divToProcess"), function (text) {
return text.replace(/hello/g, "<a href='#'>Hello!</a>");
});
http://jsfiddle.net/tXS2v/1/