我有一个ajax函数,可以向某个地方发送电子邮件,并从类型=成功或错误的json对象接收来自服务器的响应
$("#submit_btn").click(function(event) {
event.preventDefault();
var post_data = {
'email': $("#email").val()
};
$.post( "sendEmail.php", post_data ).done(function(response){
if(response.type == 'success'){
$("#sentmail").fadeIn("slow")
setTimeout(function(){
$("#mail").val("Enter your email here");
$("#sentmail").fadeOut("slow")
},3000);
}
else{
$("#sentmailfail").fadeIn("slow")
setTimeout(function(){
$("#mail").val("Enter your email here");
$("#sentmailfail").fadeOut("slow")
},3000);
}
},"json")
});
有趣的是,如果我console.log(response)
我获得{"type":"success","desc":"something"}
,然后直接console.log( (response.type == "error") ) // TRUE
如果我从响应中获取安慰日志并将其分配给变量a = {"type":"success","desc":"something"}
,则a.type == "error"
为假。
有人可以解释一下吗?
答案 0 :(得分:4)
如果console.log(response)
的输出是
{"type":"success","desc":"something"}
然后response
很可能仍然是一个字符串(包含JSON),而字符串没有type
属性:
> "foo".type == "error" // `undefined` is never equal to a string
false
对象在控制台中的外观通常不同:
> console.log({"type":"success","desc":"something"})
Object {type: "success", desc: "something"} // in Chrome and Firefox at least
解决方案:首先解析字符串:
response = JSON.parse(response);
与jQuery相关:
我注意到你打算让jQuery为你解析JSON,但是你将"json"
传递给了错误的函数。您必须将其传递给$.post(...)
,而不是.done(...)
:
$.post("sendEmail.php", post_data, "json").done(...);
// instead of
// $.post("sendEmail.php", post_data).done(..., "json");
然后您不需要手动解析它。