浅析JSONP技术原理及实现

作者:Jacky.Zhuo 时间:2024-05-28 15:41:10 

跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是JSONP

JSONP在我的理解,它并不是ajax,它是在文档中插入一个script标签,创建_callback方法,通过服务器配合执行_callback方法,并传入一些参数

JSONP的局限就在于,因为是通过插入script标签,所以参数只能通过url传入,因此只能满足get请求,特别jQuery的ajax方法时,即使设置type: 'POST',但是只要设置了dataType: 'jsonp',在请求时,都会自动使用GET请求

实现逻辑

step1: 创建_callback方法 (_callback中可以删除script标签和_callback方法)

step2: 插入script标签

step3: 服务器输出js

实现:


var requestJsonp = function (opt) {
var funName, script;
/*
* step1 创建_callback方法
*/
//_callback函数名
funName = '_cb' + (Math.random() * 1000000);
//创建_callback方法
window[funName] = function (data) {
if (typeof opt.success == 'function') {
opt.success(data);
}
window[funName] = null;
delete window[funName];
document.body.removeChild(script);
script = null;
};
/*
* step2 插入script标签
*/
script = document.createElement('script');
script.type = 'text/javascript';
script.src = opt.url + (opt.url.indexOf('?') > -1 ? '&' : '?') + '_callback=' + funName;
document.body.appendChild(script);
/*
* step3 服务器输出js
* 服务器应接受url参数中_callback的值,作为函数名执行输出js
* 类似输出
* _callback({"name":"jsonp","description":"jsonp test"});
*/
/*
* 处理error
*/
script.addEventListener('error', function () {
window[funName] = null;
delete window[funName];
if (typeof opt.error == 'function') {
opt.error();
}
document.body.removeChild(script);
script = null;
});
};
requestJsonp({
url: 'http://www.url.org?tid=Jsx2',
success: function (data) {
console.log(data);
},
error: function () {
console.log('request error!');
}
});

对于浏览器的行为就是插入script标签,执行js代码, 删除script标签

实现代码并没有考虑兼容以及传入data后生成url的问题。

下面给大家说下jsonp的优缺点:

JSONP的优点是:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制;它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持;并且在请求完毕后可以通过调用callback的方式回传结果。

JSONP的缺点则是:它只支持GET请求而不支持POST等其它类型的HTTP请求;它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题。

以上所述是小编给大家介绍的浅析JSONP技术原理及实现的相关知识网站的支持!

标签:jsonp,原理,实现
0
投稿

猜你喜欢

  • 使用JavaScript构建JSON格式字符串实现步骤

    2024-04-18 09:42:12
  • 基于Python实现一键找出磁盘里所有猫照

    2022-06-20 03:52:32
  • 新手必备之MySQL msi版本下载安装图文详细教程

    2024-01-26 04:04:05
  • python-docx修改已存在的Word文档的表格的字体格式方法

    2021-07-20 05:03:07
  • 基于python框架Scrapy爬取自己的博客内容过程详解

    2021-12-21 06:39:30
  • vue+element树组件 实现树懒加载的过程详解

    2024-05-25 15:19:36
  • 利用Python中xlwt模块操作excel的示例详解

    2023-08-16 18:51:47
  • windows系统下Python环境的搭建(Aptana Studio)

    2021-03-16 20:40:37
  • mysql判断当前时间是否在开始与结束时间之间且开始与结束时间允许为空

    2024-01-23 17:35:43
  • Prometheus开发中间件Exporter过程详解

    2023-04-18 16:14:13
  • python实现经典排序算法的示例代码

    2021-10-27 09:36:24
  • 一文带你掌握Python中文词频统计

    2022-11-17 21:02:00
  • 解决python使用list()时总是报错的问题

    2021-11-27 23:34:36
  • Python实现二维数组输出为图片

    2022-10-07 21:49:55
  • Python函数any()和all()的用法及区别介绍

    2021-11-23 04:43:16
  • MySQL学习(七):Innodb存储引擎索引的实现原理详解

    2024-01-25 05:53:02
  • 将数据从MySQL迁移到 Oracle的注意事项

    2008-12-03 15:41:00
  • python flask sqlalchemy连接数据库流程介绍

    2024-01-23 18:34:36
  • python获取linux和windows系统指定接口的IP地址的步骤及代码

    2023-04-22 08:22:21
  • pytorch显存一直变大的解决方案

    2021-03-03 00:03:09
  • asp之家 网络编程 m.aspxhome.com