Oct 23, 2006

SafariのDate#setMonthがバグってたのでprototype上書きで対処してみる

JavaScriptのDateオブジェクトはdate.setMonth(-1)とやると、前年の12月にしてくれて大変便利なのですが、Safariで上手く動かなかったりするようなのでprototype上書きで対処してみました。

// fix safari's Date#setMonth
(function(){
    var set_month = Date.prototype.setMonth;
    Date.prototype.setMonth = function(num){
        if(num <= -1){
            var n = Math.ceil(-num);
            var back_year = Math.ceil(n/12);
            var month = (n % 12) ? 12 - n % 12 : 0 ;
            this.setFullYear(this.getFullYear() - back_year);
            return set_month.call(this, month);
        } else {
            return set_month.apply(this, arguments);
        }
    }
})();

引数に-1以下の数字が渡ってきた場合は、自前で何年前の何月かを計算します。それ以外の場合はオリジナルのsetMonthメソッドを呼び出します。safariでもsetMonth(12)の方は上手く動いてくれるようで、きちんと来年の1月にしてくれます。

Appleのサイト上にこんな文章があるのですが、
http://www.mac.com/web/ja/Tips/425954F3-DF73-4B9B-94AC-20EE4BDE374C.html
もしアップルが推奨するブラウザを使っていて機能しないサイトを見つけたら、 苦情を申し立てましょう。 そのサイトが、 Web 上でもっとも進化したものに対応できるブラウザでもうまく機能しないのはなぜなのか、 サイトオーナーに説明を求めるとよいでしょう。

言わずもがな、Safariがバグってるからです。
Posted at 22:14 | WriteBacks (7) | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.
















A quick preview will be rendered here when you click "Preview" button.