«前の日記(2010-08-21 (土)) 最新 次の日記(2010-08-23 (月))»  

まちゅダイアリー


2010-08-22 (日)

下書きプラグイン (draft.js) を IE8 に対応

下書きプラグインを作ってから、日記を書くときの安心感が大幅にアップした。 今のところまだ下書きから復旧したことはないけど、間違ってタブを閉じても、サーバーが落ちていても、日記の内容が消えないって思えるのはいいねぇ。 とはいえ、まだプレビュー前には CTRL+A, CTRL+C を押してクリップボードに保存するクセが抜けないんだけど。

下書きプラグインは Chrome5, 6, Firefox 3.6, Safari5 で動作確認できていたんだけど、 IE8 では動いていなかった。 調べてみたら、 Array オブジェクトに map メソッドが存在しなかったのが原因。 map が追加されたのは JavaScript 1.6 からだから、まだ対応していないブラウザもあるんだな。

ということで、 Mozilla Development Center に載っていたコードを下書きプラグインに取り込んだ。

Compatibility

map is a recent addition to the ECMA-262 standard; as such it may not be present in all browsers. You can work around this by inserting the following code at the beginning of your scripts, allowing use of map in implementations which do not natively support it. This algorithm is exactly the one used in Firefox and SpiderMonkey.

if (!Array.prototype.map)
{
  Array.prototype.map = function(fun /*, thisp*/)
  {
    var len = this.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array(len);
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
        res[i] = fun.call(thisp, this[i], i, this);
    }

    return res;
  };
}

これで IE8 でも下書きプラグインが動くようになった。 tDiary 3.0 のリリースが待ち遠しいね。

Tags: tDiary
本日のツッコミ(全4件) [ツッコミを入れる]
えろぺお (2010-08-22 (日) 07:17)

IE8の問題とはいえ、既存のクラスに関数を追加するのは、今ではあまりお行儀がよくないことと言われています。jQuery.mapを使用されては如何でしょうか?

まちゅ (2010-08-22 (日) 10:03)

prototypeに追加するのは気になっていたのですが、編集画面だからと妥協していました。<br>とはいえ、よりベターな代替案 (jQuery.map) があるのに使わない手は無いですね。ありがとうございます。<br><br>ところで、jQuery.mapの場合はthisを参照できなくなるため困ったことがあるのですが、みなさんはどうしているのでしょうか。

えろぺお (2010-08-22 (日) 13:51)

jQuery.mapは3番目以降の引数がそのままコールバック関数に渡るので、thisを渡すことはできますが、Array#mapのようにthisのコンテキストでは動かないので、ちょっと格好悪いですね。

えろぺお (2010-08-22 (日) 14:04)

と思ったら、ソースに「for internal usage only」って書いてありました。。。