-1

我正在以 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

4 回答 4

2

一个简单的解决方案是

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

或者

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

但更好的解决方案是通过添加缺少的和使用正确的引号来生成JSON,这将允许您直接使用。请注意,PHP 是生成 JSON的所有工具的标准配置。[]JSON.parse

于 2013-03-18T08:49:55.243 回答
0

在 javascript 中,大括号(), 可以表示以下两种情况之一:

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

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

因此,由于您要评估的是一个表达式,因此看起来数字 2 正在发生。请注意,上述两个含义是大括号在 javascript 中所做的唯一事情。例如,大括号不能用作 Perl 中的分组或列表运算符。

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

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

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

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

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

什么是逗号运算符?逗号运算符是一个运算符,它接受两个表达式,计算两个表达式并返回第二个。因此,假设您有 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 代码能够正常工作。

于 2013-03-18T09:00:45.297 回答
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
}
于 2013-03-18T08:49:59.990 回答
0

尝试这个:

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

四个元素缺少数组封装,最后一个元素只被分配回来。

于 2013-03-18T08:50:44.877 回答