
本文主要是手写了jsonp的实现,以及它的原理
1. 直接上代码
/*** @author lihh* @description 表示jsonp的实现* @param {*} url 传递的url* @param {*} keyword 关键字* @returns 如果做生产包 还是需要改造的*/function jsonp(url, keyword) {return new Promise((resolve, reject) => {// 每次jsonp的函数名字都是随机的const funName = `jsonp${(Math.random() * 100000) | 0}${+new Date()}`keyword = keyword || '伏天氏'// 请求的url 必须包含callback参数,参数函数必须是全局的,这个将是回调函数url = url || `https://www.baidu.com/sugrec?prod=pc&from=pc_web&wd=${keyword}&callback=${funName}`// 其实jsonp的原理就是利用了script无跨域限制的特性const script = document.createElement('script')script.src = url// 表示回调函数,之后删除window额外添加的数据window[funName] = function (event) {resolve(event)Reflect.deleteProperty(window, funName)}script.onerror = reject// 添加到head 进行加载document.querySelector('head').appendChild(script)})}
2. 代码讲解
- 首先为了方便调用进行promise封装
- 每次创建随机的函数,用来jsonp的回调
- 请求的url中,必须包含callback参数,参数就是新创建的函数
- 创建script标签,将url赋值给他
- 其实jsonp的实现原理就是利用了script无跨域限制特性
