基于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 指导方针
Apr 05 Javascript
仿新浪微博登陆邮箱提示效果的js代码
Aug 02 Javascript
js给页面加style无效果的解决方法
Jan 20 Javascript
实例说明为什么不要行内使用javascript
Apr 18 Javascript
JavaScript中的依赖注入详解
Mar 18 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
详解JavaScript ES6中的模板字符串
Jul 28 Javascript
全面理解闭包机制
Jul 11 Javascript
js判断所有表单项不为空则提交表单的实现方法
Sep 09 Javascript
angularJs利用$scope处理升降序的方法
Oct 08 Javascript
微信小程序实现留言板(Storage)
Nov 02 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
表单验证的完整应用案例探讨
2013/03/29 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
nodejs中简单实现Javascript Promise机制的实例
2014/12/06 NodeJs
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
jQuery实现下拉加载功能实例代码
2016/04/01 Javascript
基于jQuery实现的查看全文功能【实用】
2016/12/11 Javascript
基于jQuery实现咖啡订单管理简单应用
2017/02/10 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
vue实现div拖拽互换位置
2020/07/29 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
js绘制一条直线并旋转45度
2020/08/21 Javascript
如何手写一个简易的 Vuex
2020/10/10 Javascript
详解python内置常用高阶函数(列出了5个常用的)
2020/02/21 Python
python thrift 实现 单端口多服务的过程
2020/06/08 Python
HTML5上传文件显示进度的实现代码
2012/08/30 HTML / CSS
意大利自行车商店:Cingolani Bike Shop
2019/09/03 全球购物
上海奥佳笔试题面试题
2016/11/16 面试题
最受欢迎的自我评价
2013/12/22 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
主持人演讲稿
2014/05/13 职场文书
企业安全标语
2014/06/07 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
党员教师个人对照检查材料范文
2014/09/25 职场文书
2015人事行政工作总结范文
2015/05/21 职场文书
CSS3实现模糊背景的三种效果示例
2021/03/30 HTML / CSS