请在jQuery中解释JSONP

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

我的理解是, jsonp是服务器期望的GET参数的名称(通常是“callback”),而jsonpCallback是包装响应的函数的名称。 看起来很简单。

但jQuery.ajax文档中的解释使得这有点复杂。 我想在这里引用jsonp选项的完整文本,并用粗体标出对我来说晦涩的内容:

JSONP

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

所以问题是:

什么意思是“=?”'callback =?' (额外问号)? 当我执行像这样的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" } ,就像在doc中所说的那样,查询将如下所示:

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

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

我的赞赏。


回调名称是可选的,如果您不提供默认回调名称。 因此,如果你放弃了onJsonLoad你就会得到callback

会发生什么是JSON包装了一个函数,因为JSONP通过<script>标记工作,所以你的正常JSON:

{prop: value}

变为:

callback({prop: value});

当脚本标签被加载时,jQuery可以调用该函数并获取JSON数据。

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


JSONP背后的想法如下:

由于跨域策略,不允许为外部源请求数据。 假设我的服务器有一个功能,可以在您输入电话号码时返回一个人的姓名。

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

这个规则有一个例外,那就是使用外部加载的脚本。 我可以加载另一台服务器上托管的jQuery.js文件等。我无法从外部服务器请求数据 ,但我可以请求JavaScript

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

Flater

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

<script src="http://externalserver.com/script.js">

你会收到常规的JavaScript,例如

<script>
    function doSomething(value) {
        alert(value);
    }

    doSomething("First");
    doSomething("Second");
</script>

这意味着(和这里的重要部分),你可以收到以下的JavaScript:

<script>
    doSomething("Flater");
</script>

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

因此,从技术上讲,你可以在开始时检索你想要的数据(我用一个字符串作为例子,但JSON将一样有效),并且它周围的JavaScript仅仅用作窗口修饰('padding') 。

现在大多数启用了JSONP的网站允许你做的是选择功能的名称。 例如:

<script src="http://externalserver.com/script.js?callback=doSomething">
<script src="http://externalserver.com/script.js?callback=banana">
<script src="http://externalserver.com/script.js?callback=Process_Name">

会返回

<script>
    doSomething("Flater");
</script>
<script>
    banana("Flater");
</script>
<script>
    Process_Name("Flater");
</script>

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

如果您有多个功能都需要工作,这非常方便。

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

UPDATE

顺便说一下,我在示例中使用了脚本标记。 就像你已经提到的那样,jQuery已经发展到了基本看起来像ajax调用的地步(它应该)。 但是,我认为向你解释核心原则会更容易。


callback=?

jquery会自动生成回调名称,当它看到?

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

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

jQuery18104830878316494931_1352981996209( /* json string*/)

jQuery18104830878316494931_1352981996209是回调。

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

链接地址: http://www.djcxy.com/p/8335.html

上一篇: Please explain JSONP in jQuery

下一篇: What is the difference between JSON and JSONP?