基于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_03(ExtJs Grid的简单使用)
Oct 02 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
Sep 26 Javascript
js中文逗号转英文实现
Feb 11 Javascript
js操作IE浏览器弹出浏览文件夹可以返回目录路径
Jul 14 Javascript
关于js里的this关键字的理解
Aug 17 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 Javascript
js学习之----深入理解闭包
Nov 21 Javascript
详解Vue 开发模式下跨域问题
Jun 06 Javascript
Vue Cli与BootStrap结合实现表格分页功能
Aug 18 Javascript
js实现加载页面就自动触发超链接的示例
Aug 31 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
Vue组件生命周期运行原理解析
Nov 25 Vue.js
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中支持多种编码的中文字符串截取函数!
2007/03/20 PHP
PHP输出英文时间日期的安全方法(RFC 1123格式)
2014/06/13 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
win7安装php框架Yii的方法
2016/01/25 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
js 通用订单代码
2013/12/23 Javascript
IE8下Jquery获取select选中的值post到后台报错问题
2014/07/02 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
jquery基本选择器匹配多个元素的实现方法
2016/09/05 Javascript
bootstrap datepicker限定可选时间范围实现方法
2016/09/28 Javascript
解决html-jquery/js引用外部图片时遇到看不了或出现403的问题
2017/09/22 jQuery
vue-cli项目中怎么使用mock数据
2017/09/27 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
解决angularJS中input标签的ng-change事件无效问题
2018/09/13 Javascript
javascript中函数的写法实例代码详解
2018/10/28 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
用Python实现读写锁的示例代码
2018/11/05 Python
简单了解python单例模式的几种写法
2019/07/01 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
Django和Ueditor自定义存储上传文件的文件名
2021/02/25 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
英语师范专业毕业生自荐信
2013/09/21 职场文书
社团成立邀请函
2014/01/08 职场文书
安全生产检讨书
2014/01/21 职场文书
环保建议书400字
2014/05/14 职场文书
计算机售后服务承诺书
2014/05/30 职场文书
2014旅游局领导班子四风问题对照检查材料思想汇报
2014/09/19 职场文书
保研推荐信范文
2015/03/25 职场文书
小学生表扬稿范文
2015/05/05 职场文书