DOM でオブジェクトを操作するとき、ソースコードの改行やインデントに使われる、空白文字だけで構成されたテキストノードが邪魔になることがよくあります。
そんなときのための関数をつくってみました。
removeBlankTextNode.js
/** * 空白文字だけで構成されるテキストノードを除去する関数 * 第二引数で再帰する深さを指定できる * 再帰回数のデフォルトは 0 (再帰しない) で、負の数にすると可能な限り再帰する */ function removeBlankTextNode(node) { if (node.childNodes && node.childNodes.length) { var removables = []; var recursive = (arguments.length > 1) ? parseInt(arguments[1]) : 0; var re = new RegExp('^\\s*$'); for (var i = 0; i < node.childNodes.length; i++) { if (node.childNodes[i].nodeType == 1) { if (recursive) { removeBlankTextNode(node.childNodes[i], recursive - 1); } } else if (node.childNodes[i].nodeType == 3) { if (re.test(node.childNodes[i].data)) { removables.push(node.childNodes[i]); } } } while (removables.length) { node.removeChild(removables.pop()); } } } /** * DOM Element のプロトタイプを拡張し、自身に対して * removeBlankTextNode() をかけるメソッドを追加 * IE6 では使えない (しかし、そもそも IE6 では空のテキストノードが無視される?) */ if (typeof Element == 'function') { Element.prototype.removeBlankTextNode = function() { var recursive = (arguments.length) ? parseInt(arguments[0]) : 0; removeBlankTextNode(this, recursive); } } else { Object.prototype.removeBlankTextNode = function() { var recursive = (arguments.length) ? parseInt(arguments[0]) : 0; removeBlankTextNode(this, recursive); } }