浅析JSONP技术原理及实现
来源: 阅读:769 次 日期:2016-06-17 17:26:23
温馨提示: 小编为您整理了“浅析JSONP技术原理及实现”,方便广大网友查阅!

这篇文章主要介绍了浅析JSONP技术原理及实现 的相关资料,非常不错具有参考借鉴价值,需要的朋友可以参考下

跨域问题一直是前端中常见的问题,每当说到跨域,第一浮现的技术必然就是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技术原理及实现
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:hfpxwx
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map