Javascript eval () не работает - PullRequest
0 голосов
/ 23 марта 2011

У меня есть массив, который обновляется вместе с остальной частью страницы с помощью вызова 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 ]

1 голос
/ 30 марта 2011

Я нашел ошибку сам - при объявлении массива pauseTimes я использовал ключевое слово var, которое делает переменную локальной для этого блока скрипта.

Удаление этого ключевого слова решило проблему, теперь мой массив является глобальным для окна и будет обновляться, как и предполагалось.

/ Маттиас

1 голос
/ 23 марта 2011

Зависит от того, как скрипт, переданный в eval (), выглядит.

Возможно, вы устанавливаете эти значения в неправильный pauseTimes переменный объект или объект, расположенный в неправильном месте.Вот почему вы не перезаписываете значения в объекте, который вас действительно волнует.

Однако, без образца вашего сценария невозможно сказать.

0 голосов
/ 24 марта 2011

Должен ли я каким-то образом сбросить массив pauseTimes и объявить его заново? Вы сказали что-то об установке другого объекта массива, тогда возможно ли иметь два массива с одинаковым именем?

Вот код sampe. Как я уже сказал, он работает отлично, за исключением того, что время не обновляется, содержимое моего 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();
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...