2012-12-13 73 views
0

我一直在使用JavaScript和AJAX很長一段時間,我想了解跨域XHR是如何工作的以及JQuery如何處理它,出於某種原因,我從來沒有想過如何去思考真的行。我已閱讀Wikipedia JSONP文章,我更困惑。我不確定我不瞭解的是什麼。瞭解跨域XHR和XML數據

我知道,使用JSONP我可以直接在JavaScript中使用JSON數據。例如this JS Fiddle example。這裏我使用JSON來顯示圖像列表。我可以使用XML數據來取得同樣的效果嗎?在回答這部分問題之前,請先閱讀其餘的比喻。

1)如果我嘗試像下面或Fiddle link我得到錯誤Uncaught ReferenceError: jsonFlickrFeed is not defined

​$.ajax({ 
    url: "http://api.flickr.com/services/feeds/photos_public.gne", 
    data: { 
     format: "json" 
    }, 
    dataType: "jsonp", 
    success: function(d) { 
     console.log(d); 
    } 
});​ 

2)實例下或fiddle link工作正常

$.ajax({ 
    url : "http://api.flickr.com/services/feeds/photos_public.gne", 
    data: {format: "json"}, 
    dataType: "jsonp" 
}); 
jsonFlickrFeed = function(d){ 
    console.log(d); 
} 

Q)我1和2之間的假設,因爲返回數據格式爲jsonFlickrFeed({})我們需要編寫jsonFlickrFeed回調函數使其工作? Q)爲什麼它不會調用成功回調? Q)返回JSONP的工作(我的意思是數據的格式爲jsonFlickrFeed({}))是否是Flickr的終點?或者它只是返回實際的JSON和JQuery墊?

3)隨着$.getJSON的代碼是一樣的東西下面或fiddle

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?", { 
    format: "json" 
}, function(d) { 
    console.log(d) 
});​ 

Q)如何JQuery的照顧它的情況下,3)?我看到返回的數據格式爲jQuery1820349100150866434_1355379638775({})因此,如果我假設JQuery將JSON與回調關聯的工作是正確的? Q)由於上述原因,它被稱爲JQuery的簡寫方法?

無論我嘗試過,我都無法使用XML數據。我一直沒有想到使用XML數據而不是JSON的方式。

Q)是否有可能以類似的方式使用XML數據而不是JSON? Q)我能想到的唯一方法就是通過同一個域代理數據。這種理解是否正確?

如果這裏的幫助是XML example我有保管箱。這是爲了演示XML數據源於同一個域時可以解析它。

+2

對上述所有問題都有一個簡單的答案; JSONP通過在頁面中插入腳本標記來工作,就像任何腳本標記一樣,這就是爲什麼一些常規函數不起作用的原因,因爲它不是真正的XMLHttpRequest。至於以同樣的方式獲取XML,不可能(這是不可能的(獲取XML當然是可能的,只是與JSONP不一樣)。 – adeneo

+0

你看過CORS嗎? http://en.wikipedia.org/wiki/Cross-origin_resource_sharing如果您的瀏覽器要求不太寬泛(http://caniuse.com/cors),那麼這是一種更直接的方式來完成跨域XHR。 – joshuacronemeyer

+0

@joshuacronemeyer是的,我有。這在大多數情況下都沒有幫助。對我來說,JSON不是問題,它消耗了XML。 – ch4nd4n

回答

0

@adeneo回答了問題,但在評論中。所以我對JSONP的理解是根本上有缺陷的。當發出JSONP請求時,它不是XHR請求。相反,需要注意的是動態插入script標籤並獲取JSON。所以即使這個調用看起來像XHR(至少是IMO JQuery),事實並非如此。完全不使用XMLHttpRequest對象。

這個問題已經回答了What is JSONP all about?但我不知何故錯過了它。解釋跨域請求的另一個好資源是devlog

我提出的其他問題變得多餘了!

1

Q)是否有可能以類似的方式使用XML數據而不是JSON?

不是因爲JSONP不是json,而是javascript。客戶端需要一個來自服務器的腳本,它會在客戶端執行。 「JSONP」是一種使用腳本標籤獲取javascript對象的技巧。 你可以通過一個字符串發送一個XML到一個javascript對象中。

Q)我認爲這樣做的唯一方法是通過同一個域代理數據。這種理解是否正確?

或使服務器支持CORS

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

我的觀點是,如果域犯規允許從默認客戶端腳本來X-出身的請求,你不能做任何事情。有些瀏覽器可能允許它,但它不是默認行爲。在這種情況下,唯一的選擇是在同一個域上的代理。

+0

你確實回答了我的問題(+1),但我覺得它缺乏清晰度,所以我沒有接受你的答案。 – ch4nd4n