我有一个数组通过ajax调用与页面的其余部分一起更新,该调用替换了我页面的整个正文内容。我的<script>
标记位于正文中,我在这些脚本标记上显式运行eval()
(以id引用)。
现在,如果我做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
的内容是什么,都保持不变。
答案 0 :(得分:1)
取决于脚本传递给你的eval()的内容。
您可能会将这些值设置为错误的pauseTimes
变量对象或位于错误位置的对象。这就是为什么你不会覆盖你真正关心的对象中的值。
但是,如果没有脚本示例,则无法分辨。
答案 1 :(得分:1)
我自己发现了这个错误 - 在声明数组pauseTimes时我使用了关键字var,这使得该变量在该脚本块中是本地的。
删除该关键字解决了这个问题,我的数组现在是窗口的全局,并将按预期更新。
/的Mattias
答案 2 :(得分:0)
我是否必须以某种方式取消设置数组pauseTimes并重新声明它?你说了一些关于设置另一个数组对象的事情,那么可能有两个同名的数组吗?
这是样本代码。就像我说的那样,除了没有更新时间,我的div的内容以及应该更新这样的内容之外,它的工作完美。
<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>
transition.js链接脚本的内容:
功能幻灯片(幻灯片){ if(slide == 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();
}
}