我理解JSONP如何工作的理論,但關於細節或語法的東西正在逃避我。我正在處理的示例是一個「引用輪迴」,它在使用JSON的單個域上工作正常,但我想在另一個域上使用它,只更新一個數據源。jQuery和JSONP - 跨域和相同的域
(邊注:這是奇怪,我從mydomain.com請求彈出一個CORS問題,當調用訪問subdomain.mydomain.com願望子域並沒有受到影響!)
我有一個JSON我有一個靜態函數填充文件,像這樣:
$.ajax({
type: 'GET',
url: 'http://www.mydomain.com/assets/testimonials.json',
async: false,
jsonpCallback: 'quotator.testimonialFetch',
contentType: "application/json",
dataType: 'jsonp',
success: function(json) {
console.log('success!');
console.dir(json.testimonials);
},
error: function(e) {
console.log('some sort of error!');
console.log(e.message);
}
});
:
quotator.testimonialFetch(
{
"testimonials": [
{
"quote": "Amazing product!",
"quotedName": "Somebody",
"quotedTitle": "Director of Yoyos",
"company": "Kramerica",
"products": ["product1"],
"yearmonth": 201212,
"active": true
},
{
"quote": "Never seen anything like it.",
"shortquote": "When quote is too long, use this.",
"quotedName": "Fflewddur Fflam",
"quotedTitle": "",
"company": "Prydain",
"products": ["product1","product2"],
"yearmonth": 201212,
"active": false
}
]
}
);
除了使用$.getJSON
速記(附加回調),我使用了更詳細$.ajax()
方法
它不記錄成功,但是記錄錯誤,無論我是從mydomain.com還是sub.mydomain.com進行呼叫。錯誤在於某些東西是「未定義的」。不知道這可能是什麼。
所以,最主要的是......不知道在哪裏放置處理邏輯。是否應該直接進入$.ajax()
的回調?我確實創造相匹配的填充名稱的功能,它接收數據對象:
quotator.testimonialFetch = function(data) {
// using the document ready function as a safety net; maybe I don't need to defer?
$(document).ready(function() {
quotator.quoteobj = data.testimonials;
console.log(quotator.quoteobj); // logs the object I'm expecting! Yay!
};
});
}
這不是太重要的是知道它做什麼,或者至少我不認爲它很重要。重要的是:
-當從sub.mydomain.com調用$.ajax()
時,邏輯開始執行,引號被處理,結果成功排序......「排序」,因爲雖然JSONP是由$.ajax
調用返回,則會觸發錯誤回調,然後使用回調函數正確處理數據...?!
-當從mydomain.com調用$.ajax()
時,我得到我想要的對象,但無法處理它。我可以看到我的JSONP響應,但是$.ajax
成功回調本身沒有處理,因爲錯誤回調是觸發的。然後quotator.testimonialFetch()
不會被觸發...由於是同域而不是跨域?
謝謝你的時間。
您不能使用JSONP進行錯誤回調或同步AJAX。 [文檔](http://api.jquery.com/jQuery.ajax/)似乎不會對同服務器調用產生異常。 – Blazemonger
這可能與您選擇的函數名稱有關:'quotator.testimonialFetch'爲了工作,jQuery將不得不創建一個對象併爲其分配一個函數。嘗試使用其中沒有'.'的東西。 –
謝謝,Blaze。我不知道爲什麼,但刪除這些回調做了訣竅。凱文,我有一個應用程序對象已經被稱爲'引號';對不起,我繞過在示例代碼中的解釋。 :-) –