JSONP真的是一个简单的技巧来克服XMLHttpRequest相同的域策略。(如你所知,一个人不能发送Ajax(XMLHttpRequest))请求到另一个域。)
所以-而不是用XMLHttpRequest我们得用剧本HTML标记,通常用于加载JS文件,以便JS从另一个域获取数据。听起来很奇怪?
事情是-原来剧本标记可以类似于XMLHttpRequest!看看这个:script = document.createElement("script");script.type = "text/javascript";script.src = "http://www.someWebApiServer.com/some-data";
你最终会剧本段,在加载数据后如下所示:
但是,这有点不方便,因为我们必须从剧本标签。所以JSONP创建者决定这样做会更好(而且是这样):script = document.createElement("script");script.type = "text/javascript";
script.src = "http://www.someWebApiServer.com/some-data?callback=my_callback";
通知我的回调功能在那边?所以-什么时候JSONP服务器接收到请求并查找回调参数-而不是返回普通的JS数组,而是返回以下内容:my_callback({['some string 1', 'some data', 'whatever data']});
看看利润在哪里:现在我们得到了自动回调(我的回调)一旦我们得到数据就会触发。这就是我们要知道的JSONP这是一个回调和脚本标记。
注:
这些都是使用JSONP的简单例子,这些不是可以生产的脚本。
原始JavaScript演示(使用JSONP的简单Twitter提要):
function myCallback(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i
twitterEntry = dataWeGotViaJsonp[i];
text += '
' + twitterEntry['text'] + '
'}
document.getElementById('twitterFeed').innerHTML = text;
}
基本的jQuery示例(使用JSONP的简单Twitter提要):
$(document).ready(function(){
$.ajax({
url: 'http://twitter.com/status/user_timeline/padraicb.json?count=10',
dataType: 'jsonp',
success: function(dataWeGotViaJsonp){
var text = '';
var len = dataWeGotViaJsonp.length;
for(var i=0;i
twitterEntry = dataWeGotViaJsonp[i];
text += '
'
+ twitterEntry['text'] + '
'}
$('#twitterFeed').html(text);
}
});
})
JSONP代表软垫..(技术名称非常差,因为它实际上与大多数人认为的“填充”无关。)