2011-05-18 6 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

+0

それは、私はあなたがここに持っている正確なコードを試してみました、奇妙です。私が作ったフォームで、submitStart()を実行して実行します – XGreen

答えて

4

thisの値が失われているため、submitStartが呼び出される可能性がありますが、正しく動作しません。あなたが機能インスタンス上で使用可能です.call()方法、経由submitStartメソッドを呼び出している。ここ

function validateRegister(){ 

    submitStart.call(this); 

} 

はこれを行います。

.call()メソッドを使用すると、呼び出す関数の値を手動でthisに設定できます。

validateRegisterをハンドラとして割り当てたので、jQueryはthisの値があなたの要素であることを確認します。しかし、validateRegisterは別の関数を呼び出しているので、関数が適切なthisの値を持っていることを確認する責任があります。あなたが手動で何か他のものにそれを設定しない限り

someFunction(); 

が...その関数内 thisの値は、 window次のようになります。


はちょうどあなたがこのような任意の関数を呼び出すときがあることに注意してください。

+0

これは機能します!本当にありがとう。 ;) – Sawyer

+0

@Sawyer:私は助けてよかった。 – user113716

0

var $this = $(this);がウィンドウを戻しています。

0

問題はthisです。 validateRegisterをイベントハンドラとして使用すると、jQueryは自動的にthisがイベントをディスパッチしたDOM要素を参照するようにします。しかし、別の関数を呼び出すとスコープが正しく設定されていないので、thiswindowオブジェクトを参照している可能性があります(これはグローバルスコープのthisを参照するときのデフォルトです)。それを修正するには、最も簡単な方法は、引数として沿って要素を渡すために、次のようになります。@Andrewが指摘したように

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); 
} 

は、あなたもsubmitStart機能のthe .apply() methodを使用することによりsubmitStartthisの値を設定することができます。

0

thisは、クリックされた要素を参照しなくなりましたが、代わりにwindowとなります。 submitStartを変更してパラメータを受け入れ、thisを渡すことができます。

0

thisさんとは違うと思うかもしれません。

これを試してみてください:

submitStart.call(this)

関連する問題