2012-10-31 74 views
0

我有函數調用javascript可以動態構建一個函數名稱來調用?

BeforeSlide1() { 
... 
} 


BeforeSlide2() { 
... 
} 

而且我希望能夠建立調用這些動態在一個循環中,這樣的事情:

 code = "BeforeSlide" + slide + "()" 
     eval(code); 

現在我的這個代碼顯然沒有按」工作(如果只是這麼簡單!)任何人都知道?

好吧,我會畫出大圖。

我有一個幻燈片通過運行一個簡單的腳本

function slideshow(slide) { 
      if (pauseTimes[slide]>0) { 
        /* if there is another slide after the one currently showing... */ 

       //Call BeforeSlide-function if there is one 
       code = "BeforeSlide" + slide + "();" 
       try { 
        eval(code);     

       } catch(e) { 
        /* do nothing since many slides don't have one */ 
       }   
       $('#slide'+slide). 
       fadeIn(1500,function(){}). 
       delay(pauseTimes[slide]). 
       fadeOut(1500,function(){slideshow(slide+1);}); 
       ; 
      } 
      else { 
        /* if there is no more slide and we've reached the end, try to ajax-refresh the slideshow contents */ 
       ajaxUpdate(); 
      } 
      } 

在自己的前和afterfunctions是這樣定義幻燈片的HTML:

/* fire the slideshow from slide 1 once document is finished loading */ 
    $(document).ready(function(){ 
     slideshow(1); 
    }); 

    </script> 

    </HEAD> 

    <body id="slideshow_body"> 

    <script id='pauseTimesScript' type='text/javascript'> 
    /* Define pauseTimes (array holding duration of each slide) */ 
    try { 
      pauseTimes=null; 
      pauseTimes=undefined; 
      pauseTimes = new Array(); 
      setPauseTimes();   
      /*alert('satte först till null, deklarerade sedan om.');*/ 
    } catch(e) { 
      pauseTimes = new Array(); 
      setPauseTimes();   
      /*alert('deklarerade utan att först sätta null.');*/ 
    } 

    function setPauseTimes() { 

     pauseTimes[1]=2000;   

     pauseTimes[2]=2000;   

     pauseTimes[3]=2000;   

    } 
    </script> 

    <div id="avbrott">Tillfälligt avbrott, visar cachelagrat innehåll sedan 2012-10-31 16:37:35</div> 

    <div id="canvas" style="width:1072px;height:732px;"> 

       <script language='text/javascript'> 
       function BeforeSlide1(order=1) { 
       alert('here goes slide '+order); 

       } 
       </script> 
         <div id="slide1" class="slide" style="z-index:1;"> 



    <div id="slide_bg" style="float:left;height:100%;width:100%;background-color:#ffffff;background-image:url('http://bglabs.evade.netdna-cdn.com/45875kli90/505.jpg');"> 

     <div style="background-color:#eeeeee;color:#000000;float:right;text-align:center;margin-top:30px;padding:10px;font-weight:bold;font-size:30pt;" id="preview_title">Egypt rocks!</div> 
     <div style="clear:both;float:none;"></div> 

     <p style="color:#000000;margin:10px 10px 0 20px;font-style:italic;font-size:38pt;" id="preview_data_6">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse feugiat pharetra eros, vitae ullamcorper tellus condimentum sit amet. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse in leo erat. Aliquam interdum molestie tortor, nec lacinia mauris viverra eget. Suspendisse aliquam tempor scelerisque. Proin vel purus nunc. Pellentesque ut sapien libero.<br /> 
    </p> 

    </div> 

這個BeforeSlide的目的功能當然是做其他的東西,而不是產生警報...

請讓我知道我應該如何構建一個更好的方式! =)

+1

如果你需要寫這樣的代碼,你幾乎可以肯定做錯了什麼。 – Blazemonger

+3

這可以做到,但如果你解釋真正的問題,可能有更好的解決方法。 – jfriend00

回答

2

不要使用eval!通過window可以獲得所聲明的每個函數。試試這個:

function test() { 
    alert("test"); 
} 

var x = window['test']; 
x(); 

Example fiddle

然而,這將是更符合邏輯有一個單一的功能,並傳遞整數作爲參數了這一點。

+0

不能這樣做,因爲幻燈片是由不同的「模板」幻燈片組成的,一些模板將在功能之前有一些將不會,並且它們與幻燈片一起被渲染... –

+0

它可以在小提琴,但是當我在我的代碼中執行它時,出現控制檯錯誤「Uncaught TypeError:undefined不是函數」(我將該調用移出try塊以查看會發生什麼) –

+0

試圖在小提琴中嘗試你的方式,無法獲取它去工作http://jsfiddle.net/eZK4j/ –

0
var code = "this.f = BeforeSlide" + slide + "() {...}"; 
eval(code); 
1

我可能會創建一個類似如下的對象,

var myFunc = { 
    BeforeSlide1: function() { 
     //some stuff 
    }, 
    BeforeSlide2: function() { 
     //some stuff 
    } 
} 

然後你就可以簡單地調用myFunc['BeforeSlide' + num]

+0

我在小提琴上試過這個,不能讓它工作.. http:// jsfiddle。淨/ wV5hx/4 / –

相關問題