基于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脚本的性能的几个注意事项
Dec 22 Javascript
Stop SQL Server
Jun 21 Javascript
javascript解析json数据的3种方式
May 08 Javascript
JavaScript中windows.open()、windows.close()方法详解
Jul 28 Javascript
Javascript中arguments对象的详解与使用方法
Oct 04 Javascript
在 Node.js 中使用原生 ES 模块方法解析
Sep 19 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
Feb 21 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
Sep 01 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 Javascript
策略模式实现 Vue 动态表单验证的方法
Sep 16 Javascript
实现vuex原理的示例
Oct 21 Javascript
详解Vue slot插槽
Nov 20 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
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
详解Yii2 rules 的验证规则
2016/12/02 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
为Extjs加加速(javascript加速)
2010/08/19 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
javascript字符串替换及字符串分割示例代码
2013/12/12 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
动态JavaScript所造成一些你不知道的危害
2016/09/25 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
js 客户端打印html 并且去掉页眉、页脚的实例
2017/11/03 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
微信小程序 云开发模糊查询实现解析
2019/09/02 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
2020/04/07 Javascript
JS使用Chrome浏览器实现调试线上代码
2020/07/23 Javascript
[01:20]辉夜杯背景故事宣传片《辉夜传说》
2015/12/25 DOTA
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python基础之包的导入和__init__.py的介绍
2018/01/08 Python
Python中optparser库用法实例详解
2018/01/26 Python
详解Django中类视图使用装饰器的方式
2018/08/12 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Fossil德国官网:化石手表、手袋、珠宝及配件
2019/12/07 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
Java面向对象面试题
2016/12/26 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
干部培训自我鉴定
2014/01/22 职场文书
Python 内置函数速查表一览
2021/06/02 Python
纯CSS实现一个简单步骤条的示例代码
2022/07/15 HTML / CSS