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

如何优雅的封装原生ajax?原来如此简单!

程序员文章站 2024-03-19 11:46:58
...

封装原生Ajax

JQuery中的写法

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script>
<script>
    $.ajax({
        type:'get',
        url:'data.json',
        success:function (data) {
            console.log(data);
        }
    })
</script>
  • JQuery通过$符号点出一个方法ajax
  • 通过ajax()方法传入一个对象
  • 传入对象的参数有type、url和success

那么JQuery封装原生的Http请求是怎么做到的呢?

如何实现$. 这种语法

实现这种方式的写法有很多,比如说如下写法:

var $ = {
        ajax:function (opt) {
        	var url = opt.url;
            console.log(url);
        },
        get:function(opt){
        	console.log("get")
        },
        post:function(opt){
        	console.log("psot")
        }
    }
    $.ajax({
		url:"http://www.baidu.com"
	});
    $.get();
    $.post();

通过这种方式也可以实现 点 的这种形式,然后在ajax、get和post方法里面写XMLHttpRequest封装。
但是这种方式好不好呢?这种方式也行,但是这是比较老的方式了。如果说我们希望通过function,以及使用点的方式来实现呢?
也就是希望:

//使用函数的形式,来实现$.,该如何做呢?
function $(){

}
//这样写,如何实现 点语法 这样的形式呢?

ok,我们接着改造。

//我们可不可以这样呢?
 function $() {
        return {
           ajax:function (opt) {
               var url = opt.url;
               console.log(url);
           }
        }
    }
    $().ajax({
        url:'http://www.baidu,com'
    })
 

但是这样有个小括号对不对,怎么样把这个括号去掉呢?

自己实现$.语法

上面说到使用function $(){},这种方式,但是有个问题,会有个小括号,那么如何去掉这个括号呢?
其实非常简单!我们可以这样做。

var $ = (function(){
   return {
   	ajax:function(opt){
   		var url = opt.url;
   		console.log(url);
   	  }
   }
})();
$.ajax({
   url:'http://www.baidu.com'
})

如果对立即执行函数有了解的话,就很简单了,我们可以利用立即执行函数返回一个对象,这里我们就可以来实现$.ajax()。

利用XMLHttpRequest 封装自己的ajax

还是利用刚才的立即执行函数。

  • 首先写个大致的结构
var $ = (function(){
        return {
            ajax:function(opt){
                var url = opt.url;
                console.log(url);
            },
            get:function(opt){
            },
            post:function(opt){
            }
        }
    })();

实际上我们的options里面有很多选项,这里列举常用的一些。

 
var $ = (function(){
        return {
        	//每个参数应给出默认值
            ajax:function(opt){
                var opt = opt || {},
	            type = (opt.type || 'GET').toUpperCase(),
	            async = opt.async || true,
	            url = opt.url ,
	            data = opt.data || null,
	            error = opt.error || function () {},
	            success = opt.success || function(){},
	            complete = opt.complete || function(){};
                
            },
            get:function(opt){
            },
            post:function(opt){
            }
        }
    })();

上面这样写其实有些冗杂,秉着单一原则我们要对ajax函数进行抽离。并且对XMLHttpRequest进行封装。


var $ = (function(){
		//获取XMLHttpRequest 对象
		var xhr = window.XMLHttpRequest ? 
			new XMLHttpRequest : 
			new ActiveXObject("Microsoft.XMLHTTP");//处理IE5的XMLHTTP实例
		if(!xhr){
			throw new Error("您的浏览器不支持异步HTTP请求");
		}
		/**
		* 封装操作
		*/
		function _doAjax(opt){
		//每个参数应给出默认值,在该函数里面我们进行封装
				var opt = opt || {},
		            type = (opt.type || 'GET').toUpperCase(),
		            async = opt.async || true,
		            url = opt.url ,
		            data = opt.data || null,
		            error = opt.error || function () {},
		            success = opt.success || function(){},
		            complete = opt.complete || function(){};
		         if(!url){//如果没有写必须参数 就抛出错误
		         	throw new Error("您没有写URL!");
		         }
		         xhr.open(type,url,async) //async true:异步方式 false : 同步方式 这里建议异步
		         type === "POST" && xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded');//如果 type的类型是 POST的话 就要设置请求头参数,为了你的data里面的参数能正常的解析成json格式
		         xhr.send(type==='GET'? null : formatData(data));//如果是POST方法 就要对参数进行处理
		         //例如 data:{username:"张三",age:23} 这种数据就要进行拼接 username="张三"&age=23
		         //这里我们通过formatData函数来实现
		        xhr.onreadystatechange = function(){
		        //注意 在onreadystatechange 方法中 readyState 有 2 3 4这四个值
		        //其中4 表示响应已完成;您可以获取并使用服务器的响应了。
					if(xhr.readyState ===4 && xhr.status === 200){
						success(JSON.parse(xhr.responseText));
					}
					if(xhr.status === 404){
						error() //对应的错误处理
					}
					complete();//该函数 无论错误还是正确都将执行
				}
		}
		//处理字符串拼接问题
		function formatData(obj){
			var str = '';
			for(var key in obj){
				str += key + "=" + obj[key] + "&" //这里返回就会在结尾多出一个& 使用正则去掉即可
			}
			return str.replace(/$&/,'');
		}
        return {
        	
            ajax:function(opt){
                 _doAjax(opt);
            },
            get:function(url,callback){
            	_doAjax({
					type:'GET',
					url:opt.url,
					success:callback
				})
            },
            post:function(url,data,callback){
            	type:'POST',
            	url:url,
            	data:data,
            	success:callback
            }
        }
    })();

至此一个简单封装就结束了。其实利用原生的方式封装ajax还是比较简单的。下次我们可以看看Jquery是如何实现Ajax封装的。

路漫漫其修远兮

相关标签: 前端 JavaScript