1

我在使用 Backbone.js 应用程序时遇到了一个奇怪的问题。在我的主视图中,我想捕获视图上发生的所有输入事件并将它们路由到输入处理程序方法。我在视图中还有一些链接可以导航到应用程序的其他部分。相关(CoffeeScript)代码:

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

事件处理在桌面 Safari 中按预期工作。当我单击“退出”链接时,“onAction_ _ ”方法会触发,然后会调用“退出”方法。但是,在 Mobile Safari 上,不会调用“退出”方法。如果我修改触摸事件选择器以仅响应视图中的较小区域(即不与链接重叠的元素),那么它会按预期工作。(通过用户输入触发的所有方法都有 preventDefault() 调用,但这不应该阻止事件冒泡。)这是一个已知的 Mobile Safari 问题吗?

4

1 回答 1

1

好吧,我最终将“事件”对象变成了一个函数,并进行了基本的浏览器嗅探以检测带有触摸屏的平台。变成'click a.quit': 'quit''mouseup a.quit': 'quit'正确调用,即使 Safari 文档说

如果用户点击一个可点击元素,事件按以下顺序到达: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 回答