基于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 相关文章推荐
jquery实现的超出屏幕时把固定层变为定位层的代码
Feb 23 Javascript
javaScript 计算两个日期的天数相差(示例代码)
Dec 27 Javascript
js控制href内容的连接内容的变化示例
Apr 30 Javascript
JavaScript高级教程5.6之基本包装类型(详细)
Nov 23 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
Jan 20 Javascript
Vue.js 2.0 移动端拍照压缩图片上传预览功能
Mar 06 Javascript
Angular4学习笔记之实现绑定和分包
Aug 01 Javascript
jackson解析json字符串,首字母大写会自动转为小写的方法
Dec 22 Javascript
vue学习教程之带你一步步详细解析vue-cli
Dec 26 Javascript
浅谈webpack SplitChunksPlugin实用指南
Sep 17 Javascript
JS 自执行函数原理及用法
Aug 05 Javascript
Vue页面渲染中key的应用实例教程
Jan 12 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自动生成月历代码
2006/10/09 PHP
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php守护进程 加linux命令nohup实现任务每秒执行一次
2011/07/04 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
2013/06/28 PHP
php不用正则验证真假身份证
2013/11/06 PHP
PHP 面向对象程序设计(oop)学习笔记(一) - 抽象类、对象接口、instanceof 和契约式编程
2014/06/12 PHP
Symfony查询方法实例小结
2017/06/28 PHP
PHP常见过waf webshell以及最简单的检测方法
2019/05/21 PHP
JS宝典学习笔记(下)
2007/01/10 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
jQuery最佳实践完整篇
2011/08/20 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
2012/03/13 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
Jsonp post 跨域方案
2015/07/06 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
详解ES7 Decorator 入门解析
2019/02/18 Javascript
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
面向对象学习之pygame坦克大战
2019/09/11 Python
python重要函数eval多种用法解析
2020/01/14 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
什么是Python变量作用域
2020/06/03 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
PyCharm2020.3.2安装超详细教程
2021/02/08 Python
美的官方商城:Midea
2016/09/14 全球购物
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
巴西购物网站:Submarino
2020/01/19 全球购物
小学生综合素质评语
2014/04/23 职场文书
百万英镑观后感
2015/06/09 职场文书
雷锋电影观后感
2015/06/10 职场文书
金砖之国观后感
2015/06/11 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python