我在尝试跨域请求时遇到了同样的问题。情况很奇怪,我的数据是在浏览器上直接点击请求的url时加载的,奇怪的是,如果使用jquery ajax请求,也会加载,但不是在firebug控制台上,而是在firebugnet选项卡上。控制台打印:错误数据示例:parserror{虽然json数据格式良好,但在json验证器上进行了检查}
readyState: 4 status: 200 responseText: undefined
Net选项卡加载响应和json子选项卡中的所有数据
我的示例代码是:
function fetchJsonData() {
$.ajax({
type: 'POST',
url: 'http://www.meilleurmobile.com/comparateur/resultats-comparateur-json.do',
data: 'monthDur%5B0%5D=45.75&monthDur%5B1%5D=45.75&monthDur%5B2%5D=45.75&monthDur%5B3%5D=45.75&monthDur%5B4%5D=45.75&monthDur%5B5%5D=45.75&monthDur%5B6%5D=45.75&monthDur%5B7%5D=45.75&monthDur%5B8%5D=45.75&monthDur%5B9%5D=45.75&monthDur%5B10%5D=45.75&monthDur%5B11%5D=45.75&numSms=1000&dataVolume=1000&withoutMobile=-1&commitmentDuration=-1',
async: false,
cache: false,
//contentType: 'application/json; charset=utf-8',
crossDomain: true,
dataType: 'jsonp',
error: function( xhr,err ) {
console.log( 'Sample of error data:', err );
console.log("readyState: "+xhr.readyState+"nstatus: "+xhr.status+"nresponseText: "+xhr.responseText);
},
success: function( data ) {
if (console && console.log) {
console.log( 'Sample of data:', data.slice(0,100) );
}
}
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); });
}
尝试的跨域XMLHttpRequest请求可能会欺骗您。在Firefox网络控制台中,它可能看起来像URL加载得很好,但正文是一个空字符串。
确认服务器支持JsonP。如果你真的不知道这意味着什么,你需要查一下。这一点至关重要。
jQuery假设JsonP参数将为"?callback="。如果这不是真的,你应该看到:http://api.jquery.com/jQuery.ajax/
jsonp:覆盖jsonp请求中的回调函数名称。此值将在"callback=?"中使用而不是"callback"的一部分url中的查询字符串。因此{jsonp:"onJSONPLoad"}将导致'onJSONPLoad=?'传递给服务器。从jQuery 1.5开始,设置jsonp选项为false会阻止jQuery添加"?callback"字符串转换到URL或尝试使用"=?"进行转换。在里面在这种情况下,您还应该显式设置jsonpCallback设置。例如,{jsonp:false,jsonpCallback:"callbackName"}
jsonpCallback:为JSONP请求指定回调函数名称。此值将使用,而不是由jQuery。最好让jQuery生成一个唯一的名称,因为它将更容易管理请求并提供回调和错误处理。当您希望启用时,您可能需要指定回调更好的GET请求浏览器缓存。从jQuery 1.5开始,您还可以使用此设置的函数,在这种情况下jsonpCallback被设置为该函数的返回值。
如果它变得令人困惑,那么可以更容易地使用老式的方式,并在URL中添加时间戳将脚本附加到页面中,以避免使用缓存的脚本页面。
顺便说一句,AFAIK,没有办法将JSONP和POST结合起来。JSONP是围绕XMLHttpRequest的同源安全策略进行工作的一种方式。它要求您将一个脚本附加到DOM中。我不认为您可以在这个过程中提交POST变量。
尝试
console.log(data);
没有切片。
或者更好的
console.log(JSON.stringify(data.slice(0,100)));
使用JSON.stringfy()方法(这里有文档),您会得到一个未解析或检查JSON有效性的字符串。
希望这能有所帮助。
function fetchJsonData() {
$.ajax({
type: 'POST',
url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20json%20where%20url%20%3D%20'www.meilleurmobile.com%2Fcomparateur%2Fresultats-comparateur-json.do%3FmonthDur%255B0%255D%3D45.75%26monthDur%255B1%255D%3D45.75%26monthDur%255B2%255D%3D45.75%26monthDur%255B3%255D%3D45.75%26monthDur%255B4%255D%3D45.75%26monthDur%255B5%255D%3D45.75%26monthDur%255B6%255D%3D45.75%26monthDur%255B7%255D%3D45.75%26monthDur%255B8%255D%3D45.75%26monthDur%255B9%255D%3D45.75%26monthDur%255B10%255D%3D45.75%26monthDur%255B11%255D%3D45.75%26numSms%3D1000%26dataVolume%3D1000%26withoutMobile%3D-1%26commitmentDuration%3D-1%26_%3D1329825461536'&format=json&diagnostics=true",
async: false,
cache: false,
crossDomain: true,
dataType: 'jsonp',
error: function( xhr,err ) {
console.log( 'Sample of error data:', err );
console.log("readyState: "+xhr.readyState+"nstatus: "+xhr.status+"nresponseText: "+xhr.responseText);
},
success: function( data, status ) {
if (console && console.log) {
console.log( 'data count:', data.query.results.json.json.length );
$('#result-count').text( JSON.stringify(data.query.results.json.json) );
}
},
jsonpCallback: 'swatCallback'
})
.done(function() { alert("success"); })
.fail(function() { alert("error"); });
}
window['swatCallback'] = function(data) {
var info = data.query.results.json.json;
$('#callback_result_operator').html(info[0].operator);
};