$.getJSON中的beforeSend

12

如何在跨域的情况下使用beforeSend回调函数来处理$.getJSON方法?

更具体地说,$.getJSON方法是用于调用YQL服务的,例如:

select * from html where url=”http://www.yahoo.com


显示加载动画... - Quintin Par
1
为什么不直接显示加载动画,然后调用getJSON呢? - James
5个回答

38

beforeSend的唯一目的是获取原始的XHR对象(通常用于在其上设置HTTP头)。您不需要它来启动旋转器等操作。这里的代码(来自@petersendidit):

jQuery.ajax({
    url: url,
    dataType: "json",
    beforeSend: function(){
        $('.loading').show();
    }
});

最好这样写:

$('.loading').show();
jQuery.ajax({
    url: url,
    dataType: "json"
});

这意味着,除非你需要 jQuery.ajax 中的任何高级选项,否则你原来的计划使用 jQuery.getJSON 是完全可以的。所以如果你想显示一个加载 GIF,只需这样做,不用再考虑 beforeSend

jQuery(".someSpinnerImage").show();
jQuery.getJSON("http://www.somedomain.com/someurl", function(data) {
    jQuery(".someSpinnerImage").hide();
    // Do something with data
}

6

$.getJSON只是$.ajax函数的一种简化方式

get: function( url, data, callback, type ) {
   // shift arguments if data argument was ommited
   if ( jQuery.isFunction( data ) ) {
      callback = data;
      data = null;
   }
   return jQuery.ajax({
       type: "GET",
       url: url,
       data: data,
       success: callback,
       dataType: type
   });
}, 
getJSON: function( url, data, callback ) {
    return jQuery.get(url, data, callback, "json");
},

所以,如果您需要执行更多基本的getJSON调用之外的任何操作,请使用$.ajax,例如:

jQuery.ajax({
    url: url,
    dataType: "json",
    beforeSend: function(){
        $('.loading').show();
    }
});

另一种选择是使用 $.ajaxSend $.ajaxComplete函数,但这将使这些函数在每个ajax调用之前和之后被调用。

1

正确的方法是使用beforeSend回调,因为在缓存查询中不会调用complete回调,因为在这种情况下不发送请求,因此也不会调用beforeSend。

换句话说,如果您在创建$ .Ajax请求之前显示加载图像,并依赖于在完成该请求期间隐藏它,如果查询被缓存,则您的加载图像将被卡在“显示”状态。

因此,这是正确的方法;

$.ajax({
url: url,
dataType: "json",
beforeSend: function() {
    $('.loading').show();
},
success: function(data) {
    // Do stuff...
},
complete: function() {
    $('.loading').hide();
}});

1

我认为您想要使用 $.ajaxStart()$.ajaxStop()。它们可以让您在 Ajax/JSON 请求时显示和隐藏加载图像。如果有多个 Ajax 请求正在进行,它还会做正确的事情。


1

我认为你正在使用JSONP从另一个服务器调用脚本。 我做了功课,发现在JSONP调用中没有beforeSend事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接