2011-12-12 80 views
1

我在一个Spine.js控制器CoffeeScript中定义的事件,像这样:停止超链接事件在Spine.js

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

    constructor: (params) -> 
     super 

    update: (e) -> 
     dosomething() 
     false 

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

我试过e.preventDefault(),e.​​stopPropagation(),并返回false无济于事。 事件似乎是正确的形成,当前目标是#update链接,所以我想知道它是否是Spine处理事件的唯一方式(我在Backbone.js中没有这个问题)

+0

你有没有在* dosomething()之前尝试'e.preventDefault()'*?如果它抛出一个错误,你可能永远不会得到回报。 –

+0

是的,我试过'e.preventDefault()'和'e.stopPropagation'作为更新方法没有任何运气的第一件事。 – djlumley

+0

即使我除了尝试停止事件之外没有在更新方法中执行其他任何操作,我仍会将其指向新页面。 控制台日志显示每次都会调用更新方法。 – djlumley

回答

0

在脊柱的touch.coffee下面的代码是什么已导致此错误:

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

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

我能找到的唯一解决方案是根本不使用tap事件,并且使用click - 即使是移动浏览器。

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

1

events必须与el一起工作,但我没有找到你el的定义。

试试这个:

class Charter extends Spine.Controller 
    el: 'body' 

    events: 
     'tap #update': 'update' 

    constructor: (params) -> 
     super 

    update: (e) -> 
     dosomething() 
     false 
+2

您通过'el'实例化构造函数:''新的Charter {el:'#ccc'}',http://spinejs.com/docs/controllers –

+0

我通过构造函数传递它。 此外,如果您不分配现有的el,它将使用提供的标签和类(默认为div)创建一个新的。 – djlumley

+0

您需要元素标记(如您所指出的那样),但您必须通过构造函数传递它 –