JSONP解决跨域取数据的问题


1.就是在html尾部添加script src标签,只不过src地址要加参数(或者叫包装函数),参数即js要使用的函数

   如:<script src = "http://gumball.wickedlysmart.com/?callback = updateSales"></script>

2.例如callback这种参数,要看对方服务器的要求添加

3.这种方法,返回来的即已是js对象,无需像XMLHttpRequest使用JSON.Parse转换

4.XMLHttpRequest为了避免恶意的js访问你的服务器,所以不允许跨域,JSONP可以

5.如果需要调用第三方远程服务器数据,通常需要JSONP

6.JSON数据包装在JSONP中的函数调用称为回调,需要将回调函数制定为JSONP请求中的一个url参数,如updateSales

7.如果需要多次请求获取最新数据,就需要用setInterval定时器,定时运行函数,而不是简单的一个src,见下面例子


window.onload = init();

function init ()
{
setInterval(handleRefresh, 3000);  //3秒定时器
function handleRefresh()
{
var url = "http://gumball.wickedlysmart.com/?callback=updateSales" + "&lastreporttime=" +lastReportTime + "&random=" + (new date()).getTime();  //3个参数,最后一个用了一个获取时间的随机数,来避免浏览器缓存问题
var newScriptElement = document.createElement("script");
newScriptElement.setAttribute("src", url);
newScriptElement.setAttribute("id", "jsonp");

var oldScriptElement = document.getElementById("jsonp");
var head = document.getElementsByTagName("head")[0];   //注意这种用法,gettagname取到的是标签数组
if (oldScriptElement == null)
{
head.appendChild(newScriptElement);
}
else
{
head.replaceChild(newScriptElement, oldScriptElement);
}
}


var lastReportTime = 0;

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);
}
if (sales.length > 0)
{
lastReportTime = sales[sales.length-1].time;
}
}

### 使用 JSONP 实现请求 JSONP (JSON with Padding) 是一种通过 `<script>` 标签来绕过浏览器同源策略的技术[^1]。当页面需要向另一个名下的服务器发送请求并获数据时,可以通过动态创建 `<script>` 标签的方式加载远程资源。 #### 动态创建脚本标签 为了实现 JSONP 请求,在客户端可以编写如下 JavaScript 代码: ```javascript function createScriptTag(url, callbackName) { const script = document.createElement('script'); window[callbackName] = function(data){ console.log(`Received data from server: ${data}`); // 处理返回的数据 }; script.src = `${url}?callback=${callbackName}`; document.body.appendChild(script); } ``` 这段代码定义了一个函数 `createScriptTag` 来构建一个新的 `<script>` 元素,并将其附加到文档中。URL 参数中的 `callback` 表示回调函数名,该名称应与服务端响应一致以便执行相应的处理逻辑[^2]。 #### 服务端配合 为了让上述方法正常工作,服务端也需要做相应调整。对于来自特定 URL 的 GET 请求,应该返回一段可执行的 JavaScript 代码而不是纯 JSON 数据。例如: ```json // 假设这是原始 JSON 数据 {"name": "Alice", "age": 25} // 经过 JSONP 封装后的实际响应内容 myCallback({"name": "Alice", "age": 25}); ``` 这里假设客户端指定了名为 `myCallback` 的回调函数,则服务端会将这个字符串作为前缀加上去形成完整的 JSONP 结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值