2010-05-04 105 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' 
相關問題