欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-21 21:42:26
最近在学ajax和跨域,于是就自己封装了一个,虽然有点粗糙但还是可以用的。其实jsonp的本质就是:动态创建script标签,然后通过src属性发送跨域请求,然后服务器端响...

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