2009-11-28 25 views
8

Làm cách nào để sử dụng beforeSend gọi lại trong $.getJSON (tên miền chéo).

Cụ thể hơn $.getJSON là gọi là một dịch vụ YQL Giống như

select * from html nơi url =”http://www.yahoo.com

+0

Để làm điều gì, chính xác? – tvanfosson

+0

Để hiển thị gif tải ... –

+1

Tại sao không chỉ hiển thị gif tải ... và sau đó gọi getJSON? – James

Trả lời

28

Mục đích duy nhất của beforeSend là lấy đối tượng XHR thô (thường để đặt tiêu đề HTTP trên đó). Bạn không cần nó để đá off spinners và muốn. Mã này đây (từ @petersendidit):

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

Được viết tốt hơn như thế này:

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

Có nghĩa là, trừ khi bạn cần bất kỳ tùy chọn nâng cao trong jQuery.ajax, kế hoạch ban đầu của bạn để sử dụng jQuery. getJSON là tốt. Vì vậy, bạn nói rằng bạn muốn hiển thị một GIF tải, chỉ cần làm điều này và quên đi beforeSend.

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

Tôi nghĩ rằng bạn muốn sử dụng $.ajaxStart()$.ajaxStop(). Chúng sẽ cho phép bạn hiển thị và ẩn gif tải trên các yêu cầu ajax/JSON. Nó cũng làm điều đúng nếu có nhiều yêu cầu ajax đang diễn ra.

5

$ .getJSON chỉ là một chức năng cắt ngắn để các chức năng $ .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"); 
}, 

Vì vậy, nếu bạn đã bao giờ cần phải làm gì hơn thì getJSON cơ bản các cuộc gọi chỉ cần sử dụng $ .ajax như:

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

Tùy chọn khác là sử dụng các chức năng $.ajaxSend$.ajaxComplete nhưng điều này sẽ làm cho các chức năng đó được gọi trước và sau mỗi cuộc gọi ajax.

1

Tôi nghĩ bạn đang sử dụng JSONP để gọi tập lệnh từ máy chủ khác. Tôi đã làm bài tập về nhà của mình và không có sự kiện beforeSend nào trong cuộc gọi JSONP.

1

Phương pháp chính xác là sử dụng gọi lại beforeSend, vì gọi lại hoàn toàn không được gọi trên truy vấn được lưu trong bộ nhớ cache, vì yêu cầu không được gửi trong trường hợp này, do đó beforeSend không được gọi.

Một từ khác, nếu bạn hiển thị hình ảnh tải trước khi tạo yêu cầu $ .Ajax và dựa vào ẩn trong yêu cầu đó, nếu truy vấn được lưu trong bộ nhớ cache, hình ảnh tải của bạn sẽ bị kẹt trên "hiển thị".

Vì vậy, đây là phương pháp chính xác;

$.ajax({ 
url: url, 
dataType: "json", 
beforeSend: function() { 
    $('.loading').show(); 
}, 
success: function(data) { 
    // Do stuff... 
}, 
complete: function() { 
    $('.loading').hide(); 
}}); 
Các vấn đề liên quan