2010-05-04 3 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 + "();"); 

Любой лучший способ достичь этого без использования eval? Я не очень большой поклонник использования eval, если это абсолютно необходимо.Вызов функции на основе строки, которая содержит имя функции

ответ

4

В именах функций, хранящихся в foo1 и foo2 являются свойством объекта, возвращаемым $('.cls1'), следует использовать следующее:

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

То же самое с foo2.

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

Вам не нужно использовать eval, вы можете просто использовать кронштейн обозначение property accessor:

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

Вы можете использовать синтаксис:

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

Однако другой подход к динамически вызова метода является создание нового метода, который deligates

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

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

Это позволит вам быстро контролировать то, что происходит вместо того, чтобы передавать что-либо как foo1.

1

Вы можете использовать эту стратегию, чтобы соответствовать вашим потребностям:

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

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

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

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

// callSomething('fadeIn'); => alerts 'fadeIn' 
Смежные вопросы