1

Backbone.js アプリで奇妙な問題が発生しています。私のメイン ビューでは、ビューで発生するすべての入力イベントをキャプチャし、それらを入力ハンドラー メソッドにルーティングしたいと考えています。ビューには、アプリの他の部分に移動するためのリンクもいくつかあります。関連する (CoffeeScript) コード:

events:
    'click a.quit': 'quit'
    'mousedown': 'onActionStart'
    'mouseup': 'onActionEnd'
    'touchstart': 'onActionStart'
    'touchmove': 'onActionMove'
    'touchend': 'onActionEnd'

イベント処理は、デスクトップ Safari で期待どおりに機能します。「quit」リンクをクリックすると、「onAction_ _」メソッドが起動し、「quit」メソッドが呼び出されます。ただし、Mobile Safari では、「quit」メソッドは呼び出されません。タッチ イベント セレクターを変更して、ビュー内の小さな領域 (つまり、リンクと重なっていない要素) にのみ応答するようにすると、期待どおりに機能します。(ユーザー入力によってトリガーされるすべてのメソッドには preventDefault() 呼び出しが含まれていますが、それによってイベントのバブリングが停止することはありません。) これは Mobile Safari の既知の問題ですか?

4

1 に答える 1

1

最終的に、「イベント」オブジェクトを関数に変換し、基本的なブラウザー スニッフィングを実行して、タッチスクリーンを備えたプラットフォームを検出しました。Safariのドキュメントに記載'click a.quit': 'quit'され'mouseup a.quit': 'quit'ていても、正しく呼び出される

ユーザーがクリック可能な要素をタップすると、イベントは次の順序で到着します: mouseover、mousemove、mousedown、mouseup、click

これが私の結果です:

    events: ->
        # Determine whether touchscreen or desktop
        agent = navigator.userAgent.toLowerCase()
        if agent.match(/ip(hone|od|ad)/i) or agent.match(/android/i)
            events = 
                'touchend a.quit': 'quit'
                'touchend a.reset': 'reset'
                'touchstart': 'onActionStart'
                'touchmove': 'onActionMove'
                'touchend': 'onActionEnd'
                'onscroll': 'preventDefault'
                'gesturestart': 'preventDefault'
                'gesturechange': 'preventDefault'
                'gestureend': 'preventDefault'
        else 
            events = 
                'click a.quit': 'quit'
                'click a.reset': 'reset'
                'mousedown': 'onActionStart'
                'mouseup': 'onActionEnd'
于 2012-05-23T09:22:15.853 に答える