Re: <script> 從 DOM 移除的行為(Fwd: [whatwg] Behavior when <script> is removed from DOM)

(11/12/23 11:13), Timothy Chien wrote:
> 可以解釋一下 xhr.responseType = "jsonp"; 的行為嗎?
> 是說這樣 callback= 這個參數還要自己加嗎,還是 xhr 會自動加上去?

'callback=' 是 URL 的一部分,xhr.open 裡面的 URL 還是要自己寫的,只是等
於什麼對後來 xhr.reponse 的東西沒太大影響(合法的 ECMAScript
「identifier」就行)。

當 xhr.responseType = "jsonp" 的時後,xhr.response 就會回傳後面語法的
<js-literal> 丟進去 JSON.parse 的結果。所以也不需要定義一個全局 callback
函數。

> 因為現有的 server 實作是:
>
> * JSONP: allow cross-origin
> * JSON: does NOT allow cross-origin
>
> 如果不需要傳 callback= 就可以把 JSON 的內容當成 JSONP 抓下來解析的話,會天下大亂 ...

JSONP 的語法原文是用:

<js identifier> '(' <js-literal> ')'

而 JSON 不符合這個語法,所以不能跨來源。(respone 是 null、responseText
是 "" 等等)

你的講法就是 Jonas Sicking 反駁 Mark Miller 「可以解析成 JS 的就應該要可
以跨域」的論點很像,因為 JSON 就是合法的 JS 的一種,所以現在才會變成「可
以解析成 JSONP 的就應該要可以跨域」。(不過本來就是這樣子)

> [恕刪]
>
> 我是覺得這個功能很好啦,是很好的 adoption path(會用 JSONP 的人很容易學的會),但是不是取代 CORS 標準的方法。

如果只是單單是用 " Access-Control-Allow-Origin: * " 而已,那這個方法真是
簡單多了。主要好處是以後就不需要冒險把身心都託付給第三方 <script> 的情況
下,用第三方**現有**的 JSONP API 了。(現在很多大型網站因為安全問題不敢
用 Plurk API 之類的吧?)

相反的啟示是,現在提供 JSONP API 的供應商以後可能就沒有把 API 偷改成
callback(xhr.send(document.cookie)) 等等反竊取使用 API 網站的資料的攻擊
權利(?)了,因為 response="jsonp" 根本不是用估價(evaluate)拿回  JSON
的,而是 JSON.parse。

有這類 JSONP API 供應商想說什麼的嗎?

Received on Friday, 23 December 2011 04:10:01 UTC