2014-01-08 14 views
0

這和我們預期的一樣,但我不喜歡。爲什麼jQuery中的回調必須是自主的?

$('#login-form').on('submit', function(event){ 
    event.preventDefault(); 
    init.login(); 
}); 

var init = { 
    login: function() { 
    // do login stuff 
    } 
}; 

這是我想要的,但它不起作用。

$('#login-form').on('submit', init.login(event)); 

var init = { 
    login: function(event) { 
    event.preventDefault(); 
    // do login stuff 
    } 
}; 

爲什麼?

+0

它給了什麼錯誤?我認爲你可以通過這個功能,但是你做錯了。 –

+0

可能的重複[爲什麼我的點擊功能不能按預期工作?](http://stackoverflow.com/questions/13857225/why-is-my-click-function-not-working-as-expected)和其他許多人 – Bergi

+0

@Bergi可能。我讀過它,但沒有得到它。 –

回答

8

它將工作,你調用該函數(給定爲回調值將是函數的結果),而不是把它當作一個值

$('#login-form').on('submit', init.login); 
+0

你太快了:) – Satpal

+1

+1,但另外要注意的是,如果在'init.login'中,你要使用'this'來引用'init'的其他屬性,那麼你需要添加一個(''submit',init.login.bind(ini​​t));' –

+0

謝謝!我想我明白了。我得到了「調用函數」和「顯示函數的結果」混合起來。但是,我如何保留事件對象?我需要做preventDefault嗎?是否有第三個parimeter(布爾設置爲false)我可以使用?或者是否返回false? –

5

init.login(event)調用功能init.login ,將(不存在的)變量event傳遞給它。如果你想通過函數本身的回調,不叫它:

$('#login-form').on('submit', init.login); 

你將有你通過它之前,雖然,在這一點上init.loginundefined聲明該功能。

+0

所以事件對象只能在匿名函數中使用? –

+0

當'.on'調用回調函數時,它會傳遞一個參數。 '.on'被定義爲這樣:'function on(event,callback){... callback('foo'); ''。它將您的回調作爲參數,然後調用您的回調函數,並將其傳遞給參數。你的回調在它調用'event'的參數中接收到這個值。你可以調用這個參數任何你想要的。是的,當''on'調用它時顯然只在回調中可用。 – deceze

+0

謝謝你的細節。有點棘手。得讀這個。 –

4

您已經在調用該行中的函數(使用undefined,目前還沒有event)。你需要傳遞函數本身(而不是它的結果):

$('#login-form').on('submit', init.login); 

注意init.login仍然是一個匿名函數,它沒有名字:-)另外注意,該方法被調用this是登錄表單元素,而不是init對象。如果你需要的話,你會使用.on('submit', init.login.bind(init))

+0

那麼如何訪問事件對象? –

+0

@KarlPokus:它應該是'init.login'函數的參數,即''登錄:函數(事件){*登錄的東西*/ } }' – Bergi

+0

是的。得到它了。很棒。謝謝! –

相關問題