JSONP(JSON with Padding)是JSON的一种“使用模式”。目的是为了解决主流浏览器的跨域数据访问的问题。原理是利用 <script> 元素的开放策略,网页可以得到从其他来源动态获取的 JSON 数据,数据被包裹在一个JavaScript 函数中。

其实就是创建一个script元素,将其src设置为一个链接,并拼接一个callback参数,它的值就是自定义的回调函数的名称,script标签请求这个地址后返回一个执行自定义回调函数的语句,并且将想要跨域获取的数据作为这个自定义回调函数的参数,浏览器会自动执行这个自定义回调函数。

接下来举一个使用jsonp实现淘宝联想词的例子:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<meta http-equiv="X-UA-Compatible" content="ie=edge">

<title>联想词</title>

<style>

body,ul,li{

margin: 0;

padding: 0;

list-style: none;

}

.wrapper{

position: relative;

width: 627px;

margin: 60px auto;

}

.search{

margin-right: 74px;

border: 2px solid #ff5000;

border-top-left-radius: 20px;

border-bottom-left-radius: 20px;

border-right: none;

overflow: hidden;

}

.search input{

padding: 6px 0;

text-indent: 10px;

width: 551px;

height: 24px;

border: none;

outline: none;

}

.btn{

position: absolute;

top: 0;

right: 0;

font-size: 18px;

font-weight: 700;

width: 74px;

height: 40px;

border: none;

border-top-right-radius: 20px;

border-bottom-right-radius: 20px;

background-color: #FF4200;

color: #fff;

outline: none;

}

.list{

display: none;

position: absolute;

top: 38px;

left: 0;

right: 74px;

z-index: 100;

border: 1px solid #ccc;

background-color: #fff;

}

</style>

</head>

<body>

<div class="wrapper">

<div class="search">

<input type="text">

</div>

<button class="btn">搜索</button>

<ul class="list"></ul>

</div>

<script>

var oInput = document.getElementsByTagName('input')[0];

var oUl = document.getElementsByClassName('list')[0];

oInput.oninput = function () {

var value = oInput.value;

console.log(value)

var oScript = document.createElement('script');

oScript.src = 'https://suggest.taobao.com/sug?code=utf-8&q=' + value + '&callback=cb';

document.body.appendChild(oScript);

oScript.remove();

}

function cb(data) {

if (data.result.length > 0) {

var str = '';

data.result.forEach(function (ele, index) {

str += '<li>' + ele[0] + '</li>';

});

oUl.innerHTML = str;

oUl.style.display = "block";

} else {

oUl.style.display = "none";

}

}

</script>

</body>

</html>

03-14 08:44