jQuery Ajax方法不返回XHR对象

jQuery Ajax方法不返回XHR对象

问题描述:

更新1:我还没有弄清楚发生了什么事情,但这肯定是我的项目的一个问题。在创建一个简单的测试页之后,我能够验证getJSON实际上是否返回了它应该的XHR对象。jQuery Ajax方法不返回XHR对象

UPDATE 2:哇,这很奇怪。在做了更多测试之后,我发现如果我指定“callback =?”参数在URL字符串XHR对象不正确地返回。但是,如果我没有指定“callback =?”参数,XHR对象正确返回。问题是,我在调用JSONP服务,所以“callback =?”参数是必需的。

有关为什么会出现这种情况的任何想法?

更新3:以下是一些独立代码示例来说明问题。在第一个示例中,console.log(request)未定义。当我在第二个代码示例中硬编码回调参数时,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> 

UPDATE 4:每regilero的评论下面,我切换到使用$阿贾克斯方法,并通过一个数据对象传递的参数了。下面是请求的全部代码:

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); 

如果我指定“数据类型:‘JSONP’”的配置对象,执行console.log(请求)再次定义。但是,如果我指定“dataType:'json'”,则console.log(request)是XHR对象。

此行为与我使用$ .getJSON快捷方式时遇到的情况一致。


原来的问题

%的计算器问题/答案在这里: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

根据手册,它应该还是回到一个XHR对象。 http://api.jquery.com/jQuery.getJSON/也许请求失败? – 2011-01-07 21:31:19

+0

@皮卡:不,请求绝对不会失败。 – 2011-01-07 21:38:33

+0

对,对不起。我误解了这个问题。 – Anders 2011-01-07 21:40:05

jsonp不使用XMLHTTPRequest。这是适用于所有XMLHTTPRequests的同源策略的解决方法;它通过将<script>标签插入到DOM中来工作,请求服务器返回由callback=?参数表示的JS函数中包装的JSON对象。

由于未使用XMLHTTPRequest,因此不会返回该类型的对象。

错误的答案。忽略此帖。

$ .getJSON不返回任何值。相反,它会获取提交的URL的响应,并将其转换为JSON对象,并在传递给它时将其传递给回调。 检查URL:[链接文本] [1] [1]:http://api.jquery.com/jQuery.getJSON/ 的getJSON方法骨架(按照jQuery的网站): > jQuery的。 getJSON(url,[data],[ > callback(data,textStatus,xhr)]) > > urlA包含发送请求的URL的字符串。 > > dataA将映射或字符串发送到具有请求的服务器。 > > callback(data,textStatus,xhr)A >如果 >请求成功,则执行回调函数。
+0

根据您链接的文档,getJSON确实会返回XmlHttpRequest。看看标题,在右侧。 – 2011-01-07 21:37:05

$ .getJSON是$ .ajax()的缩写,像大多数简写的$ .ajax()那样没有默认的错误处理程序。尝试使用$ .ajax并相应地设置错误处理程序。 Maye在你的Json语法中有些错误。而你正处于'沉默失败'问题。

文件摘录:

重要:对于jQuery 1.4,如果 JSON文件包含语法错误, 请求通常会失败默默。 由于这个原因,避免频繁手动编辑JSON 数据。 JSON是 数据交换格式,其语法规则 比JavaScript的对象字面表示法更严格。 例如,所有以JSON表示 的字符串,无论它们是属性 还是值,都必须包含在 双引号中。有关JSON 格式的详细信息,请参见http://json.org/

$.getJSON函数是异步的,即使JSON请求尚未完成,它仍将继续运行通过脚本。您的console.log(request);可能在请求返回之前运行,因此它可能没有xhr对象。

我不知道这是肯定的,但这是一个想法。

编辑:下面是我的,我知道错了
XHR对象作为第三个参数传递给回调函数原来的答复。如果你想要它,你需要使用这个:function(data, statusText, xhr) {而不是这个function(data) {

现在,如果您的成功回调没有被调用,那是另一回事。尝试在回调中添加alert(statusText);以确保它被调用。如果未被调用,请按@regilero提及,并使用$.ajax并传递一个错误处理程序来查看是否有任何错误消息弹出。

第一个答案是错的其实你可以终止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) { 
     // .... 
    } 
});