2011-03-23 300 views
0

我有一個數組,通過ajax調用與頁面的其餘部分一起更新,替換我的頁面的全部內容。我的<script>標籤位於主體內部,我在這些腳本標籤(用id引用)上明確運行eval()Javascript eval()不起作用

現在,如果我做了alert(array),我得到了更新後的值,但是我的Javascript中使用數組內容的函數從未更新過,它會掛在舊數組值上,不管更新如何。

這是eval()應該做的伎倆......

eval(document.getElementById('otherScripts').innerHTML); 
eval(document.getElementById('transition').innerHTML); 
<?php 
javascript.="pauseTimes[$i]=$paustime" 
?> 

這結束了這樣的Javascript數組的東西:

pausTimes[0]=3000 
pausTimes[1]=3000 
pausTimes[2]=3000 
pausTimes[3]=3000 

就像我說的,做一個alert()時在這個數組的內容上,它顯示正確的更新值,但是下面的這個小函數不會更新。這是因爲如果從它自己的高速緩存吸引這些數組值:

function slideshow(slide) { 

    if (pauseTimes[slide]>0) {   
     $('#slide'+slide).fadeIn(1500).delay(pauseTimes[slide])**.fadeOut(1500,function(){slideshow(slide+1);}); 
    } 
    else { 
     ajaxUpdate(); 
    } 
} 

上方的關鍵部分是一個大膽,在這裏我不斷地從第一,同步頁面加載使用舊的,最初的數組值。之後,無論數組pauseTimes的內容是什麼,都保持不變。

+1

腳本元素的內容是什麼?你可以發佈一個你傳遞給eval的代碼的sniplet嗎? – 2011-03-23 12:22:48

+3

你真的必須找到一個解決方案,而不使用eval()。在你的情況下,你可以很容易地返回(通過Ajax)一組數字,然後使用for-loop將這些數字設置爲pauseTimes。您不必使用eval並使用腳本文本污染DOM元素。 – 2011-03-23 12:25:45

+0

你可以發佈#otherScripts的內容嗎?那是你eval()的代碼嗎? – picardo 2011-03-23 12:29:07

回答

1

取決於腳本傳遞給您的eval()的樣子。

您可能會將這些值設置爲錯誤的pauseTimes變量對象或位於錯誤位置的對象。這就是爲什麼你不覆蓋你真正關心的對象中的值。

但是,如果沒有您的腳本示例,則無法判斷。

0

我是否必須以某種方式取消數組pauseTimes並重新聲明它?你說了一些關於設置另一個數組對象的信息,是否可以有兩個同名的數組?

這是sampe代碼。就像我說的那樣,除了時間沒有更新,我的div的內容以及它應該更新的內容之外,它完美的工作。所述transition.js的

<script id='transition' type='text/javascript' src='userData/2/style/transition.js'></script> 

    <script id='otherScripts' type='text/javascript'> 

    var pauseTimes = new Array(); 
    setPauseTimes(); 

    function setPauseTimes() { 

     pauseTimes[0]=2000; 
     pauseTimes[1]=2000; 
     pauseTimes[2]=2000; 
     pauseTimes[3]=2000; 
    } 

    function ajaxUpdate() 
    { 
     var xmlhttp; 

     if (window.XMLHttpRequest) { 
      // code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } 
     else { 
      // code for IE6, IE5 
      xmlhttp=new ActiveXObject('Microsoft.XMLHTTP'); 
     } 

     xmlhttp.onreadystatechange=function() { 

      /* Försök hämta hela bildspelet på nytt */ 
      if (xmlhttp.readyState==4 && xmlhttp.status==200) { 

       /* Ladda in bildspelet på nytt */ 
       document.getElementById('slideshow_body').innerHTML=xmlhttp.responseText; 

       /* Uppdatera paustiderna */ 
       eval(document.getElementById('otherScripts').innerHTML); 
       eval(document.getElementById('transition').innerHTML); 

      } 
      /* Om hämtningen misslyckades... */ 
      else if (xmlhttp.readyState==4 && xmlhttp.status!=200) 
      { 
       /* Visa avbrottsmeddelandet */ 
       document.getElementById('avbrott').style.display='inline'; 

       /* Starta om bildspelet från utgångsläget (det som redan finns inläst) */ 
       slideshow(0); 
      } 
     } 

     xmlhttp.open('GET','index.php?controller=slideshow&asynch=true',true); 
     xmlhttp.send(); 
    } 

    function buttons(id) { 
     $('#button'+id).removeClass('future').addClass('past'); 
    } 

    function buttons_reset() { 
     /* Ställa om alla buttons till future (icke ifyllda) */ 
     $('#buttons').find('div').each(function(i){ 
      $('#button'+i).removeClass('past').addClass('future'); 
     });   
    } 

    $(document).ready(function(){ 
     slideshow(0); 
    }); 

    </script> 

內容鏈接的腳本:

功能幻燈片(幻燈片){ 如果(滑動== 0){ buttons_reset();

/* 
    $('#wrapper').find('div').each(function(i){ 
    $('#slide'+i).fadeOut(0); 
    }); 
    */ 

} 

if (pauseTimes[slide]>0) { 
    buttons(slide); 
    $('#slide'+slide).fadeIn(1500).delay(pauseTimes[slide]).fadeOut(1500,function(){slideshow(slide+1);}); 
} 
else { 
    ajaxUpdate(); 
} 

}

+0

問題已解決,請參閱上文。 – Mattias 2011-03-30 09:45:51

1

我發現錯誤自己 - 聲明陣列暫停時間,當我用關鍵字var這使得可變局部的腳本塊。

刪除該關鍵字解決了問題,我的數組現在是全局的窗口,並將按預期進行更新。

/Mattias