2010-03-10 24 views
6

Các trạng thái $.getJSON() tài liệu:Tại sao jQuery không tự động gắn thêm gọi lại JSONP?

If the specified URL is on a remote server, the request is treated as JSONP instead. See the discussion of the jsonp data type in $.ajax() for more details.

Các tài liệu $.ajax() cho các tiểu bang loại jsonp dữ liệu (tôi nhấn mạnh):

Loads in a JSON block using JSONP. Will add an extra "?callback=?" to the end of your URL to specify the callback.

Vì vậy, có vẻ như nếu tôi gọi $.getJSON() với một URL cross-domain, "callback =" bổ sung thông số sẽ tự động được thêm vào. (Các phần khác của tài liệu hỗ trợ giải thích này.)

Tuy nhiên, tôi không thấy hành vi đó. Nếu tôi không thêm "callback =?" một cách rõ ràng, jQuery không chính xác tạo một XMLHttpRequest (trả về dữ liệu null vì tôi không thể đọc được miền phản hồi). Nếu tôi thêm nó một cách rõ ràng, jQuery sẽ thực hiện một yêu cầu kịch bản >.

Dưới đây là một ví dụ:

var URL = "http://www.geonames.org/postalCodeLookupJSON" + 
    "?postalcode=10504&country=US"; 

function alertResponse(data, status) { 
    alert("data: " + data + ", status: " + status); 
} 

$.getJSON(URL, alertResponse); 
// alerts "data: null, status: success" 

$.getJSON(URL + "&callback=?", alertResponse); 
// alerts "data: [object Object], status: undefined" 

Vì vậy, những gì đang xảy ra? Tôi có hiểu nhầm tài liệu hoặc quên điều gì đó không? Không cần phải nói rằng đây không phải là một vấn đề lớn, nhưng tôi đang tạo một API web và tôi cố tình đặt tham số gọi lại thành "gọi lại" với hy vọng điều chỉnh nó một cách độc đáo để sử dụng jQuery.

Cảm ơn!

(Edit:. Tôi cross-posted this trong các diễn đàn jQuery nếu bạn quan tâm)

Trả lời

7

Hãy thử điều này:

var URL = "http://www.geonames.org/postalCodeLookupJSON" + 
    "?postalcode=10504&country=US"; 
function alertResponse(data, status) { 
    alert("data: " + data + ", status: " + status); 
} 
$.ajax({ 
    url: URL, 
    dataType: 'jsonp', 
    jsonpCallback: 'alertResponse', 
}); 
+1

Trong ví dụ của bạn, bạn thực sự có nghĩa là 'jsonpCallback: 'alertResponse'', và có, điều đó hoạt động sau đó mà không cần tôi phải thêm rõ ràng" callback =? " tham số. Nhưng đó là quá nhiều chi tiết hơn so với sự tao nhã của '$ .getJSON()'. Sẽ tốt hơn nếu '$ .getJSON()' làm việc với tư liệu ... –

3

Vâng, tôi nghĩ rằng bạn hiểu lầm. $.getJSON là lối tắt cho $.ajax({datatype: 'json'.... như tài liệu nói. Nó không bao giờ thực hiện cuộc gọi JSONP trừ khi bạn thêm tham số callback=?.

+0

Hmm ... tôi có thực sự hiểu lầm không? Câu tôi trích dẫn khá rõ ràng: "Nếu URL được chỉ định nằm trên máy chủ từ xa, yêu cầu được xử lý dưới dạng JSONP." –

+0

Bạn nói đúng. Điều đó thật khó hiểu. –

0

Tôi đang sử dụng bên dưới mã,

$ .ajax ({ url: URL, datatype: 'jsonp', thành công: function (data) { // do something} lỗi: chức năng (jqXHR, textStatus, errorThrown) {}, jsonpCallback: 'login_callback', });

Nhưng, gọi lại đôi khi được thêm vào cuối url và đôi khi không có trong IE. Trong khi làm việc tốt trong chrome và FF.

Các vấn đề liên quan