Javascript eval()无法按预期工作

时间:2013-03-18 08:46:32

标签: php javascript json tinymce

我正在以JSON格式从PHP函数中获取数据。

 var xhReq = new XMLHttpRequest();
 xhReq.open("GET", "http://myserver/getjson", false);
 xhReq.send(null);
 var serverResponse = xhReq;

var jsondata=eval("("+serverResponse.responseText+")") //retrieve result as an JavaScript object

 images="";

 for(var i=0; i<jsondata.length;i++)
 {
  images+="  ['"+jsondata[i].title+"','"+IMAGESROOT+"121a.png"+"']";


     if(i<jsondata.length-1)
        images+=",";
 }

我以下列格式获取此数据。

['title 1','http://site.com/images/121a.png'],
['title 2','http://site.com/images/121a.png'],
['title 3','http://site.com/images/121a.png'],
['title 4','http://site.com/images/121a.png']

最后,当我使用eval()

将此数据指定为数组时
var tinyMCEImageList = new Array(eval(images));

它只显示数组的最后一个元素['title 4','http://site.com/images/121a.png']

我希望分配数组的每个元素。

4 个答案:

答案 0 :(得分:2)

一个简单的解决方案是

var tinyMCEImageList = eval('['+serverResponse.responseText+']');

var tinyMCEImageList = JSON.parse(
    '['+serverResponse.responseText.replace(/'/g, '"')+']'
);

但更好的解决方案是通过添加缺少的[]并使用适当的引号来生成JSON,这样您就可以直接使用JSON.parse。请注意,PHP标配了generate JSON的所有工具。

答案 1 :(得分:0)

试试这个

 var tinyMCEImageList = new Array();
 for(var i=0; i<jsondata.length;i++)
{
  images+="  ['"+jsondata[i].title+"','"+IMAGESROOT+"121a.png"+"']";


 if(i<jsondata.length-1)
    images+=",";

     tinyMCEImageList[]=images
}

答案 2 :(得分:0)

试试这个:

var jsondata=eval("(["+serverResponse.responseText+"])") //retrieve result ..

这四个元素缺少数组封装,最后一个元素只返回。

答案 3 :(得分:0)

在javascript中,大括号()可能意味着以下两种情况之一:

  1. 在函数结束时,它会触发函数调用。

  2. 在表达式中,它会覆盖运算符优先级。

  3. 所以,既然你正在尝试eval是一个表达式,它看起来像是2号正在发生。请注意,上述两个含义是大括号在javascript中执行的唯一操作。例如,大括号不能用作分组或列表操作符,例如Perl。

    接下来我们遇到逗号运算符。在javascript中,逗号,可以表示以下四种情况之一:

    1. 在函数调用中,逗号分隔传递给函数的参数。

    2. 在数组文字中,逗号分隔数组成员。

    3. 在对象文字中,逗号分隔对象成员。

    4. 在表达式中,逗号是逗号运算符。

    5. 什么是逗号运算符?逗号运算符是一个运算符,它接受两个表达式,计算两个表达式并返回第二个表达式。所以假设您有3个表达式X,Y和Z.以下行:

      X, Y, Z
      
      javascript中的

      基本上与:

      相同
      (X , Y) , Z
      

      所以当然上面的表达式首先计算X然后Y,然后返回Y作为结果,然后返回Y,然后返回Z并返回Z作为结果。

      所以你看到的是行为4:逗号作为逗号运算符。

      我怀疑你的意图是行为编号2:逗号充当数组分隔符。如果是这样,你正在评估的字符串是错误的。它应该是:

      "[" + your_string + "]"
      

      这意味着您收到的数据不是JSON(或者更确切地说,是无效的JSON)。您可以通过执行上述操作来解决此问题,以解析javascript中的非JSON字符串。或者您可以在php中执行上述操作以使数据有效JSON,以便您的javascript代码可以正常工作。