1.JSONP(JSON with
Padding-填充json数据也就是常用的json跨域方式):利用script标签,通过特定的src地址的调用,来执行一个客户端的js函数,在
服务器端生成相对的数据(json格式)并以参数的形式传递给这个客户端的js函数并执行这个函数,前提是需要服务器端的数据输出支持。
2.为什么使用JSONP:由于 JSON 只是一种含有简单括号结构的纯文本,因此许多通道都可以交换 JSON
消息。因为同源策略的限制,我们不能在与外部服务器进行通信的时候使用
XMLHttpRequest。而JSONP是一种可以绕过同源策略的方法,即通过使用 JSON 与 <script>
标记相结合的方法,从服务端直接返回可执行的JavaScript函数调用或者JavaScript对象。
3.谁在使用JSONP:dojo、JQuery、Youtube GData API 、Google Social Graph API 、Digg API 、GeoNames webservice、豆瓣API、Del.icio.us JSON API等。
------------------------------------------------------------------------------------------------
和 AJAX 一样,JSONP 实际上也是早已存在,只是说法相对比较新颖(貌似也出来很久了)。自 1.2 版本起,JQuery加入了对 JSONP 的支持(http://docs.jquery.com/Ajax/jQuery.getJSON#urldatacallback)。我们可以很容易的利用 $.getJSON() 方法(或者其它基于 $.ajax() 的方法),来跨域加载 JSON 数据。我参考官网,写了个JQ测试的例子:
a.html
<html>
<head>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<script type="text/javascript">
function do_jsonp() {
$.getJSON("http://active.zol.com.cn/guofeng/profile2.php?callback=?",
function(data) {
$('#result').val('My name is: ' + data.nick);
});
}
</script>
<a href="javascript :do_jsonp();">Click me</a><br />
<textarea id="result" cols="50" rows="3"></textarea>
</body>
</html>
profile2.php
<?php
$callback = isset($_GET['callback']) ? $_GET['callback'] : '';
$json = '';
//php数组
$arr = array(
'name' => 'lava',
'nick' => '比目鱼',
'contact' => array(
'MSN' => 'lavaguo#msn.com',
'email' => 'guo.feng#zol.com.cn',
'website' => 'http://www.zol.com.cn',
)
);
$arr = gb2312ToUtf8($arr);//中文需要转UTF-8
$json = json_encode($arr);//转成json数组
if (!empty($callback)) {
$json = $callback . '(' . $json . ')';//注意这里的格式,调试时这里费了点时间
}
echo $json;
function gb2312ToUtf8(&$input)
{
if (!is_array($input)) {
$input = iconv('GB2312', 'UTF-8', $input);
} else {
foreach ($input as $k=>$v) {
gb2312ToUtf8(&$input["$k"]);
}
}
return $input;
}
?>
你可能注意到上面的例子中,url 被写成了http://active.zol.com.cn/guofeng/profile2.php?callback=?,需要说明的是,这个问号会被 jQuery 自动替换为回调函数的函数名(如果是一个匿名函数,JQuery 会自动生成一个带时间戳的函数名)。
总结下JSONP原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。
此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)
转自:http://blog.zol.com.cn/859/article_858048.html
posted on 2009-11-25 15:36
紫蝶∏飛揚↗ 阅读(1216)
评论(0) 编辑 收藏 所属分类:
JQuery