LoginSignup
9
9

More than 5 years have passed since last update.

Mithril.jsでタップイベント(fastclick)を使う(Paw.js使用)

Last updated at Posted at 2015-05-02

Mithril.jsとタップ

高速で、生のオブジェクトを使う感じで扱いやすいMithril.jsですが、標準だとタップ(fastclick)は使えず、onclickのみです。

タップその他のイベントを扱うコミュニティ製のコンポーネントもあるのですが、スワイプなどもサポートする関係上、妙に遅い。

なので、高速で素晴らしいPaw.js(damelon様作)というライブラリを使わせていただき、やってみました。
試してないですが、Hammer.jsなどでも同じ要領でできるのではないかと。

コード

CoffeeScriptです。

new Paw(document.body)

tapRoute = (element, isInitialized, context) ->

  routeHook = (e) ->
    `var e`
    e = e or event

    # デフォルトのイベントを抑制
    if e.preventDefault
      e.preventDefault()

    # ここにページ遷移前の処理(たとえばアニメーションなど)を入れられます

    # 相対URLの取得
    # FIXME : このままだと /path 形式のパスしか使えないので必要ならば修正
    currentTarget = e.currentTarget or e.srcElement
    href = currentTarget.getAttribute('href')
    if href[0] != '/'
      href = '/' + href

    # Mithril Router
    m.route(href)
    return

  if !isInitialized
    # tapイベントハンドラを登録
    if element.addEventListener
      element.removeEventListener('tap', routeHook)
      element.addEventListener('tap', routeHook)
    else
      element.detachEvent('ontap', routeHook)
      element.attachEvent('ontap', routeHook)

  # 追記 unload時にtapイベントハンドラを削除
  context.onunload = () ->
    if element.addEventListener
      element.removeEventListener('tap', routeHook)
    else
      element.detachEvent('tap', routeHook)

  return

 # aタグでのリンクの場合
 # configにrouteTapを指定する
 m.render(document.body, [
    m('a', {
        href: '/path/' 
        config: routeTap
        }, 
        'リンク')
 ])
9
9
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9