2011-05-18 43 views
2

我遇到了一個我正在調用的函數(使用jQuery)的問題。 我的問題是,當我嘗試在另一個函數內調用函數時,第一個函數沒有被調用。但是,當我將失敗函數的內容放入一個調用所述失敗函數的代碼中時,代碼執行得很好。我會告訴你什麼是我說的是:爲什麼加載函數的內容,而不是函數調用時的內容?

$('form.register .submit').click(validateRegister); 

function submitStart() { 

    var $this = $(this); 
    $this.parent().addClass('processing'); 

    var $processing = $('#processing'); 
    $processing.show(); 

    var $endNote = $this.parent().find('#endNote') 
    $endNote.slideDown(); 

} 

function validateRegister(){ 

    submitStart(); 

} 

看,當submitStart()的內容放置到validateRegister(),它們的代碼執行。但是,在調用此代碼中顯示的函數時,它無法工作。我認爲範圍(至少據我所知)無濟於事。

任何幫助非常感謝,謝謝!

+0

你試過'$( 'form.register .submit')點擊(submitStart);' – ariel 2011-05-18 23:23:49

+0

這很奇怪,我想你在這裏有確切的代碼。我做的形式,它的工作原理和執行submitStart() – XGreen 2011-05-18 23:27:00

回答

4

您正在失去預期的this值,因此submitStart可能會被調用,但無法正常工作。

這樣做:

function validateRegister(){ 

    submitStart.call(this); 

} 

在這裏,我們呼籲通過.call()方法,它可以用函數實例submitStart方法。

.call()方法可讓您在要調用的函數中手動設置值this

因此,因爲您已將validateRegister作爲處理程序,因此jQuery確保this的值是您的元素。但由於validateRegister正在調用另一個函數,因此它有責任確保該函數具有適當的this值。


請記住,當你調用任何像這樣的功能:

someFunction(); 

...的this在該函數的值將是window,除非你手動將它設置爲別的東西。

+0

這個工程!非常感謝。 ;) – Sawyer 2011-05-19 00:24:07

+0

@Sawyer:很高興我能幫上忙。 – user113716 2011-05-19 01:41:26

0

var $this = $(this);正在返回窗口。

0

這裏的問題是this。當您使用validateRegister作爲事件處理程序時,jQuery會自動確保this引用分派事件的DOM元素。但是當你調用你的獨立函數時,示波器沒有被正確設置,所以this可能是指window對象(當你在全局範圍內引用this時,這是默認的)。爲了解決這個問題,最簡單的方法是將元素一起作爲參數傳遞:

function submitStart(element) { 

    var $this = $(element); 
    $this.parent().addClass('processing'); 

    var $processing = $('#processing'); 
    $processing.show(); 

    var $endNote = $this.parent().find('#endNote') 
    $endNote.slideDown(); 

} 

function validateRegister(){ 
    // "this" is the DOM element 
    submitStart(this); 
} 

由於@Andrew指出的,還可以通過使用submitStart功能the .apply() method設置this值在submitStart

0

this將不再引用被單擊的元素,而代表window。您可以更改submitStart,以便它接受參數並將this傳遞給它。

0

我想你可能有問題this不是你所想的那樣。

試試這個:

submitStart.call(this)

相關問題