2011-12-12 97 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

您需要元素標記(如您所指出的那樣),但您必須通過構造函數傳遞它 –