首页 > 代码库 > Hybrid App开发之Ajax在JQuery中的应用

Hybrid App开发之Ajax在JQuery中的应用

前言:

      今天学习一下如何通过Ajax与服务器进行交互,并且学习一下如何在JQuery中使用。

首先先了解一下什么是ajax?

   AJAX即“Asynchronous,Javascript+XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。AJAX=异步JavaScript和XML(标准通用标记语言的子集)。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页面。

1、)先看下没有使用jQuery的时候,JavaScript如何通过ajax发送请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        //url就是请求的地址
        //successFunc就是一个请求返回成功之后的一个function,有一个参数,参数就是服务器返回的报文体
        function ajax(url, method, parmars, successFunc) {
            parmars = (function (obj) { // 转成post需要的字符串.
                var str = "";
                var pos = 0;
                for (var prop in obj) {
                    str += prop + "=" + obj[prop];
                    if (pos > 0) {
                        str += "&"
                    }
                    pos++;
                }
                return str;
            })(parmars);
            var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
            //我这里声明1是post 0是get
            if (method === 0) {
                url = url + ? + parmars;
            }
            //第一个参数是请求方式 第二个是请求地址 第三个参数:同步方式  or  异步方式,一般置为true,为异步;默认也为异步调用
            request.open(method === 1 ? "POST" : "GET", url, true);
            //设置请求头
            request.setRequestHeader("version", v1.2.0);
            request.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            request.onreadystatechange = function () {
                alert(url);
                if (request.readyState === 4) {
                    if (request.status === 200) {
                        var data = JSON.parse(request.responseText);//将返回的数据放在data变量中
                        if (data.success) {
                            successFunc(data);
                        } else {
                            alert("解析错误");
                        }
                    } else {
                        alert("服务器返回错误" + request.readyState + request.status+request.responseText);
                    }
                }
            };
            if (method === 1) {
                request.send(parmars);
            } else {
                request.send();
            }
        }

        function getWeather() {
            var url = http://wthrcdn.etouch.cn/weather_mini;
            var parmars = {
                "citykey": 101010100
            };
            ajax(url, 0, parmars, function (xmlDataString) {
                alert(xmlDataString)
            });
        }
    </script>
</head>
<body>
<div>
    <input type="button" value="获取天气情况" id="getWeatherBtn" onclick="getWeather()">
</div>
</body>
</html>

上面就是一个常规的ajax请求,可惜实际运行中给了我当头一棒,那就是ajax跨域问题,接下来尝试这使用jsonp解决跨域问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        function ajax(params) {
            params = params || {};
            params.data = params.data || {};
            var json = params.jsonp ? jsonp(params) : json(params);
            // ajax请求
            function json(params) {
                params.type = (params.type || GET).toUpperCase();
                params.data = formatParams(params.data);
                var xhr = null;

                // 实例化XMLHttpRequest对象
                if (window.XMLHttpRequest) {
                    xhr = new XMLHttpRequest();
                } else {
                    // IE6及其以下版本
                    xhr = new ActiveXObjcet(Microsoft.XMLHTTP);
                }

                // 监听事件
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4) {
                        var status = xhr.status;
                        if (status >= 200 && status < 300) {
                            var response = ‘‘;
                            var type = xhr.getResponseHeader(Content-type);
                            if (type.indexOf(xml) !== -1 && xhr.responseXML) {
                                response = xhr.responseXML; //Document对象响应
                            } else if (type === application/json) {
                                response = JSON.parse(xhr.responseText); //JSON响应
                            } else {
                                response = xhr.responseText; //字符串响应
                            }
                            ;
                            params.reqSuccess && params.reqSuccess(response);
                        } else {
                            params.error && params.error(status);
                        }
                    }
                };

                // 连接和传输数据
                if (params.type == GET) {
                    xhr.open(params.type, params.url + ? + params.data, true);
                    xhr.send(null);
                } else {
                    xhr.open(params.type, params.url, true);
                    //设置提交时的内容类型
                    xhr.setRequestHeader(Content-Type, application/x-www-form-urlencoded; charset=UTF-8);
                    xhr.send(params.data);
                }
            }

            // jsonp请求
            function jsonp(params) {
                //创建script标签并加入到页面中
                var callbackName = params.jsonp;
                var head = document.getElementsByTagName(head)[0];
                // 设置传递给后台的回调参数名
                params.data[callback] = callbackName;
                var data = formatParams(params.data);
                var script = document.createElement(script);
                head.appendChild(script);

                //创建jsonp回调函数
                window[callbackName] = function (json) {
                    head.removeChild(script);
                    clearTimeout(script.timer);
                    window[callbackName] = null;
                    params.reqSuccess && params.reqSuccess(json);
                };

                //发送请求
                script.src = params.url + ? + data;
                //超时处理
                if (params.time) {
                    script.timer = setTimeout(function () {
                        window[callbackName] = null;
                        head.removeChild(script);
                        params.error && params.error({
                            message: 超时
                        });
                    }, time);
                }
            };
            //格式化参数
            function formatParams(data) {
                var arr = [];
                for (var name in data) {
                    arr.push(encodeURIComponent(name) + = + encodeURIComponent(data[name]));
                }
                // 添加一个随机数,防止缓存
                arr.push(v= + random());
                return arr.join(&);
            }

            // 获取随机数
            function random() {
                return Math.floor(Math.random() * 10000 + 500);
            }
        }
        
        function reqWeather() {
            ajax({
                url: http://wthrcdn.etouch.cn/weather_mini,
                jsonp: jsonpCallback,
                data: {citykey: 101010100},
                reqSuccess: function (res) {
                    alert(JSON.stringify(res))
                }
            })
        }
    </script>
