Ale*_*lan 0 javascript php ajax json xmlhttprequest
我是一名iPhone开发人员,他对网络开发很陌生,所以如果我在这里犯了愚蠢的错误,请原谅我:
我想要完成的是当用户从下拉列表中选择一个项目时,它会调用一些javascript,这会将一个AJAX请求引发到我所拥有的返回一些JSON的PHP文件. - 该JSON包括缩略图图像文件名和图像的标题.这些需要分别传入我的文档中的图像和文本字段.
问题是,尝试评估json后失败了.- 同样的事情发生了eval(json);,JSON.parse(json);我通过调用document.write('something')来解决这个问题.定期在我的回应方法中. - 它总是能够写到它解析json的点.
我确信我的PHP是有效的,我的请求很好(我可以从JS输出响应).
这是我在下拉列表中选择新项目时调用的函数:
function changeImage(id){
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()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
var res=xmlhttp.responseText;
var responseObject = eval(res);
var caption = responseObject.caption;
var textField = document.getElementById('caption');
textField.value = caption;
var imagePreview = document.getElementById('imgPreview');
imagePreview.src = responseObject.filename;
}
}
xmlhttp.open("GET","getCaption.php?id="+id,true);
xmlhttp.send();
}
Run Code Online (Sandbox Code Playgroud)
当我输出res(或手动访问php文件)时,JSON看起来像这样:
{"caption":"A caption","filename":"myimage_thumb.jpg"}
Run Code Online (Sandbox Code Playgroud)
为什么JSON eval失败了?
更新:
记录此错误:SyntaxError: Parse error
您正在使用JSON字符串并假装它是一个Javascript对象文字.但是,请记住,JSON仅以Javascript的对象表示法命名!
然后你希望eval直接评估它并返回一个对象,但事实并非如此.
在Firebug控制台中编写以下内容:
eval('{"caption":"A caption","filename":"myimage_thumb.jpg"}')
Run Code Online (Sandbox Code Playgroud)
还会产生一个SyntaxError.(理想情况下,你已经将问题缩小到了这个范围!)
有趣的是,更明确地构造一个对象是有效的(对于这个输入):
eval('new Object({"caption":"A caption","filename":"myimage_thumb.jpg"})')
Run Code Online (Sandbox Code Playgroud)
正如强制输入成为某种表达式一样,带括号:
eval('({"caption":"A caption","filename":"myimage_thumb.jpg"})')
Run Code Online (Sandbox Code Playgroud)
这一切都归结为ECMAScript标准中12.4的声明:
请注意,
ExpressionStatement不能以开口花括号开头,因为这可能会使其与块不一致.
本文深入解释了该问题,但总的来说,解决方案是用于JSON.parse(res)从JSON字符串中获取对象.这是正确的方法,只要您的输入是有效的JSON,它就不会失败.