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がこの世から消え去ることを願うばかりなり。