Javascript eval()不起作用

时间:2011-03-23 12:20:05

标签: php javascript jquery ajax arrays

我有一个数组通过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的内容是什么,都保持不变。

3 个答案:

答案 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();
}

}