2013-01-21 110 views
2

我理解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()不會被觸發...由於是同域而不是跨域?

謝謝你的時間。

+0

您不能使用JSONP進行錯誤回調或同步AJAX。 [文檔](http://api.jquery.com/jQuery.ajax/)似乎不會對同服務器調用產生異常。 – Blazemonger

+0

這可能與您選擇的函數名稱有關:'quotator.testimonialFetch'爲了工作,jQuery將不得不創建一個對象併爲其分配一個函數。嘗試使用其中沒有'.'的東西。 –

+0

謝謝,Blaze。我不知道爲什麼,但刪除這些回調做了訣竅。凱文,我有一個應用程序對象已經被稱爲'引號';對不起,我繞過在示例代碼中的解釋。 :-) –

回答

1

您不能使用JSONP進行錯誤回調或同步AJAX。 The docs似乎不會對同服務器調用發出異常。

+0

我真的不知道爲什麼,但刪除這些回調做了伎倆。 –