Ajax的简单封装

Ajax的简单封装:

说明:简单封装,总结下ajax的请求方式,异步,RequestText/RequestXml,XMLHttpRequest,XMLHttpRequest,onreadystatechange,readyState,setRequestHeader,status,open,send的使用。案例实在Asp.NET MVC 下写的。

代码:

cshtml:

@{
    ViewBag.Title = "Ajax的简单封装";
}

<h2>Ajax的简单封装,点击屏幕发送请求</h2>
<script type="text/javascript">

    /*
     *  创建XMLHttpRequest对象
     *  1.判断浏览器类型
     *    IE:ActiveXObject对象
     *    !IE:XMLHttpRequest对象
     */
    function createXHR() {
        if (typeof XMLHttpRequest != 'undefined') {  //判断浏览器的类型
            return new XMLHttpRequest();
        } else if (typeof ActiveXObject != 'undefined') {
            var Version = [        //不同版本
                'MSXML2.XMLHttp.6.0',
                'MSXML2.XMLHttp.3.0',
                'MSXML2.XMLHttp'
            ];
            for (var i = 0; i < Version.length; i++) {
                try {
                    return new ActiveXObject(Version[i]);
                } catch (e) {
                    return;
                }
            }
        } else {
            alert("你的浏览器不支持XMLHttpRequest对象,请更换浏览器。");
        }
    }

    /*
    * 请求参数转字符串(先只考虑传入json)
    */
    function params(data) {
        var arr = [];
        for (var i in data) {
            arr.push(encodeURIComponent(i) + '=' + encodeURIComponent(data[i])); //加到数组与编码
        }
        return arr.join('&');
    }

    /*
     *  Ajax的封装
     *  1.创建xhr对象
     *  2.请求方式,url,是否异步,准备open()
     *  3.发送请求 send()
     *  4.回调(判断返回值类型)
     */
    function ajax(obj) {
        var xhr = createXHR();                                                                 //创建XMLHttpRequest对象
        //确定url
        obj.url = obj.url + "?rand=" + Math.random();                                           //请求地址,带随机字符串,解决缓存问题
        if (obj.type.toLowerCase() === 'get') {                                                //get方式请求的情况
            obj.data = params(obj.data);
            if (obj.url.indexOf('?') == -1) {
                obj.url = obj.url + '?' + obj.data;
            } else {
                obj.url = obj.url + '&' + obj.data;
            }
        }
        //是否异步
        if (obj.async) {                                                                      //异步
            xhr.onreadystatechange = function () {                                              //描述异步Ajax执行状态
                if (xhr.readyState == 4) {                                                    //只有状态值为4的时候说明请求执行完毕
                    callback();                                                               //回调
                }
            };
            openAndsend();                                                                    //执行open()与send()方法
        } else {                                                                              //同步
            openAndsend();                                                                    //执行open()与send()方法
            callback();                                                                       //回调
        }

        //定义执行open 与send
        function openAndsend() {
            xhr.open(obj.type, obj.url, obj.async);                                            //调用open()方法,准备发送请求。
            if (obj.type.toLowerCase() === 'post') {                                              //post请求
                xhr.setRequestHeader('Content-Type', 'application/x-www-from-urlencoded');     //设置信息,发送post的必须设置
                xhr.send(obj.data);                                                               //send() 发送post方式请求
            } else {                                                                            //get方式请求
                xhr.send(null);                                                                 //调用send()方法,发送get方式请求。
            }
        }

        //定义回调函数
        function callback() {
            if (!(xhr.status == 200)) {
                alert('获取数据错误,错误状态码:' + xhr.status + ',错误值:' + xhr.statusText);
                return;
            } else {
                //判断返回值类型
                switch (obj.dateType.toLowerCase()) {
                    case 'text':
                        obj.success(xhr.responseText);
                        break;
                    case 'json':
                        obj.success(eval('(' + xhr.responseText + ')'));
                        break;
                    case 'xml':
                        obj.success(xhr.responseXML);
                        break;
                    case 'html':
                        obj.success(xhr.responseText);
                        break;
                    default:
                        obj.success(xhr.responseText);
                        break;
                }
            }
        }

    }

    /*
     *  调用Ajax
     */
    document.addEventListener("click", function () {
        ajax({
            async: true,                                                   //是否异步(false:同步,true:异步)
            type: 'GET',                                                   //请求方式(POST  GET)
            url: '/AjaxTest/GETJSON',                                       //请求地址
            dateType: 'json',                                               //返回数据格式
            data: {"Num1":20,"Num2":30},                                                      //请求参数
            success: function (data) {                                     //回调函数
                console.log(data)              
            }                     
        });
    });
</script>


Controller:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Xml;

namespace Ajax.Controllers
{
    public class AjaxTestController : Controller
    {
        /// <summary>
        /// GET 方式请求返回JSON数据
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public JsonResult GETJSON() {
            //接收参数
            string str1=Request.Params["Num1"];
            string str2 = Request.Params["Num2"];
            int num1,num2;
            int.TryParse(str1, out num1);
            int.TryParse(str2, out num2);            
            return Json(new { Sum=num1+num2 },JsonRequestBehavior.AllowGet);
        }      
    }
}

运行测试:

正确请求:GET 方式,返回json


错误请求:POST,返回json





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值