2011-03-23 62 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