Ajax

作者: cherish_rish | 来源:发表于2018-08-07 10:26 被阅读0次

今天有兴趣写一下原生js的ajax数据请求,以前接触的时候还感觉很难,前两天突然看了一下原理,靠,原来也就这样,所以说知识读了还是有用的,即使你之前没有明白但是回过头来一看,突然就懂了,心理high.

文档是看的官网文档 后面代码是自己写的

ajax优缺点

优点

  1. 异步传输

    AJAX使用异步方式与服务器通信,==不需要打断用户的操作==,具有更加迅速的响应能力。优化了Browser和Server之间的沟通,减少不必要的数据传输、时间及降低网络上数据流量

  2. 无刷新更新数据

    AJAX最大优点就是能在不刷新整个页面的前提下与服务器通信维护数据。这使得Web应用程序更为迅捷地响应用户交互,并避免了在网络上发送那些没有改变的信息,==减少用户等待时间,带来非常好的用户体验==。

  3. 前后端负载平衡

    AJAX可以把以前一些服务器负担的工作转嫁到客户端,利用客户端闲置的能力来处理,==减轻服务器和带宽的负担==,节约空间和宽带租用成本。并且减轻服务器的负担,AJAX的原则是“==按需取数据==”,可以最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。

  4. 界面与应用分离

    Ajax使WEB中的界面与应用分离(也可以说是数据与呈现分离),有利于分工合作、==减少==非技术人员对页面的修改造成的WEB应用==程序错误、提高效率==、也更加适用于现在的发布系统。

  5. 基本标准被广泛支持

    AJAX基于标准化的并被广泛支持的技术==,不需要下载浏览器插件或者小程序==,但需要客户允许JavaScript在浏览器上执行。随着Ajax的成熟,一些简化Ajax使用方法的程序库也相继问世。同样,也出现了另一种辅助程序设计的技术,为那些不支持JavaScript的用户提供替代功能。

缺点

  1. AJAX干掉了Back和History功能,即对浏览器机制的破坏

  2. AJAX的安全问题。

  3. 对搜索引擎支持较弱。

  4. 破坏程序的异常处理机制。

  5. AJAX不能很好支持移动设备(目前应该没有限制)。

  6. 客户端过肥,太多客户端代码造成开发上的成本。

    编写复杂、容易出错 ;冗余代码比较多(层层包含js文件是AJAX的通病,再加上以往的很多服务端代码现在放到了客户端);破坏了Web的原有标准。

原生ajax方法

1、创建XMLHttpRequest()对象

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

// 大部分浏览器支持XMLHttpRequest
var req = new XMLHttpRequest();

// 兼容IE6写法
var xmlHttp = new ActiveXObject('Microsoft.XMLHttp')

// 完整写法
if(window.XMLHttpRequset){
// code for IE7+, Firefox, Chrome, Opera, Safari
    var xmlHttp = new XMLHttpRequest();
}else{
// code for IE5, IE6
    var xmlHttp = new ActiveXObject('Microsoft.XMLHttp');
}

2、向服务器发送请求

使用 XMLHttpRequest 对象的 open() 和 send() 方法:

规定请求连接和类型

open(method, url, async)

向服务器发送请求

send(string)  string仅用于post请求

如果需要想接口传数据get方法直接在链接后面拼数据字符串;如果post传数据需要使用 setRequestHeader() 来添加 HTTP 头

// get
xmlHttp.open("get", "xxx.xxx.js?aaa=111&b=222", true);

//post
xmlHttp.open("POST","ajax_test.asp",true);
xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlHttp.send("fname=Bill&lname=Gates");

注释:当您使用 async=false 时,请不要编写 onreadystatechange 函数 - 把代码放到 send() 语句后面即可

xmlhttp.open("GET","test1.txt",false);
xmlhttp.send();
// TODO
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;

3、服务器响应

responseText 获取字符串类型的相响应数据

responseXML 获取XML类型的响应数据

xmlHttp.responseText
xmlHttp.responseXML

