什么是ajax

同步交互与异步交互

同步交互

指发送一个请求,需要等待返回,然后才能够发送下ー个请求。同步交互相当于排队,轮到下一个的情况会因为前一个而有所不同。

image-20200821104552568

与排队类似。例如学生在食堂买饭,只有等前边同学买完才能轮到自己。

客户端向服务器端发送请求,必须等待结果返回,才能向服务端再次发送请求。

异步交互

所谓异步交互,就是指指发送一个请求,不需要等待返回,随时可以再发送下一个请求。同步交互与异步交互的区别在于同步交互需要等待结果,而异步交互不需要等待。

image-20200821105600663

异步交互相比同步交互的优势主要具有以下几点

  1. 用户操作无须像同步交互必须等待结果。
  2. 异步交互只需与服务器端交換必要的数据内容,而不是将所有数据全部更新。
  3. 异步交互对带宽造成的压力相比同步交互更小。
  4. 通过 Aja 实现异步交互不需要任何第三方插件,只要浏览器支持 Javascript 语言即可实现。

异步交互相比同步交互井不是优势,它也存在一些问题

  1. 异步交互破坏了浏览器原有的前进和后退机制。
  2. 如果后面逻辑的行依靠前面逻辑行的结果的话,异步交互可能会造成问题。
  3. Aja× 实现异步交互对搜索引擎支持较弱。
  4. Ajax 实现异步交互会引起一些 Web 安全问题,例如如 SQL 注人攻击、跨站点脚本攻击等问题。

Ajax 概念

Ajax 是什么

Asynchronous JavaScript + XML(异步 JavaScript 和 XML), 其本身不是一种新技术,而是一个在 2005 年被 Jesse James Garrett 提出的新术语,用来描述一种使用现有技术集合的‘新’方法。

当使用结合了这些技术的 AJAX 模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。

Ajax 涉及的技术

Ajax 只是为实现异步交互的手段,不是一种技术,而是多种技术的整合。其中包括以下几种技术

  • HTML 页面

  • CSS

  • JavaScript

  • DOM

  • XML

  • XMLHttpRequest 对象

    实现 Ajax 异步交互的核心

Ajax 的核心对象

实现 Ajax 异步交互的核心就是 XMLHttpRequest 对象,该对象为客户端提供了在客户端和服务器之传输数据的功能。

Xmlhttprequestx 对象最初由微软设计,随后被 Mozilla、Apple 和 Google 采纳。如今,该对象已经被 W3C 组织标准化。通过该对象,可以很容易地得到一个 URL 上的资源数据。尽管名字里有 XML,但 XMLHttpRequest 对象可以得到所有类型的数据资源,井不局限于 XML 格式的数据。

实现 Ajax 异步交互

实现 Ajax 的执行步骤

  1. 创建核心对象 XMLHttpRequest
  2. 通过 XMLHttpRequest 对象的 open 方法与服务器建立连接
  3. 构建请求所需的数据内容,并通过 XMLHttpRequest 对象的 send 方法发送出去
  4. 通过 XMLHttpRequest 对象提供的 onreadystatechange 事件监听服务器端的通信状态
  5. 接收并处理服务器端向客户端响应的数据结果
  6. 将处理的结构更新到 HTML 页面中

创建 Ajax 的核心对象

  1. 函数式定义

    function createXMLHttpRequest() {  
        var httpRequest;   
        if (window.XMLHttpRequest) {     
            // 适用于非IE浏览器   
            httpRequest = new XMLHttpRequest();  
        } else if (window.ActiveXObject) {   
            //   适用于IE浏览器     
            try {   
                // IE 7+   
                httpRequest = new ActiveXObject("Msxml2.XMLHTTP");     
            } catch (e) {   
                try {         
                    //   IE 6-   
                    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");    
                } catch (e) {}       
            }  
        }  
        return httpRequest;
    }
    
  2. 为 window 原型定义方法

    Object.defineProperty(window, "createXMLHttpRequest", function () {  
        var httpRequest;   
        if (window.XMLHttpRequest) {   
            // 适用于非IE浏览器    
            httpRequest = new XMLHttpRequest();   
        } else if (window.ActiveXObject) {    
            //   适用于IE浏览器     
            try {          
                // IE 7+       
                httpRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
            } catch (e) {    
                try {             
                    //   IE 6-      
                    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");     
                } catch (e) {}  
            }   
        }   
        return httpRequest;
    });
    
  3. 匿名函数

    (function () { 
        function createXMLHttpRequest() {  
            var httpRequest;    
            if (window.XMLHttpRequest) { 
                // 适用于非IE浏览器    
                httpRequest = new XMLHttpRequest(); 
            } else if (window.ActiveXObject) {  
                //   适用于IE浏览器   
                try {      
                    // IE 7+    
                    httpRequest = new ActiveXObject("Msxml2.XMLHTTP");     
                } catch (e) { 
                    try { 
                        //   IE 6-     
                        httpRequest = new ActiveXObject("Microsoft.XMLHTTP");   
                    } catch (e) {}   
                }  
            } 
            return httpRequest; 
        } 
        window.createXMLHttpRequest = createXMLHttpRequest;
    })();
    

