基于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 相关文章推荐
用js 让图片在 div或dl里 居中,底部对齐
Jan 21 Javascript
类似CSDN图片切换效果脚本
Sep 17 Javascript
JavaScript mapreduce工作原理简析
Nov 25 Javascript
js判断字符长度以及中英文数字等
Dec 31 Javascript
javascript的push使用指南
Dec 05 Javascript
jquery实现对联广告的方法
Feb 05 Javascript
AngularJS基础 ng-paste 指令简单示例
Aug 02 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
sublime text配置node.js调试(图文教程)
Nov 23 Javascript
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
vue移动端微信授权登录插件封装的实例
Aug 28 Javascript
JS实现动态星空背景效果
Nov 01 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 __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
js导出格式化的excel 实例方法
2013/07/17 Javascript
AngularJS入门教程(一):静态模板
2014/12/06 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
BootStrap modal实现拖拽功能
2018/12/01 Javascript
JavaScript原型对象原理与应用分析
2018/12/27 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[04:53]DOTA2英雄基础教程 祈求者
2014/01/03 DOTA
[40:03]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#1EHOME VS Archon
2016/03/02 DOTA
python支持断点续传的多线程下载示例
2014/01/16 Python
python多进程实现进程间通信实例
2017/11/24 Python
TensorFlow实现简单卷积神经网络
2018/05/24 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
Python unittest基本使用方法代码实例
2020/06/29 Python
python中altair可视化库实例用法
2021/01/26 Python
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
魅力教师事迹材料
2014/01/10 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
幼儿园小班个人总结
2015/02/12 职场文书
公司管理制度范本
2015/08/03 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
创业计划书之美容店
2019/09/16 职场文书
图文详解matlab原始处理图像几何变换
2021/07/09 Python
P站美图推荐——变身女主角特辑
2022/03/20 日漫
CSS元素定位之通过元素的标签或者元素的id、class属性定位详解
2022/09/23 HTML / CSS