基于ajax和jsonp的原生封装(实例)


Posted in Javascript onOctober 16, 2017

最近在学ajax和跨域,于是就自己封装了一个,虽然有点粗糙但还是可以用的。其实jsonp的本质就是:动态创建script标签,然后通过src属性发送跨域请求,然后服务器端响应的数据格式为【函数调用(foo(实参))】,所以在发送请求之前必须先声明一个函数,并且函数的名字与参数中传递的名字要一致。这里声明的函数是由服务器响应的内容(实际就是一段js代码-函数调用)来调用。

其他的就不多说了,直接上代码。

'use strict';
function ajax(obj){
var defaults = {
type:'get',
url:'#',
dataType:'text',
jsonp:'callback',
data:{},
async:true,
success:function(data){console.log(data);}
};
for(var k in obj){
defaults[k] = obj[k];
}
if(defaults.dataType == 'jsonp') {
//调用jsonp
ajaxForJsonp(defaults);
}
else {
//调用ajax json
ajaxForJson(defaults);
}
}

//json数据格式
function ajaxForJson(defaults){
//1、创建XMLHttpRequset对象
var xhr = null;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest();
}
else {
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
var param = '';
for(var key in defaults.data) {
param += key + '='+ defaults.data[key] + '&';
}
if(param){
param = param.slice(0, param.length-1);
}
// 处理get请求参数并且处理中文乱码问题
if(defaults.type == 'get') {
defaults.url += '?' + encodeURI(param);
}
//2、准备发送(设置发送的参数)
xhr.open(defaults.type,defaults.url,defaults.async);
// 处理post请求参数并且设置请求头信息(必须设置)
var data = null;
if(defaults.type == 'post') {
data = param;
//设置请求头
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
}
// 3、执行发送动作
xhr.send(data);
//处理同步请求,不会调用回调函数
if(!defaults.async) {
if(defaults.dataType == 'json'){
return JSON.parse(xhr.responseText);
}
else {
return xhr.responseText;
}
}
//// 4、指定回调函数(处理服务器响应数据)
xhr.onreadystatechange = function() {
if(xhr.readyState == 4){
if(xhr.status == 200){
var data = xhr.responseText;
if(defaults.dataType == 'json'){
data = JSON.parse(data);
}
defaults.success(data);
}
}
}
}

//跨域jsonp
function ajaxForJsonp(defaults){
//cbName默认的是回调函数名称
var cbName = 'jQuery' + ('1.12.2' + Math.random()).replace(/\D/g,'') + '_' + (new Date().getTime());
if(defaults.jsonpCallback) {
cbName = defaults.jsonpCallback;
}
//这里就是回调函数,调用方式:服务器响应内容来调用
//向window对象中添加一个方法,方法名是变量cname的值
window[cbName] = function(data) {
defaults.success(data);//这里success的data是实参
}
var param = '';
for(var key in defaults.data){
param += key + '=' + defaults.data[key] + '&'; 
}
if(param){
param = param.slice(0, param.length-1);
param = '&' + param;
}
var script = document.createElement('script');
script.src = defaults.url + '?' + defaults.jsonp + '=' + cbName + param;
var head = document.getElementsByTagName('head')[0];
head.appendChild(script);
}

以上这篇基于ajax和jsonp的原生封装(实例)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
WordPress 插件——CoolCode使用方法与下载
Jul 02 Javascript
使用jquery读取html5 localstorage的值的方法
Jan 04 Javascript
ExtJS4中使用mixins实现多继承示例
Dec 03 Javascript
jQuery实现根据类型自动显示和隐藏表单
Mar 18 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
May 07 Javascript
JS实现文档加载完成后执行代码
Jul 09 Javascript
基于JavaScript实现定时跳转到指定页面
Jan 01 Javascript
JS使用正则表达式找出最长连续子串长度
Oct 26 Javascript
vue-router相关基础知识及工作原理
Mar 16 Javascript
create-react-app安装出错问题解决方法
Sep 04 Javascript
es6数组includes()用法实例分析
Apr 18 Javascript
js+canvas实现五子棋小游戏
Aug 02 Javascript
AngularJS实现注册表单验证功能
Oct 16 #Javascript
原生js的ajax和解决跨域的jsonp(实例讲解)
Oct 16 #Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
Oct 16 #Javascript
Vue 2.0学习笔记之Vue中的computed属性
Oct 16 #Javascript
angular4中关于表单的校验示例
Oct 16 #Javascript
原生JS实现小小的音乐播放器
Oct 16 #Javascript
jQuery实现简单的回到顶部totop功能示例
Oct 16 #jQuery
You might like
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
zend framework文件上传功能实例代码
2013/12/25 PHP
php生成随机数的三种方法
2014/09/10 PHP
在PHP语言中使用JSON和将json还原成数组的方法
2016/07/19 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
DOM下的节点属性和操作小结
2009/05/14 Javascript
javascript中window.event事件用法详解
2012/12/11 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
2016/11/07 Javascript
jquery实现弹窗功能(窗口居中显示)
2017/02/27 Javascript
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
2017/10/20 Javascript
nodeJS进程管理器pm2的使用
2019/01/09 NodeJs
Vuex的实战使用详解
2019/10/31 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
vue-calendar-component 封装多日期选择组件的实例代码
2020/12/04 Vue.js
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python使用pymysql小技巧
2017/06/04 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
python 实现快速生成连续、随机字母列表
2019/11/28 Python
Python中常见的数制转换有哪些
2020/05/27 Python
如何通过jdbc调用存储过程
2012/04/19 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
电大毕业生自我鉴定
2013/11/10 职场文书
文明班集体申报材料
2014/05/23 职场文书
施工员岗位职责范本
2015/04/11 职场文书
晚会开幕词范文
2016/03/04 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
mysql事务隔离级别详情
2021/10/24 MySQL
《英雄联盟》2022日蚀、月蚀皮肤演示 黑潮亚索曝光
2022/04/13 其他游戏
如何通过cmd 连接阿里云服务器
2022/04/18 Servers