windowでのマウスイベント

HTMLで超シンプルなスライダーをjQueryで実装していたら、ひさびさに「超トホホ・ミス」をやって1日以上ハマってしまいました。トホホというか、単なる見落としなんですが・・・。

なんか作るとき、chromeを使って確認しているんですが・・・さて出来た!と思ってクソ・ブラウザInternet Explorerで確認すると・・・案の定動かない。IE9ではうごいていたはずなんだが・・・と思ってなにが原因かソースを見ること数時間。あれこれ試行錯誤しても動かない。

で、下のような簡単なコードをIE8で確認したら、うんともすんとも言わない。たぶん、ほとんどの人はこう思ったでしょう、

おまえはあほか!

と。

$(window).click(function(ev)
                {
                  alert('window.click!');
                });

よく考えてみたら、Internet Explorer で windowオブジェクトにonclick とか onmousedown とか onmousemoveとかなかった!というオチ。
エラー吐いてくれればすぐ分かったのに・・・なまじIE9で動いてたもんだから分からなかった。

肝心のスライダーは、こんなん。テストページはこっち。

// 単純なスライダーの一部(とりあえずUI部品だけのテストコード)
// これにコールバックを登録するコードを付け足せばとりあえず完成。の一歩手前。
var $frame = jQuery(document);

jQuery('.slider').mousedown(function(e)
                            {
                              var $slider = jQuery(this);
                              var el = this;
                              
                              if(typeof this.slider !== 'object')
                                this.slider =
                                {
                                  drag  : false,
                                  pos   : 0,
                                  limit : $slider.parent().width() - $slider.width() - parseInt($slider.css('paddingLeft')) - parseInt($slider.css('paddingRight')),
                                  bgcolor: this.style.backgroundColor
                                };

                              this.slider.drag = true;
                              
                              $frame.bind('mousemove.slider',
                                        function(e)
                                        {
                                          if(!el.slider.drag)
                                            return;
                                          
                                          el.slider.prev = el.slider.prev ? el.slider.prev : e.pageX;
                                          
                                          var cur = el.slider.pos + (e.pageX-el.slider.prev);
                                          if(el.slider.limit >= cur && 0 <= cur)
                                            {
                                              el.slider.pos = cur;
                                              el.innerHTML = el.style.marginLeft = cur + 'px';
                                              el.slider.prev = e.pageX;
                                            }
                                          else if(el.slider.limit < cur)
                                            {
                                              el.slider.pos = el.slider.limit;
                                              el.innerHTML = el.style.marginLeft = el.slider.pos + 'px';
                                            }
                                          else if(0 > cur)
                                            {
                                              el.slider.pos = 0
                                                el.innerHTML = el.style.marginLeft = el.slider.pos + 'px';
                                            }
                                        })
                                .bind('mouseup.slider',
                                      function(e)
                                      {
                                        $slider.mouseup();
                                      });
                              
                              e.preventDefault();
                       })
                 .mouseup(function(e)
                       {
                         if(this.slider.drag)
                           {
                             this.slider.drag = false;
                             this.slider.prev = 0;
                             $frame.unbind('.slider');
                           }
                       });

やっつけスクリプトに、えらい時間かけてしまった・・・あ~あ orz

・・・とにかく、一刻も早くIE8を含め、IE10以下のバージョンのInternet Explorerがこの世から消え去ることを願うばかりなり。