任选一种方式即可创建一个 Ajax 的核心对象。

<!DOCTYPE html>
<html lang="en">
    
<head>  
    <meta charset="UTF-8">   
    <meta name="viewport" content="width=device-width, initial-scale=1.0">    
    <title>Document</title>
</head>
<body>  
    <script src="1. createXMLHttpRequest.js"></script> 
    <script>    
        var xhr = createXMLHttpRequest()        
        console.log(xhr); 
    </script>
</body>
</html>

image-20200821114254352

实现 Ajax 的步骤

关于核心对象的方法参考:MDN

<!DOCTYPE html>
<html lang="en">   
    <head>      
        <meta charset="UTF-8">     
        <meta name="viewport" content="width=device-width, initial-scale=1.0">  
        <title>Document</title>  
    </head>  
    <body>  
        <button id="btn">按钮</button>
    </body>   
    <script src="1. createXMLHttpRequest.js"></script>    
    <script>    
        var btn = document.getElementById('btn')    
        btn.addEventListener('click', function () {  
            // 实现Ajax异步交互   
            // 1. 创建核心对象  
            var xhr = createXMLHttpRequest()   
            // 2. 调用核心对象的open方法    
            // 作用 - 与服务器建立连接  
            // 参数参考 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/open            xhr.open('get', 'https://v1.hitokoto.cn')       
            // 3. 调用核心对象的send方法      
            // 作用 - 将客户端页面的数据发送给服务器端   
            // 参数参考 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/send            xhr.send(null)       
            // 4. 利用核心对象的onreadystatechange事件监听服务器端的通信状态     
            // 当接收到服务器端处理完毕的信号    
            // 参考连接 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/readyState         
            xhr.onreadystatechange = function () {       
                // 通过核心对象的属性readyState监听通信状态    
                //readyState=4:响应的内容解析完毕,可以在客户端使用了--完成     
                if (xhr.readyState === 4) {   
                    // 接收服务器端返回的处理结果(responseText)  
                    console.log(xhr.responseText);          
                }       
            }   
            // 5. 将接收到的结果更新到HTML页面中   
        })  
    </script>
</html>

fc1431ad-f6f1-44b4-9d6c-cff3d603cb2a

通过 Ajax 异步交互

响应状态码

通过 status 属性判断返回响应的状态码。

xhr.onreadystatechange = function () {  
    // 通过核心对象的属性readyState监听通信状态   
    //readyState=4:响应的内容解析完毕,可以在客户端使用了--完成  
    if (xhr.readyState === 4 && xhr.status === 200) {    
        // 接收服务器端返回的处理结果(responseText)    
        console.log(xhr.responseText);    
        console.log(xhr.status);   
    }
}

image-20200821150106643

open 方法

请求方法分为可以是 POST 与 GET

send 方法

当不发送数据时需要传递 null 而不是不传参。

如果请求方式为 GET,那么参数只能是 null,将参数添加到请求地址中。

xhr.open('get', 'https://v1.hitokoto.cn?c=a&c=c')

如果请求方式为 POST,那么参数传入请求的参数,并且设置请求头即可。

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')xhr.send("c=a&c=c")

Node.js 搭建基础服务

const http = require("http");

const hostname = "127.0.0.1";
const port = 3000;

const server = http.createServer((req, res) => { 
    res.statusCode = 200;  
    res.setHeader("Content-Type", "text/plain"); 
    res.end("Hello, World!\n");
});

server.listen(port, hostname, () => {  
    console.log(`Server running at http://${hostname}:${port}/`);
});
t server = http.createServer((req, res) => { 
    res.statusCode = 200;  
    res.setHeader("Content-Type", "text/plain"); 
    res.end("Hello, World!\n");
});

server.listen(port, hostname, () => {  
    console.log(`Server running at http://${hostname}:${port}/`);
});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值