基于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常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
Dec 25 Javascript
用JavaScript仿PS里的羽化效果代码
Dec 20 Javascript
JavaScript中String.prototype用法实例
May 20 Javascript
JavaScript+CSS实现的可折叠二级菜单实例
Feb 29 Javascript
jQuery实现点击行选中或取消CheckBox的方法
Aug 01 Javascript
JavaScript定时器setTimeout()和setInterval()详解
Aug 18 Javascript
zTree树形菜单交互选项卡效果的实现方法
Dec 25 Javascript
vue组件实现弹出框点击显示隐藏效果
Oct 26 Javascript
微信小程序仿朋友圈发布动态功能
Jul 15 Javascript
javascript 构建模块化开发过程解析
Sep 11 Javascript
layui使用form表单实现post请求页面跳转的方法
Sep 14 Javascript
详解JavaScript的this指向和绑定
Sep 08 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与SQL注入攻击[二]
2007/04/17 PHP
对象失去焦点时自己动提交数据的实现代码
2012/11/06 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
javascript之锁定表格栏位
2007/06/29 Javascript
IE8 中使用加速器(Activities)
2010/05/14 Javascript
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
原生JS和jQuery操作DOM对比总结
2017/01/19 Javascript
jQuery实现遍历复选框的方法示例
2017/03/06 Javascript
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
JS动画定时器知识总结
2018/03/23 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
vue forEach循环数组拿到自己想要的数据方法
2018/09/21 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
基于 Vue 的 Electron 项目搭建过程图文详解
2020/07/22 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
Python 遍历子文件和所有子文件夹的代码实例
2016/12/21 Python
python MySQLdb使用教程详解
2018/03/20 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
python3字符串输出常见面试题总结
2020/12/01 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
代办委托书怎样写
2014/04/08 职场文书
安全生产目标责任书
2014/04/14 职场文书
领导班子党的群众路线对照检查材料
2014/09/25 职场文书
群众路线问题查摆对照检查材料
2014/10/04 职场文书
大国崛起观后感
2015/06/02 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
2016年读书月活动总结范文
2016/04/06 职场文书
Python实现科学占卜 让视频自动打码
2022/04/09 Python
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript