X-0013 要素の内部テキストを得る

HTML を操作するスクリプトでは elem.innerHTML や elem.innerText のようなプロパティが使えれば便利なのですが、 Mozilla には innerText がありません。こういう場合、自分で似たような関数を作っておくと便利です。

以下は、再帰処理を使った例。

function getInnerText(node) {
   var nodes = node.childNodes,
       ret   = [];

   for (var i = 0; i < nodes.length; i++)
      if (nodes[i].hasChildNodes())
          ret.push(getInnerText(nodes[i]));
      else if (nodes[i].nodeType == Node.TEXT_NODE)
          ret.push(nodes[i].nodeValue);
      else if (nodes[i].alt)
          ret.push(nodes[i].alt);

   return ret.join('');
}

再帰処理を使わない場合はこんな感じ。

function getInnerText(node) {
    if (!node || !node.firstChild) return '';
    node  = node.firstChild;

    var depth = 1,
        ret   = [];

    traceTree:
    while (node && depth > 0) {
        if (node.hasChildNodes()) {
            node = node.firstChild;
            depth++;
        } else {
            if (node.nodeType == Node.TEXT_NODE)
                ret.push(node.nodeValue);
            else if (node.alt)
                ret.push(node.alt);

            while (!node.nextSibling) {
                node = node.parentNode;
                depth--;
                if (!node) break traceTree;
            }
            node = node.nextSibling;
        }
    }
    return ret.join('');
}