JQuery中JSON使用扫盲 含跨域

本贴仅适合JQuery初学者,属于没有技术含量的水贴,高手们可以忽略。

先编写json.php:

<?php
echo json_encode(array(‘foo’ => ‘bar’));
?>

再编写json.htm:

<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(‘/json.php’, function(data){
alert(data.foo);
});
</script>

把两个文件放到根目录下,运行http://localhost/json.htm,就能看到效果了。

上面的例子没有什么难度,下面尝试一下在跨域情况下的效果,

编写C:\WINDOWS\system32\drivers\etc\hosts文件,加入如下映射:

127.0.0.1 www.foobar.com

修改json.htm的内容:

<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(‘http://
www.foobar.com/json.php’, function(data){
alert(data.foo);
});
</script>

此时,重启浏览器后再浏览http://localhost/json.htm,程序不会运行,会出现Permission denied错误。

这是因为由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源。

如果想规避跨域问题,可以通过使用html的script标记来进行跨域请求,并在响应中返回要执行的script代码。此技术的一种实际应用方式被称为JSONP,Remote JSON – JSONP一文对其原理做了介绍。

先修改json.htm的内容:

<script src=”http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js“></script>
<script>
$.getJSON(‘http://
www.foobar.com/json.php?callback=?‘, function(data){
alert(data.foo);
});
</script>

再修改json.php的内容:

<?php
echo $_GET[‘callback’], ‘(‘, json_encode(array(‘foo’ => ‘bar’)), ‘)’;
?>

此时,如果再浏览json.htm,就会发现即便是跨域,程序也能正常运行。

有了callback=?后,JQuery就会知道你要进行一次JSONP请求,它会自动生成一个回调函数的名字,然后替换callback=?中的问号。callback并不是必须的命名规则,而只是客户端和服务端之间的一种约定,比如说在FlickrAPI里,使用的就不是callback,而是jsoncallback。不管使用什么命名,最后不过是生成一种function_name(json_data)的调用形式而已。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

18 + = 24