jason是代替xml的ajax传递数据的方式:
xml方式与jason方式的对比:
1:jason方式更简单,更容易写
2:处理方式
XML方式:
取回一个XML文件
循环它,从中提取值
处理这些值,等
JSON方式:
取回JSON字符串。
‘eval’ JSON数据
由于同源策略的限制,ajax传递jason需要用到的XMLHttpRequest只允许请求当前源(包含域名、协议、端口)的资源。而如众周知,script标签经常被用来加载不同域下的资源,例如在www.a.com可以使用http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js这个js文件,可以绕过同源策略。同样的,可以通过使用script标签来进行跨域请求,但是怎么获取异域源返回的数据呢?
有这样一种方式:如果请求的这个远程数据本身就是一段可执行的js,那么这些js会被执行(相当于eval)。即若在www.a.com中存在一个showUserStatus()的js函数,它的作用是在www.a.com显示当前用户状态,
只要给它传递当前用户的状态数据就可以了。那么利用script标签请求的app.a.com中,输出数据为:showUserStatus(data),那么将会执行www.a.com中的showUserStatus(),用户当前的状态就在静态页面上显示了。
使用JSON来传递javascript对象是一种最简单的方式了,这样的跨域通讯方式称为JSONP。
<script type="text/javascript">
function showUserStatus(data) {
alert(data.txt);
}
</script>
<!--将函数名showUserStatus传递过去-->
<script type="text/javascript" src="http://chaoshi.daily.tmall.net/getIpAddress.htm?callback=showUserStatus"></script>
#set($callback=$rundata.getParameters().getString("callback"))
$!callback(["$!regin","$!city"]);
问题:1:JSONP实际上是一种脚本注入(Script Injection)方式,存在一定的安全隐患。:
2:在ajax请求时readyState改变会引发事件,告诉我们ajax调用成功了还是出错了。但是用jasonp这个方法就没有这种状态,如果出错了没办法发出出错通知。
参考资料:http://www.impng.com/web-dev/ajax-crossdomain-by-jsonp.html
http://yukaizhao.iteye.com/blog/392931