2010-05-04 22 views
7
var foo1,foo2; 

switch (fn) 
{ 
    case "fade" : foo1 = "fadeOut"; foo2 = "fadeIn"; break;     
    case "slide" : foo1 = "slideUp"; foo2 = "slideDown"; break; 
} 

eval("$('.cls1')." + foo1 + "();"); 
currentSlideIndex = currentSlideIndex + n; 
eval("$('.cls1')." + foo2 + "();"); 

¿Alguna mejor manera de lograr esto sin usar eval? No soy un gran admirador de usar eval a menos que sea absolutamente necesario.Llamar a una función basada en una cadena que contiene el nombre de la función

Respuesta

4

Como los nombres de las funciones almacenadas en foo1 y foo2 son propiedades del objeto devuelto por $('.cls1'), la siguiente debería funcionar:

$('.cls1')[foo1](); 

mismo con foo2.

4
$('.cls1')[foo1](); 
currentSlideIndex = currentSlideIndex + n; 
$('.cls1')[foo2](); 
4

No es necesario utilizar eval, sólo tiene que utilizar la notación de corchetes property accessor:

$('.cls1')[foo1](); 
1

Puede utilizar la sintaxis:

$('selector')[foo1](); 

Sin embargo, otro enfoque para llamar de forma dinámica el método es la creación de un nuevo método, que deligates

(function() { 
    $.fn.someFunc = function(what) 
    { 
    switch(what) { 
     case 'fadeOut': 
     $(this).fadeOut(); 
     break; 
     // etc 
     default: 
     // handle an unknown value 
    } 
    } 
})(jQuery); 

$('.cls1').someFunc('fadeOut'); 

Esto le permitirá controlar rápidamente lo que sucede en lugar de pasar algo como foo1.

1

Puede utilizar esta estrategia para adaptarse a sus necesidades:

function doFade() { 
    alert('fade'); 
} 

function doFadeIn() { 
    alert('fadeIn'); 
} 

var fns = { 
    'fade': doFade 
    , 'fadeIn', doFadeIn 
}; 

function callSomething(what) { 
    fns[what](); 
} 

// callSomething('fadeIn'); => alerts 'fadeIn' 
Cuestiones relacionadas