4、响应事件 xmlHttp.onreadystatechange

当readyState改变是会触发onreadystatechange事件

下面是 XMLHttpRequest 对象的三个重要的属性:

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState 存有 XMLHttpRequest 的状态。从 0 到 4发生变化。
status 200: "OK" 404: 未找到页面

readyState各种状态

  • 0: 请求未初始化
  • 1: 服务器连接已建立
  • 2: 请求已接收
  • 3: 请求处理中
  • 4: 请求已完成,且响应已就绪

当 readyState 等于 4 且状态为 200 时,表示响应已就绪:

xmlHttp.onreadystatechange = function() {
    if(xmlHttp.state == '200' && xmlHttp.readyState == '4'){
        // do something
        
    }
}

Demo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生ajax请求</title>
    <script>
        var getData = function() {
            var xmlhttp;
            if(window.XMLHttpRequest){
                xmlhttp = new XMLHttpRequest();
            }else{
                xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
            }
            xmlhttp.onreadystatechange = function () {
                if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                    console.log(xmlhttp.responseText);
                    document.getElementById('text').innerHTML = xmlhttp.responseText;
                }
            }
            xmlhttp.open('get', 'http://xxx.xxx.com/mobile/index.php?act=area&op=area_list_arr2', true);
            xmlhttp.send();
        }
    </script>
</head>
<body>
<button onclick="getData()">获取后台数据</button>
<div id="text"></div>
</body>

</html>

ajax 封装 只有基本使用

/**
 * @author: zhaoyangyue
 * @param param=defaultParam  和defaultParam的格式一樣就可以
 * param传对象
 */
/
function ajax(param) {
    var xmlhttp;
    var defaultParam = {
        type: 'get',
        url: '',
        async: true,
        dataType: '',
        success: function () {
            return;
        },
        error: function () {
            alert('网络错误');
        }
    }
    for(var i in defaultParam){
        if(!param[i]){
            param[i] = defaultParam[i];
        }
    }
    if(window.XMLHttpRequest){
        xmlhttp = new XMLHttpRequest();
    }else{
        xmlhttp = new ActiveXObject('Microsoft XMLHTTP');
    }
    if(param.type.toLowerCase() == 'post'){
        // post方法传值需要设置请求头 get不用Content-Type:application/x-www-form-urlencoded
        xmlhttp.open(param.type, param.url, param.async);
        xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xmlhttp.send(param.data);
    }else{
        if(param.url.indexOf('?') > -1){
            xmlhttp.open(param.type, param.url + '&' + param.data , param.async);
        }else{
            xmlhttp.open(param.type, param.url + '?' + param.data , param.async);
        }
        xmlhttp.send();
    }
    if(param.async){
        xmlhttp.onreadystatechange = function () {
//            ajax运行状态为4 已完成请求 并且请求成功
            if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                // TODO
                if(param.dataType == 'json'){
                    param.success(JSON.parse(xmlhttp.responseText));
                }else{
                    param.success(xmlhttp.responseText)
                }

            }else if(xmlhttp.readyState == 4 && xmlhttp.status != 200){
                if(param.dataType == 'json'){
                    param.error(JSON.parse(xmlhttp.responseText));
                }else{
                    param.error(xmlhttp.responseText)
                }
            }
        }
    }else{
        param.success(xmlhttp.responseText);
    }
}

完整案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原生ajax请求</title>
</head>
<body>
<button onclick="ajax(object)">get获取后台数据</button>
<button onclick="ajax(post)">POST</button>
<div id="text"></div>
</body>

