基于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中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
javascript与CSS复习(《精通javascript》)
Jun 29 Javascript
Jquery post传递数组方法实现思路及代码
Apr 28 Javascript
一个js控制的导航菜单实例代码
Dec 03 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
jQuery AjaxUpload 上传图片代码
Feb 02 Javascript
原生JS获取元素集合的子元素宽度实例
Dec 14 Javascript
jquery中each循环的简单回滚操作
May 05 jQuery
vue实现与安卓、IOS交互的方法
Nov 02 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
Nov 08 Javascript
vue 中 命名视图的用法实例详解
Aug 14 Javascript
vue.js的简单自动求和计算实例
Nov 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即时捕捉PHP中的错误并发送email通知的实现代码
2013/01/19 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
静态的动态续篇之来点XML
2006/08/15 Javascript
textContent在Firefox下与innerText等效的属性
2007/05/12 Javascript
javascript Keycode对照表
2009/10/24 Javascript
jQuery解决下拉框select设宽度时IE 6/7/8下option超出显示不全
2013/05/27 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
使用变量动态设置js的属性名
2014/10/19 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
JS隐藏号码中间4位代码实例
2019/04/09 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
简单的通用表达式求10乘阶示例
2014/03/03 Python
学习python类方法与对象方法
2016/03/15 Python
python web.py开发httpserver解决跨域问题实例解析
2018/02/12 Python
python实现远程通过网络邮件控制计算机重启或关机
2018/02/22 Python
python如何让类支持比较运算
2018/03/20 Python
Python socket实现简单聊天室
2018/04/01 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
2019/08/23 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
pycharm激活码有效到2020年11月底
2020/09/18 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
五月的鲜花活动方案
2014/08/21 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
公司向个人借款协议书范本
2014/10/09 职场文书
公证处委托书
2015/01/28 职场文书
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