Javascript eval()不起作用
我有一个数组,通过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
的内容是什么,都保持不变。
取决于脚本传递给您的eval()的样子。
您可能会将这些值设置为错误的pauseTimes
变量对象或位于错误位置的对象。这就是为什么你不覆盖你真正关心的对象中的值。
但是,如果没有您的脚本示例,则无法判断。
我是否必须以某种方式取消数组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();
}
}
问题已解决,请参阅上文。 – Mattias 2011-03-30 09:45:51
我发现错误自己 - 声明阵列暂停时间,当我用关键字var这使得可变局部的脚本块。
删除该关键字解决了问题,我的数组现在是全局的窗口,并将按预期进行更新。
/Mattias
脚本元素的内容是什么?你可以发布一个你传递给eval的代码的sniplet吗? – 2011-03-23 12:22:48
你真的必须找到一个解决方案,而不使用eval()。在你的情况下,你可以很容易地返回(通过Ajax)一组数字,然后使用for-loop将这些数字设置为pauseTimes。您不必使用eval并使用脚本文本污染DOM元素。 – 2011-03-23 12:25:45
你可以发布#otherScripts的内容吗?那是你eval()的代码吗? – picardo 2011-03-23 12:29:07