</head>
<body>
<div>
    <input type="button" value="获取天气情况" onclick="reqWeather()">
</div>
</body>
</html>

2、)JQuery与Ajax结合使用

(1)get()、getJSON()请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#getWeatherBtn").click(function () {
                var url = http://wthrcdn.etouch.cn/weather_mini;
                var parmars = {
                    "citykey": 101010100
                };
                //get请求
                $.get(url + "?citykey=101010100", function (data) {
                    alert(JSON.stringify(data))
                });
                //get请求 返回json
                $.getJSON(url, parmars, function (data) {
                    alert(JSON.stringify(data))
                })
            });
        });
    </script>
</head>
<body>
<div>
    <input type="button" value="获取天气情况" id="getWeatherBtn">
</div>
</body>
</html>

(2)post请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#getWeatherBtn").click(function () {
                url = http://api.k780.com:88/;
                parmars = {
                    app: weather.today,
                    weaid: 1,
                    appkey: 10003,
                    sign: b59bc3ef6191eb9f747dd4e83c99f2a4,
                    format: json,
                    jsoncallback: "data",
                    callback: "data"
                };

                $.get(url, parmars, function (data) {
                    alert(data);
                    alert(JSON.stringify(data))
                });

                $.post(url, parmars, function (data) {
                    alert(data);
                    alert(JSON.stringify(data))
                });

            });
        });
    </script>
</head>
<body>
<div>
    <input type="button" value="获取天气情况" id="getWeatherBtn">
</div>
</body>
</html>

(3)ajax()方式请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
    <script type="text/javascript">
        $(function () {
            $("#getWeatherBtn").click(function () {
                url = http://api.k780.com:88/;
                parmars = {
                    app: weather.today,
                    weaid: 1,
                    appkey: 10003,
                    sign: b59bc3ef6191eb9f747dd4e83c99f2a4,
                    format: json,
                    jsoncallback: "data",
                    callback: "data"
                };

                $.ajax({
                    type: "get",
                    async: true,
                    url: url, //跨域请求的URL
                    dataType: "jsonp",
                    data: parmars,
                    //传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback)
                    jsonp: "jsoncallback",
                    //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
                    jsonpCallback: "data",
                    //成功获取跨域服务器上的json数据后,会动态执行这个callback函数
                    success: function (data) {
                        alert(JSON.stringify(data));
                    }
                });
                $.ajax({
                    type: "post",
                    async: true,
                    url: url, //跨域请求的URL
                    dataType: "jsonp",
                    data: parmars,
                    //传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback)
                    jsonp: "jsoncallback",
                    //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
                    jsonpCallback: "data",
                    //成功获取跨域服务器上的json数据后,会动态执行这个callback函数
                    success: function (data) {
                        alert(JSON.stringify(data));
                    }
                });

            });
        });
    </script>
</head>
<body>
<div>
    <input type="button" value="获取天气情况" id="getWeatherBtn">
</div>
</body>
</html>

(4) ajaxSetUp()设置全局ajax

$.ajaxSetup({
  dataType: "jsonp",
  async: true,
  jsonp: "jsoncallback",
   //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名
   jsonpCallback: "data",
   });

总结:

今天大致学习了JQuery的ajax使用,后续开始学习与Css3、Html5、React.js、React Native,s最终是为开发RN做准备。

 

Hybrid App开发之Ajax在JQuery中的应用