2009-09-02 166 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

您可以通過執行

arguments.callee(....); 

更多信息,請參見here作出對匿名函數的遞歸調用。

+0

是否有可能獲得完整的樣本?我還沒有能夠做到這一點,但... – krdluzni 2009-09-02 17:06:43

+0

鏈接的網站有一個創建匿名遞歸階乘函數的例子。 – jimr 2009-09-02 17:39:50

+1

agruments.callee已棄用。請參閱http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript – 2013-08-16 11:43:41

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

從JavaScript 1.2開始,你可以使用arguments.callee(...)以實現遞歸調用一個匿名函數

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

代碼放在一個jQuery插件格式,並調用自身例如...

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

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

將您想要的代碼插入註釋所在的位置。

4

最常見的答案已經過時。目前(2012年8月)被調用者至少在Firefox中被棄用。使用被調用者已過期。目前(2012年8月),被叫爲「......由ECMA-262已過時。」(見discussion

有你碰到兩個問題:

  1. 函數處理器將只通過事件目的。
  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 
}); 

注:這是因爲當你必須附加和分離處理程序,以防止inifinite環路像DOMSubtreeModified特別有用。

$('.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); 
});