欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > 【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

2025/4/24 4:33:04 来源:https://blog.csdn.net/qq_59344127/article/details/147415297  浏览:    关键词:【前端】【业务逻辑】【面试】JSONP处理跨域原理与封装

🧠 一、JSONP 是什么?

项目内容
📌 全称JSON with Padding
📍 用途跨域请求数据的一种方式,绕过同源策略
📦 本质通过 <script> 标签加载远程 JS 文件,这个文件执行一个回调函数并传入数据

🔍 二、JSONP 工作原理(层层递进)

  1. 定义全局回调函数

    function jsonpCallback(data) { console.log(data); }
    
  2. 创建 <script> 标签并设置 src

    script.src = 'http://example.com/api?callback=jsonpCallback';
    
  3. 服务器响应 JavaScript 代码

    jsonpCallback({ name: "Tom" });
    
  4. 浏览器执行返回的代码

    • 调用了你定义的 jsonpCallback 函数
    • 参数就是服务端返回的数据 ✅

❌ 三、常见错误

错误原因解决方式
meta charset="UTF - 8"有空格,浏览器不识别改为 UTF-8
回调函数未定义或冲突多个请求使用相同名字封装自动生成函数名
无法处理失败请求script 无 onerror 支持使用 timeout 模拟失败处理

🔧 四、封装 JSONP 工具函数(现代化 Promise 版)

✅ 功能要点:

  • 支持 URL 和参数拼接
  • 自动生成唯一回调名
  • 超时处理
  • 自动清理 script 和回调函数
  • 支持 Promise,可以用 .thenasync/await

✅ 封装代码:

function jsonp(url, params = {}, timeout = 5000) {return new Promise((resolve, reject) => {const callbackName = `jsonp_cb_${Date.now()}_${Math.random().toString().slice(2)}`;params.callback = callbackName;const queryString = Object.entries(params).map(([key, val]) => `${encodeURIComponent(key)}=${encodeURIComponent(val)}`).join('&');const script = document.createElement('script');script.src = `${url}?${queryString}`;script.async = true;window[callbackName] = (data) => {clearTimeout(timer);resolve(data);cleanup();};const timer = setTimeout(() => {reject(new Error('JSONP request timeout'));cleanup();}, timeout);function cleanup() {script.remove();delete window[callbackName];}document.body.appendChild(script);});
}

✅ 使用示例:

jsonp('http://example.com/api', { foo: 'bar' }).then(data => console.log('成功获取数据:', data)).catch(err => console.error('失败:', err));

🚀 五、JSONP 的优劣对比

优势局限
兼容老浏览器、实现跨域只能 GET 请求
使用简单安全性差(可能被注入恶意代码)
不依赖 XMLHttpRequest不支持 HTTP 状态码、错误处理有限

🧩 六、扩展方向(可选封装能力)

  • 支持取消请求(Abort)
  • 支持 callback 参数名自定义(如 cbfunc
  • 支持多个 JSONP 同时请求(自动管理全局空间)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词