请在jQuery中解释JSONP
我无法理解jQuery.ajax的文档,特别是两个选项: jsonp
和jsonpCallback
,所以有人可以很愉快地解释?
我的理解是, 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