2009-09-02 18 views
6

Come posso chiamare una funzione dall'interno della funzione, in modo che diventi ricorsiva? Ecco il mio codice, ho aggiunto un commento in cui mi piacerebbe avviare la ricorsione:Funzione ricorsiva 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; 
}); 

risposta

10

È possibile effettuare una chiamata ricorsiva a una funzione anonima facendo

arguments.callee(....); 

Vedi here per maggiori informazioni.

+0

Sarebbe possibile ottenere un campione completo? Non sono ancora riuscito a farlo funzionare ... – krdluzni

+0

Il sito collegato ha un esempio di creazione di una funzione fattoriale ricorsiva anonima. – jimr

+1

agruments.callee è stato dichiarato obsoleto. vedi http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript –

3

Qualcosa del genere dovrebbe fare il trucco, ma ci deve essere un modo migliore per configurarlo:

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

da JavaScript 1.2 in poi è possibile utilizzare arguments.callee(...) per effettuare una chiamata ricorsiva a una funzione anonima

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

inserire il codice in un formato plug-in jQuery e si chiamare per esempio ...

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

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

Inserisci il codice desiderato dove si trova il commento.

4

La risposta superiore non è aggiornata. Attualmente (agosto 2012) il callee è deprecato almeno in Firefox. L'utilizzo di callee non è aggiornato. Attualmente (ago 2012) callee è "... deprecata da ECMA-262." (Vedi discussion)

Ci sono due problemi in esecuzione in:

  1. il gestore di funzione verrà passato solo l'evento oggetto.
  2. la funzione non si chiama, quindi non è possibile fare riferimento ad esso per la ricorsione

Soluzione 2:

Questo è il più facile dei due. In genere, il motivo dell'utilizzo di funzioni anonime è quello di mantenere pulito lo spazio dei nomi. Le parentesi definiscono uno spazio dei nomi locale, quindi dopo aver assegnato alla funzione un nome non sarà accessibile al di fuori delle parentesi. Di seguito lavorerà per voi:

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

Soluzione 1:

Questo è un po 'più difficile. Poiché l'unica cosa trasmessa alla funzione è l'oggetto evento, dovrai estenderlo per passare i valori. Fortunatamente, jQuery ha un sistema just for this!

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

Nota: questo è particolarmente utile quando si deve attaccare e staccare un gestore per evitare loop Inifinite come con 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); 
}); 
Problemi correlati