2009-11-28 48 views
8

如何在$.getJSON(跨域)中使用beforeSend回調。

更具體地說$.getJSON是呼叫的是YQL服務 像

SELECT * FROM HTML,其中 URL =」 http://www.yahoo.com

+0

準確地做什麼? – tvanfosson 2009-11-28 14:14:18

+0

要顯示加載gif ... – 2009-11-28 14:51:48

+1

爲什麼不只是顯示加載gif ...然後調用getJSON? – James 2009-11-28 15:37:40

回答

28

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 
} 
1

我想你想使用$.ajaxStart()$.ajaxStop()。這些將允許您顯示並隱藏ajax/JSON請求中的加載gif。如果有多個Ajax請求正在進行,它也是正確的。

5

$ .getJSON只是一個簡捷功能到$就功能

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調用只需使用$就喜歡:

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

另一種選擇是使用$.ajaxSend$.ajaxComplete函數,但這會使這些函數在每個ajax調用之前和之後被調用。

1

我認爲您使用JSONP從另一臺服務器調用腳本。 我做了功課,JSONP調用中沒有beforeSend事件。

1

正確的方法是使用beforeSend回調,因爲完整的回調不叫上緩存的查詢,因爲一個請求是不是在這種情況下發送,因此beforeSend也不會被調用。換句話說,如果你在創建你的$ .Ajax請求之前顯示一個加載圖像,並且在完成該請求之前依靠隱藏它,如果查詢被緩存,你的加載圖像將被卡在「show」上。

所以這是正確的方法;

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