基于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 相关文章推荐
Javascript处理DOM元素事件实现代码
May 23 Javascript
js数组的操作详解
Mar 27 Javascript
setInterval与clearInterval的使用示例代码
Jan 28 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
jquery复选框多选赋值给文本框的方法
Jan 27 Javascript
微信小程序 flex实现导航实例详解
Apr 26 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
Apr 11 Javascript
javascript实现遮罩层动态效果实例
May 14 Javascript
微信小程序位置授权处理方法
Jun 13 Javascript
原生JavaScript实现刮刮乐
Sep 29 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
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
php array_merge_recursive 数组合并
2016/10/26 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
javascript options属性集合操作代码
2009/12/28 Javascript
让你的CSS像Jquery一样做筛选的实现方法
2011/07/10 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
TypeScript学习之强制类型的转换
2016/12/27 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
详解vue的数据binding绑定原理
2017/04/12 Javascript
JavaScript用二分法查找数据的实例代码
2017/06/17 Javascript
Vue中的scoped实现原理及穿透方法
2018/05/15 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
微信小程序实现授权登录
2019/05/15 Javascript
vue 根据选择条件显示指定参数的例子
2019/11/09 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
解决微信授权成功后点击按返回键出现空白页和报错的问题
2020/06/08 Javascript
Python程序中的观察者模式结构编写示例
2016/05/27 Python
python使用pymysql实现操作mysql
2016/09/13 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
windows下Python实现将pdf文件转化为png格式图片的方法
2017/07/21 Python
Python Tkinter实现简易计算器功能
2018/01/30 Python
python requests爬取高德地图数据的实例
2018/11/10 Python
Python实现多进程的四种方式
2019/02/22 Python
python操作小程序云数据库实现简单的增删改查功能
2019/06/06 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python爬虫之遍历单个域名
2019/11/20 Python
python logging通过json文件配置的步骤
2020/04/27 Python
keras slice layer 层实现方式
2020/06/11 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
abstract class和interface有什么区别
2013/08/04 面试题
英语道歉信范文
2014/01/09 职场文书
机电专业毕业生求职信
2014/07/01 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
Python基于百度AI实现抓取表情包
2021/06/27 Python