2009-09-02 15 views
6

Jak mogę wywołać funkcję z wnętrza funkcji, aby stała się rekurencyjna? Tu jest mój kod, dodałem komentarz gdzie chciałbym rozpocząć rekurencji:Funkcja rekurencyjna 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; 
}); 

Odpowiedz

10

można zrobić rekurencyjne wywołanie funkcji anonimowej wykonując

arguments.callee(....); 

Zobacz here aby uzyskać więcej informacji.

+0

Czy można uzyskać kompletną próbkę? Nie udało mi się wykonać tej pracy, ale ... – krdluzni

+0

Strona, do której prowadzi link, ma przykład tworzenia anonimowej funkcji rekurencyjnego silni. – jimr

+1

agruments.callee został przestarzały. zobacz http://stackoverflow.com/questions/103598/why-was-targuments-callee-caller-property-deprecated-in-javascript –

3

coś z tego rodzaju powinno załatwić sprawę, ale nie powinien być ładniejszy sposób, aby ustawić:

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

Od JavaScript 1.2 roku można użyć arguments.callee(...) do spowodowania rekurencyjne wywołanie funkcji anonimowej

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

Umieść swój kod w formacie wtyczki jQuery i nazywać się na przykład ...

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

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

Wprowadź żądany kod w miejscu komentarza.

4

Najlepsza odpowiedź jest nieaktualna. Obecnie (sierpień 2012) callee jest przestarzałe przynajmniej w Firefoxie. Program callee jest nieaktualny. Obecnie (sie 2012) wywoływany jest „... niezalecane przez ECMA-262.” (Patrz discussion)

Istnieją dwa problemy używasz do:

  1. handler funkcja zostanie przekazany tylko wydarzenie obiekt.
  2. funkcja nie jest nazwana, więc nie można się do niego dla rekursji

rozwiązanie dla 2 osób:

Jest to łatwiejsze z dwóch. Zazwyczaj powodem używania anonimowych funkcji jest utrzymywanie przestrzeni nazw w czystości. Nawiasy definiują lokalny obszar nazw, więc po nadaniu funkcji nazwa nie będzie dostępna poza nawiasami. Następujące będzie pracować dla Ciebie:

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

Roztwór do 1:

To jest trochę trudniejsze. Ponieważ jedyną rzeczą przekazaną do funkcji jest obiekt zdarzenia, który trzeba rozszerzyć, aby przekazać wartości. Na szczęście okazuje się, że jQuery ma system just for this!

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

Uwaga: jest to szczególnie przydatne, gdy trzeba podłączyć i odłączyć obsługi, aby zapobiec inifinite pętle jak z 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); 
}); 
Powiązane problemy