HTML代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Mighty Gumball(JSON)</title>
<script src="gumball.js"></script>
</head>
<body>
<h1>Migthy Gumball Sales</h1>
<div id="sales">
</div>
<script src="http://gumball.wickedlysmart.com/?callback=updateSales"></script>
</body>
</html>
javascript代码:
window.onload = function(){
}
function updateSales(sales){
var salesDiv = document.getElementById("sales");
for (var i = 0;i<sales.length;i++) {
var sale = sales[i];
var div = document.createElement("div");
div.setAttribute("class","saleItem");
div.innerHTML = sale.name+" sold "+sale.sales+" gumballs";
salesDiv.appendChild(div);
}
}
如上图代码,当浏览器想请求http://gumball.wickedlysmart.com中的JSON数据时,就会遇到跨域问题而被阻止访问。
解决办法是使用JSONP,JSONP是一种使用<script>标记获取JSON对象的方法,他可以避免XMLHttpRequest的同源安全问题。JSONP的全称是JSON with padding,含义是在请求返回的JSON中先用一个函数来包装。
其工作步骤如下:
1、HTML中包含一个<script>元素,这个script的源是一个web服务的URL,这个web服务将为我们提供JSON数据。
2、当浏览器遇到页面中的<script>元素,会向src中的URL发送一个HTTP请求。
3、服务器正常处理这个请求,发送回JSON数据,不过在发送JSON串之前,会将它包装在一个函数调用中,如updateSales调用。
4、解析和解释JSON响应时,它包装在一个函数调用中,所以会调用这个函数,并把由JSON串创建的对象传入这个函数。
注:web服务器允许指定一个回调函数,也就是自己命名函数。一般Web服务将其命名为callback,可以查看自己的web服务文档,明确web服务实际使用的参数名。
使用<script>加载JavaScript就不再安全了。
如果向一个恶意Web服务器发出一个JSONP请求,响应中可能包含有开发者不需要的JavaScript代码,浏览器会执行这些恶意的代码。所以要谨慎选择所链接的web服务。