Firefoxで innerText と outerHTMLをエミュレート

2008-08-15追記: http://d.hatena.ne.jp/uupaa/20080815/1218787414 でouterHTML getter に対応しています。


Firefox用に、innerTextとouterHTMLをエミュレートするコードを書いてあったのですが(2002年頃かな?)、近頃はsetter,getter構文が廃止されているようで、代わりに__defineSetter__と__defineGetter__を使うようです。

var uud = document, uuw = window;
var uu = uuw.uu = {
  ua: {
    ff: !!(navigator.userAgent.indexOf('Firefox') >= 0) // Firefox
  }
};
if (uu.ua.ff && !HTMLElement.prototype.outerHTML) {
  HTMLElement.prototype.__defineSetter__("outerHTML", function(html) {
    this._outerHTMLValue = html;
    var r = uud.createRange(), f;
    r.setStartBefore(this);
    f = r.createContextualFragment(html);
    this.parentNode.replaceChild(f, this);
  });
}
if (uu.ua.ff && !HTMLElement.prototype.innerText) {
  HTMLElement.prototype.__defineSetter__("innerText", function(text) {
    while(this.hasChildNodes()) {
      this.removeChild(this.lastChild);
    }
    this._innerTextValue = text;
    this.appendChild(uud.createTextNode(text));
  });
  HTMLElement.prototype.__defineGetter__("innerText", function() {
    return (typeof this._innerTextValue !== "undefined") ? this._innerTextValue : this.textContent;
  });
}

innerHTMLはFirefox2.0以降(1.5も?)でサポートされるようになってホッとした記憶がありますが、いまやモダンなブラウザのほぼ全てで、innerHTMLがサポートされているようなので、昔に比べてずいぶん楽ができますね。