本贴仅适合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)的调用形式而已。