jQuery Ajax方法没有返回XHR对象

时间:2011-01-07 21:27:37

标签: jquery ajax xmlhttprequest

更新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。

5 个答案:

答案 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) {
        // ....
    }
});