手写jsonp的步骤
- 创建script元素,设置src属性,并插入文档中,同时触发AJAX请求。
- 返回Promise对象,then函数才行继续,回调函数中进行数据处理。
- script元素删除清理。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function jsonp(url,data={},callback="callback"){ data.callback = callback; let params = []; for(let key in data){ params.push(key+'='+data[key]); } console.log(url+'?'+params.join('&')) let script = document.createElement('script'); script.src = url+'?'+params.join('&'); document.body.appendChild(script); return new Promise((resolve,reject)=>{ window[callback] = (data) => { try{ resolve(data); }catch(e){ reject(e); }finally{ script.parentNode.removeChild(script); } } }) }
|
如何调用:
jsonp的原理
利用 <script>
标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP请求一定需要对方的服务器做支持才可以。
jsonp的优缺点
- 优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题。
- 缺点是仅支持get方法具有局限性,不安全可能会遭受XSS攻击。