flipsnap.jsでIE10のPointer Eventsに対応した
flipsnap.jsをWindows8のIE10のタッチで動くようにしました。
思ったより簡単に対応できました。diffはこんな感じ。
IE10 for touch device support. Fix #13 · 0524fef · pxgrid/js-flipsnap
IE10はiOSやAndroidのようにtouchstart
やtouchmove
のようなタッチイベントが用意されておらず、代わりにタッチした際に、pointerイベントというイベントが発火します。
- Pointer Events Specification
- Touch Input for IE10 and Metro style Apps - IEBlog - Site Home - MSDN Blogs
まだMSPointerDown
のようにMS
というprefixがついています。
element.addEventListener('MSPointerDown', function() {
// タッチが始まった時の処理
}, false);
element.addEventListener('MSPointerMove', function() {
// タッチが動いている時の処理
}, false);
element.addEventListener('MSPointerUp', function() {
// タッチが終わった時の処理
}, false);
基本的にはmouseイベントやtouchイベントと同じように使えるので、イベント名だけ変更すれば対応はできます。また、window.navigator.msPointerEnabled
の値を見てpointerイベントが使用可能かどうかを判断することができます。
var support = {
mspointer: window.navigator.msPointerEnabled,
touch: 'ontouchstart' in window
};
var touchStartEvent =
support.mspointer ? 'MSPointerDown' :
support.touch ? 'touchstart' :
'mousedown';
element.addEventListener(touchStartEvent, function() {
// タッチが始まった時の処理
}, false);
また、1点注意が必要で、CSSで-ms-touch-action: none;
というのを指定しないとタッチしたときにネイティブのスクロールなどが優先されてpointerイベントがちゃんと発火しません。JavaScriptからこのプロパティを設定するには次のようにします。
if (support.mspointer) {
element.style.msTouchAction = 'none';
}
CSSでやるならこうです。
#element {
-ms-touch-action: none;
}
今回のflipsnap.jsでの対応は将来的にまだpointerイベントがどうなるかわからないのでMS
のプレフィックス限定で対応しています。将来的にプレフィックスが外れたり他のブラウザでも対応が始まった場合はその都度対応していく予定です。
また、Windows8のタッチ対応端末で確認したところ、Chromeはtouchイベント、Firefoxはmouseイベントが発火していたのでそのままで使えてました。なかなかタッチイベントまわりカオスな状況ですね。
- Prev Entry:Advent Calendarの登録サイトつくりました
- Next Entry:最近のLessのextendの進捗