2009-09-02 29 views
6

¿Cómo puedo llamar a una función desde dentro de la función, por lo que se vuelve recursiva? Aquí está mi código, he añadido un comentario donde me gustaría empezar la recursión:¿Función recursiva de 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; 
}); 

Respuesta

10

se puede hacer una llamada recursiva a una función anónima haciendo

arguments.callee(....); 

Ver here para obtener más información.

+0

¿Sería posible obtener una muestra completa? No he podido hacer que esto funcione, aún ... – krdluzni

+0

El sitio vinculado tiene un ejemplo de creación de una función factorial recursiva anónima. – jimr

+1

agruments.callee estaba en desuso. ver http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript –

3

Algo de este tipo debe hacer el truco, pero debe haber una manera más agradable para 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

desde JavaScript 1.2 en adelante se puede utilizar arguments.callee(...) para efectuar una llamada recursiva a una función anónima

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

Ponga su código en un formato plugin de jQuery y llamarse por ejemplo ...

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

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

Inserta tu código deseado donde está el comentario.

4

La respuesta principal está desactualizada. Actualmente (agosto de 2012) callee está obsoleto al menos en Firefox. Usar callee está desactualizado. Actualmente (agosto de 2012) es destinatario de la llamada "... desaprobado por ECMA-262." (Ver discussion)

Hay dos problemas que se están ejecutando en:

  1. sólo se pasa al controlador de función del evento objeto.
  2. la función no se nombra, por lo que no puede hacer referencia a ella por la recursividad

Solución 2:

Este es el más fácil de los dos. Normalmente, la razón para usar funciones anónimas es mantener un espacio de nombres limpio. Los paréntesis definen un espacio de nombre local, por lo tanto, después de darle un nombre a la función, no será accesible fuera de los paréntesis. El siguiente trabajo para usted:

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

Solución 1:

Esto es un poco más difícil. Como lo único que se le pasa a la función es el objeto de evento que necesitará extender para pasar los valores. Afortunadamente, resulta que jQuery tiene 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: esto es especialmente útil para cuando se debe conectar y desconectar un controlador para evitar bucles Inifinite como 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); 
}); 
Cuestiones relacionadas