2009-09-02 31 views
6

関数内から関数を呼び出すことができますが、再帰的になりますか?トリックを行う必要があり、この種のJQuery再帰関数?

$('a.previous-photos, a.next-photos').click(function() { 
    var id = $('#media-photo img').attr('id'); 
    var href = $(this).attr('href'); 
    href = href.split('/'); 
    var p = href[href.length - 1]; 
    var url = '/view/album-photos/id/' + id + '/p/' + p; 

    $.get(url, function(data) { 
     $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>'); 
    }); 

    // here I want to call the function again 

    return false; 
}); 

答えて

10

あなたはより多くの情報を参照してくださいhere

arguments.callee(....); 

を行うことにより、匿名関数への再帰呼び出しを行うことができます。 Javascriptを1.2から

+0

完全なサンプルを得ることは可能でしょうか?私はまだこの作業を行うことができませんでした... – krdluzni

+0

リンクされたサイトには、匿名の再帰的階乗関数を作成する例があります。 – jimr

+1

agruments.calleeは推奨されませんでした。 http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript –

3

何かが、そこはそれを設定するためのよりよい方法であるべきだ:

をここに私のコード、私は再帰を開始したいコメントを追加しています
function myfunc() { 
    var id = $('#media-photo img').attr('id'); 
    var href = $(this).attr('href'); 
    href = href.split('/'); 
    var p = href[href.length - 1]; 
    var url = '/view/album-photos/id/' + id + '/p/' + p; 

    $.get(url, function(data) { 
     $('.box-content2').replaceWith('<div class="box-content2"' + data + '</div>'); 
    }); 

    if(!cond){//you need a condition, or it'll recurse indefinitely. 
     myfunc(); 
    } 

    return false; 
} 

$('a.previous-photos, a.next-photos').click(function(){myfunc();}); 
1

以降匿名関数の再帰呼び出し

// here I want to call the function again 
arguments.callee(); 
1

jQueryプラグイン形式であなたのコードを入れて、例えば自分自身を呼び出すを達成するためにarguments.callee(...)を使用することができます...

(function($) { 
$.fn.togglethis = function() { 
    $(this).animate({opacity:"1.0"}, 1000, function() { 
     /* Code Here */ 
     return $(this); 
    }); 

} 
})(jQuery); 
$(document).ready(function() { 
    $("#togglethis").togglethis(); 
}); 

コメントがある場所に希望するコードを挿入します。

4

トップの回答は古くなっています。現在(2012年8月)calleeは少なくともFirefoxでは推奨されていません。現在(2012年8月)呼び出し先がある「... ECMA-262で非推奨。」(discussionを参照してください)

あなたがに実行されている2つの問題があります。

  1. 関数ハンドラが唯一のイベント渡されますオブジェクト。
  2. あなたは2のための再帰

ソリューションのためにそれを参照することができませんので、関数は、名前が付いていない:これは、2つの簡単です

。通常、匿名関数を使用する理由は、名前空間をきれいに保つことです。括弧はローカル名前空間を定義するので、関数に名前を与えた後はカッコの外側ではアクセスできません。以下は、あなたのために動作します:

$('.someclass').onClick(function dosomething(){ 
    ... your code ... 
    dosomething() //again 
}); 
dosomething() // will cause scope error, function not defined 

ソリューション1のために:

これは少し難しくなります。関数に渡されるのはイベントオブジェクトだけなので、値を渡すためにはそれを拡張する必要があります。幸いにも、jQueryにはシステムがあります。just for this

$('.someclass').on('click', {myvar: 0}, function dosomething(event){ 
    ... your code ... 
    event.data.myvar = event.data.myvar + 1; 
    dosomething(event) //again 
}); 

注:これはあなたがDOMSubtreeModifiedと同様inifiniteループを防止するためのハンドラを着脱しなければならないときに特に便利です。

$('.someclass').on('DOMSubtreeModified.mynamespace', {myvar: 0}, function myfunc(event){ 
    $(this).off('DOMSubtreeModified.mynamespace'); 
    ... Some Code that changes .someclass subtree ... 
    event.data.myvar = event.data.myvar + 1; 
    $(this).on('DOMSubtreeModified.mynamespace', {myvar: event.data.myvar}, myfunc); 
});