JavaScript eval()不能按预期工作
我从JSON格式的PHP函数中获取数据。JavaScript eval()不能按预期工作
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']
的最后一个元素。
我想要分配数组的每个元素。
简单的解决办法是
var tinyMCEImageList = eval('['+serverResponse.responseText+']');
或
var tinyMCEImageList = JSON.parse(
'['+serverResponse.responseText.replace(/'/g, '"')+']'
);
但是一个更好的解决办法是通过添加缺少[
和]
,并使用合适的报价产生JSON,这将让你直接使用JSON.parse
。请注意,PHP标配所有到generate JSON的工具。
试试这个
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
}
试试这个:
var jsondata=eval("(["+serverResponse.responseText+"])") //retrieve result ..
四个要素缺乏阵列封装,最后又回来只分配。
在JavaScript中,括号,(
和)
,可能意味着两种情况之一:
在函数结束时,它会触发一个函数调用。
在表达式中,它将覆盖运算符优先级。
所以,因为你试图评估的是一个表达式,它看起来像2号正在发生。注意上面两个含义是大括号在javascript中唯一的含义。例如,花括号不能像Perl中那样用作分组或列表运算符。
接下来我们遇到逗号运算符。在JavaScript中,逗号,,
,可能意味着以下四种情况之一:
在一个函数调用,传递给函数的逗号分隔参数。
在数组中,逗号分隔数组成员。
在对象字面上,逗号分隔对象成员。
在表达式中,逗号是逗号运算符。
什么是逗号运算符?逗号运算符是一个接受两个表达式的运算符,对两者进行求值并返回第二个。因此,可以说,你有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代码可以正常工作。
你应该真的*使用'JSON.parse(..)'代替。请参考:http://www.json.org/js.html – techfoobar 2013-03-18 08:47:12
为什么你应该假设'eval()'会自动将'JSON'解析成一个数组。正如@techfoobar所说的,它应该是'JSON.parse()' – 2013-03-18 08:48:13
这是什么问题? – 2013-03-18 08:52:02