</html>
<script>
    //AJAX封装
    var object = {
        type: 'get',
        url: 'http://xxx.xxx.com/mobile/index.php',
        async: true,
        data: 'act=area&op=area_list_arr2',
//        dataType: 'json',
        success: function (res) {
            // callback
            console.log(res);
            document.getElementById('text').innerHTML = res;
        },
        error: function (err) {
            // callback
            console.log(err)
        }
    }
    var post = {
        type: 'post',
        url: 'http://xxx.xxx.com/mobile/index.php?act=member_order&op=get_current_deliver',
//        async: true,
        data: 'key=xxx&order_id=292',
        dataType: 'json',
        success: function (res) {
            console.log(res);
        },
        error: function (err) {
            alert('false');
            console.log(err)
        }
    }
    /**
     * @author: zyy_cherish@163.com
     * @param param=defaultParam  和defaultParam的格式一樣就可以
     * param传对象
     */
    /
    function ajax(param) {
        var xmlhttp;
        var defaultParam = {
            type: 'get',
            url: '',
            async: true,
            dataType: '',
            success: function () {
                return;
            },
            error: function () {
                alert('网络错误');
            }
        }
        for(var i in defaultParam){
            if(!param[i]){
                param[i] = defaultParam[i];
            }
        }
        xmlhttp = window.XMLHttpRequest ? xmlhttp = new XMLHttpRequest() || new ActiveXObject('Microsoft XMLHTTP');
        if(param.type.toLowerCase() == 'post'){
            // post方法传值需要设置请求头 get不用Content-Type:application/x-www-form-urlencoded
            xmlhttp.open(param.type, param.url, param.async);
            xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
            xmlhttp.send(param.data);
        }else{
            if(param.url.indexOf('?') > -1){
                xmlhttp.open(param.type, param.url + '&' + param.data , param.async);
            }else{
                xmlhttp.open(param.type, param.url + '?' + param.data , param.async);
            }
            xmlhttp.send();
        }
        if(param.async){
            xmlhttp.onreadystatechange = function () {
//            ajax运行状态为4 已完成请求 并且请求成功
                if(xmlhttp.readyState == 4 && xmlhttp.status == 200){
                    // TODO
                    if(param.dataType == 'json'){
                        param.success(JSON.parse(xmlhttp.responseText));
                    }else{
                        param.success(xmlhttp.responseText)
                    }

                }else if(xmlhttp.readyState == 4 && xmlhttp.status != 200){
                    if(param.dataType == 'json'){
                        param.error(JSON.parse(xmlhttp.responseText));
                    }else{
                        param.error(xmlhttp.responseText)
                    }
                }
            }
        }else{
            param.success(xmlhttp.responseText);
        }
    }
</script>

相关文章

  • AJAX

    主要内容: ajax 是什么、原生ajax 写法和jQuery ajax写法。 AJAX 是什么 ajax,即As...

  • JavaScript进阶知识点--AJAX及JSON

    AJAX 关于 AJAX 什么是 AJAX AJAX 的全称是 Asynchronous JavaScript a...

  • HTML5权威指南 | 第五部分 高级功能

    三十二、使用AJAX(上) Ajax起步: 使用Ajax事件: Ajax请求的错误处理: 中止Ajax请求: 三十...

  • ajax学习笔记

    Ajax学习笔记 Ajax简介 1. Ajax是什么? Ajax : Asynochronous javascri...

  • AJAX

    一、简介 AJAX菜鸟教程 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML。 AJAX...

  • js之AJAX复习

    异步交互和同步交互 什么是Ajax? Ajax的工作原理。 Ajax包含的技术: Ajax的缺陷: Ajax的核心...

  • 复习jQuery - ajax

    jQuery ajax - ajax() 方法 $.ajax({ url:'oo.php', ...

  • jQuery中Ajax请求的使用和四个步骤示例

    ajax() 方法用于执行 AJAX(异步 HTTP)请求,所有的 jQuery AJAX 方法都使用 ajax(...

  • ajax

    1、什么是ajax? 2、ajax的原理 3、ajax的核心对象 4、ajax的优点: ajax的缺点: 被jqu...

  • ajax

    Ajax 1 - 请求纯文本 Ajax 2 - 请求JSON数据 Ajax 3 - 请求Github接口 Ajax...

网友评论

      本文标题:Ajax

      本文链接:https://www.haomeiwen.com/subject/cjdovftx.html