当前位置: 移动技术网 > IT编程>开发语言>JavaScript > 基于ajax和jsonp的原生封装(实例)

基于ajax和jsonp的原生封装(实例)

2017年12月12日  | 移动技术网IT编程  | 我要评论

最近在学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的原生封装(实例)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网