removeTextNode()

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);
  }
}