更新1:我还没弄清楚发生了什么,但这似乎与我的项目有关。在创建一个简单的测试页面之后,我能够验证getJSON实际上是否确实返回了它应该的XHR对象。
更新2:哇,这很奇怪。在做了更多测试之后,我发现如果我指定“callback =?” URL字符串中的参数XHR对象未正确返回。但是,如果我没有指定“callback =?”参数,正确返回XHR对象。问题是,我正在调用JSONP服务,所以“回调=?”参数是必需的。
关于为什么会出现这种情况的任何想法?
更新3:以下是一些独立的代码示例来说明问题。在第一个示例中,未定义console.log(请求)。当我在第二个代码示例中对回调参数进行硬编码时,console.log(request)是XHR对象。
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
</head>
<body>
<script>
$(document).ready(function() {
var request = $.getJSON('http://localhost?callback=?', function(data) {
});
console.log(request);
});
</script>
</body>
</html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>
</head>
<body>
<script>
$(document).ready(function() {
var request = $.getJSON('http://localhost?callback=callback', function(data) {
});
console.log(request);
});
</script>
</body>
</html>
更新4:根据下面的regilero评论,我转而使用$ .ajax方法并通过数据对象传递参数。以下是请求的完整代码:
var request = $.ajax({
data: {
f: 'json',
geometry: '{x:44.203642291681845,y:-95.79085806500001}',
geometryType: 'esriGeometryPoint',
imageDisplay: '727,500,96',
layers: 'all',
mapExtent: '-179.462733065,16.116769346042226,-51.669764315000016,71.57609342040729',
returnGeometry: false,
tolerance: 10
},
dataType: 'jsonp',
success: function(data) {
console.log(data);
},
url: 'http://server.arcgisonline.com/ArcGIS/rest/services/Specialty/Soil_Survey_Map/MapServer/identify'
});
console.log(request);
如果我在config对象中指定“dataType:'jsonp'”,则再次定义console.log(request)。但是,如果我指定“dataType:'json'”,则console.log(request)是XHR对象。
此行为与我使用$ .getJSON快捷方式所遇到的一致。
原始问题
根据stackoverflow问题/答案:Abort Ajax requests using jQuery以及本网站和其他网站上的一些其他问题/答案,jQuery Ajax方法应该返回XHR对象。
但是,当我运行以下代码时,请求是“未定义”。
var request = $.getJSON(url, function(data) {
console.log(data);
});
console.log(request);
我是否错过了jQuery的变化?我正在使用1.4.4。
答案 0 :(得分:5)
jsonp
不使用XMLHTTPRequest。它是同源策略的解决方法,适用于所有XMLHTTPRequests;它的工作原理是将<script>
标记插入到DOM中,要求服务器返回包含在由callback=?
参数表示的JS函数中的JSON对象。
由于未使用XMLHTTPRequest,因此不会返回该类型的对象。
答案 1 :(得分:0)
错误的答案。忽略这篇文章。
<德尔> $ .getJSON不返回任何值。相反,它获取提交的URL的响应并将其转换为JSON对象,并在传递时将其传递给回调。 检查网址:[链接文字] [1] [1]:http://api.jquery.com/jQuery.getJSON/ getJSON方法框架(根据jQuery站点): &GT; jQuery.getJSON(url,[data],[ &GT;回调(data,textStatus,xhr)]) &GT; &GT; url包含URL的字符串 &GT;请求发送到哪个。 &GT; &GT; dataA映射或发送到的字符串 &GT;带有请求的服务器。 &GT; &GT;回调(data,textStatus,xhr)A &GT;如果执行的回调函数 &GT;请求成功。 德尔>答案 2 :(得分:0)
$ .getJSON是$ .ajax()的简写,像大多数简写的$ .ajax()一样,没有默认的错误处理程序。尝试使用$ .ajax并相应地设置错误处理程序。 Maye你的Json语法有问题。你处于'沉默的失败'问题。
Doc提取:
重要:从jQuery 1.4开始,如果是 JSON文件包含语法错误, 请求通常会无声地失败。 避免频繁手工编辑JSON 数据就是这个原因。 JSON是一个 数据交换格式与语法 比那些更严格的规则 JavaScript的对象文字符号。 例如,表示所有字符串 在JSON中,它们是否属性 或值,必须包含在内 双引号。有关JSON的详细信息 格式,请参阅http://json.org/。
答案 3 :(得分:0)
$.getJSON
函数是异步的,这意味着即使JSON请求尚未完成,它仍将继续运行。在请求返回之前,console.log(request);
可能正在运行,因此可能没有xhr对象。
我不确定这一点,但这是一个想法。
编辑:以下是我原来的答案,我发现这是错误的
XHR对象作为第三个参数传递给回调函数。如果需要,您需要使用此function(data, statusText, xhr) {
代替此function(data) {
。
现在,如果你的成功回调根本没有被调用,那就是另一个故事了。尝试在回调中添加alert(statusText);
以确保它被调用。如果没有被调用,请按照@regilero的说法进行操作,并使用$.ajax
并传递错误处理程序,以查看是否弹出了任何错误消息。
答案 4 :(得分:0)
第一个答案是错的,实际上你可以中止ajax请求;)
$.ajax({
url: "/event/search/list-event.html",
data:{
page: 1
},
beforeSend: function(xhr)
{
if(window.eventListXhr != null){
window.eventListXhr.abort();
}
window.eventListXhr = xhr;
},
success: function(data) {
// ....
}
});