请在jQuery中解释JSONP

我无法理解jQuery.ajax的文档,特别是两个选项: jsonpjsonpCallback ,所以有人可以这么愉快地解释吗?

我的理解是jsonp是服务器期望的GET参数的名称(通常是’回调’), jsonpCallback是包装响应的函数的名称。 看似简单。

但是jQuery.ajax doc的解释使这有点复杂。 我想在这里引用jsonp选项的完整文本,并用粗体标记对我来说模糊不清的内容:

JSONP

覆盖jsonp请求中的回调函数名称。 在‘callback =?’中将使用此值代替’callback url中查询字符串的一部分。 所以{jsonp:’onJSONPLoad’}会导致‘onJSONPLoad =?’ 传递给服务器。 从jQuery 1.5开始,将jsonp选项设置为false可防止jQuery将“?callback”字符串添加到URL或尝试使用“=?” 转型。 在这种情况下, 您还应该显式设置jsonpCallback设置。 例如,{jsonp:false,jsonpCallback:“callbackName”}

所以问题是:

1.这是什么意思“=?”‘回调=?’ (额外的问号)? 当我执行像这里的JSONP AJAX请求时:

  $.ajax('http://fake.com',{ dataType: 'jsonp', success: function(data) {console.log(data);} }); 

URL看起来像这样,没有这样的问号:

 http://fake.com/?callback=jQuery18104830878316494931_1352981996209&_=1352981999411 

2.什么是额外参数(下划线) _=1352981999411

3. In this case, you should also explicitly set the jsonpCallback setting是什么意思? 我看不出任何相互关系。 如果我设置{ jsonp: false, jsonpCallback: "callbackName" } ,正如文档中所述,查询将如下所示:

 http://fake.com/?_=1352981999411 

根本没有使用“callbackName”,为什么要指定它呢?

我的欣赏。

回调名称是可选的,如果您不提供回调名称,则使用默认名称。 因此,如果你遗漏onJsonLoad你就会得到callback

会发生什么是JSON包含一个函数,因为JSONP通过标记工作,所以你的普通JSON:

 {prop: value} 

变为:

 callback({prop: value}); 

加载脚本标记后,jQuery可以调用此函数并获取JSON数据。

_=123456788只是一个Date.getTime()来阻止缓存请求。

JSONP背后的想法如下:

由于跨域策略,不允许为外部源请求数据。 假设我的服务器有一个函数,如果你输入他的电话号码,它会返回一个人的姓名。

您的网站不在我的域中,不允许对我的服务器执行ajax调用并接收数据Flater

此规则有一个例外,即使用外部加载的脚本。 我可以加载托管在另一台服务器上的jQuery.js文件等。我不能从外部服务器请求数据 ,但我可以请求javascript

所以你不可能收到这个结果:

 Flater 

但是可以将它放在你的页面上:

  

你将收到常规的javascript,例如

  

这意味着(以及这里的重要部分)您还可以收到以下javascript:

  

假设您已在页面上定义了函数doSomething() 。 这将是一个有效的javascript,因为它调用了一个现有的函数,虽然这个代码片段起源的服务器( http://externalserver.com/script.js )不知道函数doSomething发生了什么。

所以从技术上讲,你能够在开始时检索你想要的数据(我使用了一个字符串作为例子,但JSON就一样有效),并且它周围的javascript仅用作橱窗装饰('padding') 。

现在大多数启用JSONP的站点都会选择该function的名称。 例如:

  

会回来的

    

这意味着如果您已经定义了用作回调参数的函数名称,则可以有效地告诉外部服务器将JSON传递给哪个函数。

如果你有多个function都需要工作,这是非常方便的。

我希望我能够清除JSONP的预期用途? 如果您有疑问,请问:-)

UPDATE

顺便说一句,我在示例中使用了脚本标记。 就像你已经提到的那样,jQuery已经发展到了基本上看起来像ajax调用的程度(应该如此)。 但是,我认为更容易向您解释正在发挥作用的核心原则。

callback=?

Jquery会在看到回调名称时自动生成回调名称?

在某些API中,您需要提供API概述的特定回调。

在大多数情况下,服务器只使用PHP作为示例使用$_GET['callback'] 。 在你的情况下它会发回

 jQuery18104830878316494931_1352981996209( /* json string*/) 

jQuery18104830878316494931_1352981996209是回调。

为了更好地理解,请在浏览器控制台Net或Network选项卡中检查jsonp请求。 你可以看到jQuery发送的参数,并看到完整的响应