Ajax

2021-03-30 13:27

阅读:604

标签:sign   cat   XML   区别   else   typeof   php   中文   lse   

Ajax的全称是Asynchronous JavaScript and XML 中文名称定义为异步的JavaScript和XML,Ajax是一种用于创建快速动态网页的技术。以前网页需要更新网页内容则需要重载页面,而使用Ajax可以让网页实现异步更新即可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

Ajax的工作原理是:客户端发送请求,请求交给xhr,从而把请求提交给服务器,服务器进行业务处理,把响应数据交给xhr对象,xhr对象接收数据,最后javascript把数据写到页面上。

Ajax的实现步骤:

1. 创建 ajax 对象

let xhr = new XMLHttpRequest()

2. 配置请求信息

xhr.open(‘GET’, ‘./test.php’, true)

3. 发送请求

xhr.send()

4. 接受响应

xhr.onload = function () {

  console.log(xhr.responseText)

}

Ajax的封装:

Ajax的封装需要考虑两种请求方式即为GET和POST,还要考虑Ajax的兼容处理;具体代码如下:

function ajax( options ){

            // 默认的参数

            var _default = {

                type : "GET",

                url : "",

                data : null,

                dataType : "text",

                status : null,

                success : function(){},

                complete : function(){},

                error : function(){}

            }

            // 若传入参数,对默认参数覆盖;

            options = assign( _default , options );

            options.type = options.type.toLowerCase();

            // 如果存在context;

            if( isObject(options.context) ){

                var callback_list = ["success","complete","error"];

                callback_list.forEach( function( item ){

                    options[item] = options[item].bind( options.context );

                })

            }          

            // 1. 创建shr ;

            var xhr = null;

            //创建 ajax对象 的兼容

            if(typeof XMLHttpRequest === "function"){

                xhr = new XMLHttpRequest();

            }else{

                xhr = new ActiveXObject("Microsoft.XMLHTTP");

            }

            //区别请求方式

            if(options.type === "get"){

                options.url =  toUrlData( options.data , options.url , options.type)

            }

            if(options.type === "post"){

                options.data =  toUrlData( options.data , options.url , options.type)

            }

            // 2. 根据数据进行方法的调用;

            xhr.open( options.type , options.url , true ) ;

            options.type === "post" ? xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded") : "";

            // 3. 调用send方法;

            xhr.send( options.type=== "get" ? null : options.data );

            // 4. 调用回调函数;

            xhr.onreadystatechange = function(){

                //接受响应的兼容

                if( xhr.readyState === 4 ){

                    options.complete();    

                    if( /^2\d{2}$/.test(xhr.status) ){

                        // 5.传递数据

                        try{

                            var res = options.dataType === "json" ? JSON.parse(xhr.responseText) : xhr.responseText; 

                            options.success(res);

                        }catch(e){

                            options.error(e,xhr.status);

                        }

                    }else{

                        options.error("error",xhr.status);

                    }

                    // 策略模式调用 : 

                    if( isObject(options.status) ){

                        typeof options.status[xhr.status] === "function" ? options.status[xhr.status]() : "";

                    }

                }

            }

        }

导入的方法具体代码如下:

    function toUrlData( obj , url , method){

            if( isObject(obj) ){

                var str = "";

                for(var attr in obj){

                    str += "&" + attr + "=" + obj[attr]

                }

                str = str.slice(1);

                method = method || "";

                if( method.toUpperCase() === "POST"){

                    return str;

                }

                url += "?" + str;

                return url;

            }

            return url;

        }

        function isObject( data ){

            return (typeof data === "object" && data !== null && data.constructor && data.constructor === Object)

        }

Ajax

标签:sign   cat   XML   区别   else   typeof   php   中文   lse   

原文地址:https://www.cnblogs.com/bxf1245/p/12594098.html


评论


亲,登录后才可以留言!