一から勉強させてください( ̄ω ̄;)

最下級エンジニアが日々の学びをアウトプットしていくだけのブログです。

IE対応時のsetTimeoutの使い方メモ

仕事が忙しくてなかなかブログ書けませんでした。ひさしぶりの投稿です。。

今回はIEでsetTimeoutを使用した際にハマった事を備忘録として書きたいと思います。


どんなものを使ったかと言うと、
以下のように締め切り時間を引数に渡し、1分ごとに現在の時間との差をカウントするものです。

    function countDown(tl){
        var tl = new Date(tl),
            now = new Date(),
            limit_msec = tl.getTime() - now.getTime(),
                hr = "0" + Math.floor(limit_msec / (1000 * 60 * 60)),
                min = "0" + Math.floor((limit_msec % (1000 * 60 * 60)) / (1000 * 60));

            if(limit_msec > 0){
                hr = hr.substr(hr.length - 2, 2);
                min = min.substr(min.length - 2, 2);

                $("p").text("残り" + hr + "時間" + min + "分");

                setTimeout(countDown, 1000, "2013/05/18 12:00:00");

            }else{
                //締め切り時間を過ぎている場合
               $("p").text("締め切り済みです"));
            }
    }

みたいな(関数自体はてきとーに書いてますw)


普通のブラウザだとこれで問題なく動いてくれるんですが、IEだとおかしな挙動をみせてくれます。

なんと締め切り時間を過ぎていないのに「締め切り済み」と表示されてしまうのです。さすがIE


そこでいろいろ調べてみたところ、このような記事を発見しました。(すばらしーー!!)
http://maxura.blog62.fc2.com/blog-entry-179.html


setTimeoutの引数の渡し方がダメだと…!?
三番目の引数に渡すところがIEだとうまくいかないみたいですね。


結局、

setTimeout(function(){
    countDown(tl);
}, 1000);

と書き直してやることでIEでもうまく動くようになりました。


非常に地味なバグですが、
締め切り時間が過ぎてないのに「締め切り済」って出るとか、サービスとしては致命的なバグですよね。。


一刻もはやくIEがこの世から消え去る日が来ますように。


小さな事からコツコツと。