JSON Array не декодируется с помощью Eval - PullRequest
0 голосов
/ 26 августа 2010

У меня есть два файла, один из которых содержит массив в PHP, echo редактируемый с помощью json_encode, а другой полон функций JavaScript для веб-страницы. Одна из таких функций, которая выглядит так (и еще не завершена):

/*
 * Function: selectVictim
 * Called from function laserOn()
 *
 * Selects a random victim from a list of victims
 *
 * @return String: victim
 */
function selectVictim()
{
var params = "url=queenofsheep.com/Sheep/victims.php";
var request = new ajaxRequest();

request.open("POST", "victims.php", true);
request.setRequestHeader("Content-Type",
                             "application/x-www-form-urlencoded");
request.setRequestHeader("Content-Length", params.length);
request.setRequestHeader("Connection", "close");

request.onreadystatechange = function ()
{
    if (this.readyState == 4)
    {
        if (this.status == 200)
        {
            if (this.responseText != null )
            {
                var vicString = this.responseText;
                var vicArray = eval('"'+vicString+'"');
                //var vicArray = vicString.split(',');
                //var numVic = Math.floor(Math.random() * (vicArray - 1));
                alert(vicArray);
            }
            else alert("Ajax error: No data received");
        }
        else alert("Ajax Error: " + this.statusText);
    }
}

request.send(params);
}

Предполагается взять массив из другого файла и выполнить с ним действия, выходящие за рамки этого вопроса. К сожалению, пока this.responseText содержит JSON-кодированный массив формата

var jsonArr = 
     ["1","2,","3"]

активация функции ничего не делает, а eval ing this.responseText дает "undefined".

Что я здесь не так делаю? Я могу предоставить больше примеров реального кода, фактического массива, что угодно, если это будет необходимо. Это сводит меня с ума.

Ответы [ 3 ]

3 голосов
/ 26 августа 2010

Попробуйте добавить «(» и «)» к функции Eval.Вот как я видел это в прошлом

var myObject = eval('(' + vicString + ')');
1 голос
/ 26 августа 2010

Используйте request вместо this.this относится к объекту window.

Редактировать: если var jsonArr=[1, 2, 3]; буквально ответ, вы должны использовать eval(vicString+';jsonArr');, если не можете изменить текст ответа.

Если вы запустите 'eval ("var test = [1,2,3];") ", вы увидите, что он действительно возвращает undefined.Но это не очень хорошая практика использования JSON.

0 голосов
/ 26 августа 2010

Установите тип содержимого ответа на сервере равным «application / json», и вам больше не придется использовать eval.
Также вам лучше использовать инфраструктуру ajax вместо использования собственных функций ajax..

...