jsonp能绕过同源策略,因为标签的src属性天然不受该策略限制,服务端需将json数据包裹在回调函数中返回,前端动态创建script标签并定义全局回调函数来执行响应。

JSONP 为什么能绕过同源策略
因为 <script></script> 标签的 src 属性天然不受浏览器同源策略限制——它本就是为加载外部 JS 而设计的,和 <img src>、<link href> 一样属于“例外通道”。JSONP 不是 AJAX,也不用 XMLHttpRequest 或 fetch,它只是动态创建一个 <script></script>,把跨域请求伪装成资源加载。
关键点在于:服务端必须配合返回可执行的 JS 代码,而不是纯 JSON。比如前端传了 callback=handleData,服务端就得返回:
handleData({"name": "jsonp", "status": "ok"})这样浏览器拿到后会立即执行,触发你提前定义好的 handleData 函数。
手动实现 JSONP 的三步核心操作
不依赖 jQuery,纯原生 JS 实现时,必须确保以下三点同时成立:
- 动态创建
<script></script>元素,设置其src为带callback=函数名参数的 URL - 全局作用域中已声明对应名称的回调函数(不能是局部函数或箭头函数)
- 服务端接收到
callback参数后,将 JSON 数据包裹进该函数调用中返回
常见错误:
– 把回调函数写在 IIFE 或模块作用域里 → 浏览器找不到函数,静默失败
– 忘记拼接 callback=xxx 参数 → 服务端不知道该包哪层壳,返回纯 JSON → JS 解析报错
– 多次点击重复插入相同 <script></script> → 可能触发多次回调,或脚本重复加载
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
jQuery 的 dataType: "jsonp" 是怎么工作的
jQuery 封装掩盖了底层细节,但行为本质没变:
- 它会自动为你生成一个唯一函数名(如
jQuery123456789_1234567890),挂到window上 - 把该函数名作为
callback参数拼进 URL(也可手动指定jsonpCallback) - 请求完成后自动清理这个临时函数和插入的
<script></script>标签
注意:$.ajax({ dataType: "jsonp" }) 会忽略你写的 type: "POST",强制走 GET;也**不支持设置 timeout 或捕获网络错误**——script 加载失败时,只有 error 回调可能触发,但无法区分是 404、超时还是语法错误。
JSONP 的硬性限制和替代建议
这些不是“坑”,而是协议层面的死约束,改不了:
- 只支持 GET 请求:由
<script src="..."></script>的机制决定,没法带 body,也没法设 header - 无法获取 HTTP 状态码:成功与否全靠 JS 执行是否出错,服务端返回 500 但内容仍是合法 JS,前端就认为“成功”
- 无凭据传递能力:默认不会发送 cookie 或 authorization header(除非显式设
withCredentials: true,但 script 标签根本不支持)
现在绝大多数场景下,优先用 CORS 配合 fetch。只有当你必须兼容 IE8/9,或对接的旧 API 只提供 JSONP 接口时,才真正需要它。别为了“看起来高级”而选 JSONP。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










