[英]How do I get jquery.Ajax to work with “throw 1; <dont be evil>” in front of json responses?
Google将Unparsable Cuft返回给json响应,如下所示:
throw 1; <dont be evil> { foo: bar}
这是一个相关的演示
您应该从响应中删除开头部分:
$.ajax(url, {
dataType: "jsonp text",
success: function(data) {
var jsonString = data.replace(/^throw 1; <dont be evil> /, "");
var responseObject = $.parseJSON(jsonString);
// do something with responseObject
...
}
}
更新:
要在每个Ajax调用中重写,您还可以在jQuery中注册一个全局Ajax转换器:
$.ajaxSetup({
converters: {
"text cleanedjson": function(data) {
var jsonString = data.replace(/^throw 1; <dont be evil> /, "");
return $.parseJSON(jsonString);
}
}
});
$.ajax(url, {
dataType: "jsonp cleanedjson",
success: function(responseObject) {
// do something with responseObject
...
}
});
您仍需要在请求选项中指定已定义的dataType
。
更新2:如果您需要调整现有的调用以自动执行响应清理,您可以修补jQuery的ajax
实现,以在某些情况下自动使用您的转换器:
// store reference to original implementation
$._ajax_original = $.ajax;
// redefine jQuery's ajax function
$.ajax = function(url, settings) {
if (… your test for applicability here (e.g. an url check) …) {
settings.dataType = "jsonp cleanedjson";
}
return $._ajax_original(url, settings);
};
请注意,在加载jQuery之后和第一次Ajax调用之前,必须包含此重新定义。 您可能还需要考虑在没有单独的url
参数的情况下也可以调用 $.ajax
...
我利用$.ajaxSetup
方法实现了这个更简单的方法:
http://api.jquery.com/jQuery.ajaxSetup/
并使用转换器:
$.ajaxSetup({
converters: {
"text json": function (stringData) {
return jQuery.parseJSON(stringData.replace("for(;;);", ""));
}
}
});
这样做可以利用每个ajax呼叫,并在运行中进行必要的转换/替换。 它基本上将你的对象读作“text”,替换不可解析的cruft,并吐出一个新的json对象。
效果很好。 我设置它并忘记它并且它不会干扰任何没有污染的json。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.