【问题标题】:Stop Hyperlink Event in Spine.js在 Spine.js 中停止超链接事件
【发布时间】:2011-12-20 13:02:46
【问题描述】:

我在 Spine.js 控制器中定义了一个事件,就像在 CoffeeScript 中一样:

class Charter extends Spine.Controller
    events:
        'tap    #update':   'update'

    constructor: (params) ->
        super

    update: (e) ->
        dosomething()
        false

当点击#update链接时,更新函数被调用,但链接也被激活并将浏览器指向该URL。

我试过 e.preventDefault()、e.stopPropagation(),返回 false 无济于事。 该事件似乎已正确形成,currentTarget 是#update 链接,所以我想知道它是否是 Spine 处理事件的方式所独有的(我在 Backbone.js 中对此没有任何问题)

【问题讨论】:

  • 你试过e.preventDefault() 之前 dosomething()吗?如果它抛出错误,您可能永远无法返回。
  • 是的,我已经尝试了e.preventDefault() 和e.stopPropagation,因为更新方法没有任何运气。
  • 即使我在更新方法中除了尝试停止事件之外没有做任何其他事情,我仍然会被引导到新页面。控制台日志显示每次都会调用更新方法。
  • 在这个测试中:tinkerbin.com/1j5RMnu1 工作正常(使用click,tap 不会在点击时触发)。您能否提供您的代码的(非)工作示例?
  • 我在移动设备上测试了该应用程序,本应引导浏览器的正常超链接无法正常工作。我查看了包含的库,它看起来像 Spine.js 的触摸模块阻止了触摸设备主体上的点击事件,但捕获了非触摸设备主体上的点击事件以触发它自己的点击事件.

标签: javascript coffeescript spine.js


【解决方案1】:

events 必须和el 一起使用,但是我没有找到你el 的定义。

试试这个:

class Charter extends Spine.Controller
    el: 'body'

    events:
        'tap    #update':   'update'

    constructor: (params) ->
        super

    update: (e) ->
        dosomething()
        false

【讨论】:

  • 您在实例化时将el 传递给构造函数:new Charter { el: '#ccc' }, spinejs.com/docs/controllers
  • 我通过构造函数传递它。此外,如果您不分配现有的 el,它会使用提供的标签和类(默认为 div)创建一个新的。
  • 你需要元素标签(正如你所指出的),但你必须通过构造函数传递它
【解决方案2】:

在书脊的 touch.coffee 中,以下代码是导致此错误的原因:

if $.support.touch
  $('body').bind 'click', (e) -> 
    e.preventDefault()
else
  $ -> 
    $('body').bind 'click', (e) -> 
      $(e.target).trigger('tap')

移动设备没有收到任何会触发hyperlinks 的click 事件,或在点击本机表单提交(iOS 键盘上的go)时提交事件。

我能找到的唯一解决方案是根本不使用 tap 事件,而使用 click - 即使对于移动浏览器也是如此。

显然这不是最优的,我渴望更好的解决方案。

【讨论】:

    猜你喜欢
    • 2013-05-05
    • 2012-11-28
    • 2019-10-21
    • 2020-02-27
    • 2021-12-06
    • 2012-10-14
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    相关资源
    最近更新 更多