クリックが遅い?
おそらく世間的には常識的な内容なんでしょうが、モバイル用フロントエンドの初学者には新鮮なことだったので書き残しておきます。
実はモバイル用のビューアーを書いていて、前から「なんかクリックが遅い?」と気になっていたのです。
ずっと「シミュレーター経由だからかなあ」とか思っていたんですが、なんとなく不安でモヤモヤしてました。
で、そんなときにたまたま、backbone.touch.jsというライブラリを見つけて「ああなるほど」と感心しました。
https://github.com/nervetattoo/backbone.touch
ここのドキュメントによると、タッチデバイスって、クリックイベントが300msぐらい遅れて発火するらしいのですね。
なので、backbone.touch.jsは、Backbone.View.prototype.delagateEventsを上書きして、clickを使って書かれたハンドラが「touchstart/touchend」を使ったハンドラに自動的に置き換わるようにしちゃおう、というライブラリなのだそうで。
じゃあどうやってtouchstart/touchendでクリックを判定するかというと、touchstartした座標を覚えておいて、touchendした位置がそこから殆どずれていなかったら「それってクリックだよね」っていう判定処理をしているみたいです。
クリックが遅れる理由
そもそもモバイルデバイスでクリックイベントが遅れる理由ですが、画面を触るという点について意味が被る「クリック」と「タッチ」を区別するためなんでしょう。
よくよく考えたら「そりゃそうだ」と合点しました。
スマホ自体を持っていないので、そういうイメージそのものを、これまで考えつかなかったです。
やっぱり一つぐらいタッチデバイスを持ってたほうがいいのかなあと、改めて思いました。
デフォルトのジェスチャー判定を抑止
ちなみにソースを覗いて気になったのは、touchendの発生時、対象がAタグとかBUTTONタグなら、デフォルトのtouchendイベントの発火を抑制してる箇所です。
これはおそらく、モバイルブラウザで表示されるAとかBUTTONタグには、デフォルトで同じような「クリックみなし」のジェスチャー判定が、すでにバインドされているからなんだと思います。
なので、ダブル発火を防ぐためにpreventDefaultしている、と。なるほど〜!
なんにせよ、backbone.jsを使ってクリックを扱うロジックを「click」で統一させたいなら、backbone.touch.jsを読み込むだけで勝手に置き換えてくれるのは便利です。
実際シミュレーター経由で試したら、ちゃんとクリックが高速反応してて感動しました。