• AJAX


    AJAX就是Asynchronous JavaScript And XML,就是异步的 JS 和 XML,优势:无刷新获取数据

     

    XML:可扩展标记语言,被设计用来传输和存储数据。和HTML类似,但是XML里是预定义标签,而XML中没有预定义标签。

    目前XML已经被JSON代替了。

     

    AJAX的优点:

           1.可以无需刷新页面而与服务器端进行通信   2.允许你根据用户事件来更新部分页面内容

    AJAX的缺点:

           1.没有浏览力士,不能回退  2.存在跨域问题(同源):在这个服务向另外一个服务发送请求  3.SEO搜索引擎优化不友好

          

    HTTP协议:

           超文本传输协议,规定了浏览器和服务器之间的通信规则。

           请求报文

                  行           GET/s?ie=utf-8  HTTP/1.1

                  头           Host: atguigu.com

                                 Cookie: name=guigu

                                 Content-type: application/x-www-form-urlencoded

                                 User-Agent: chrome 83

                  空行

                  体           username=admin&password=admin

                 

           响应报文

                  行          HTTP/1.1  200  OK

                  头          Content-Type: text/html;charset=utf-8

                                Content-length: 2048

                                Conent-encoding: gzip

                  空行

                  体          <html>

                                       <head>

                                       </head>

                                       <body>

                                       </body>

                                </html>

                      

                response响应  request请求

      1 Express框架
      2     基于Node.js平台
      3         //1. 引入express
      4         const express = require('express');
      5         //2. 创建应用对象
      6         const app = express();
      7         //3. 创建路由规则
      8         //request是对请求报文的封装
      9         //response是对响应报文的封装
     10         app.get('/',(request, response)=>{ 
     11              //app.all可以接收任意类型的请求
     12               //设置响应头  设置允许跨域
     13           response.setHeader('Access-Control-Allow-Origin','*');
     14           //设置响应
     15           response.send('HELLO AJAX');
     16         });
     17         //4. 监听端口启动服务
     18         app.listen(8000, ()=>{
     19           console.log("服务已经启动,8000 端口监听中...");
     20         })
     21         
     22         
     23     btn.onclick = function(){
     24       //1. 创建对象
     25       const xhr = new XMLHttpRequest( );
     26       //2. 初始化 设置请求方法和url
     27       xhr.open('GET', 'http://127.0.0.1:8000/server?a=100&b=200&c=300');  //通过在?后面添加,&分割传递参数
     28       //3. 发送
     29       xhr.send();
     30       //4. 事件绑定  处理服务端返回的结果
     31       // on 当什么…时候
     32       // readystate 是 xhr 对象的属性,表示状态 0 1 2 3 4  ,0表示未初始化  1表示open方法调用完毕 , 2表示send方法调用完毕, 3表示返回部分结果 , 4表示返回所有结果
     33     
     34       xhr.onreadystatechange = function(){
     35         // 判断 服务端返回了所以的结果
     36         if(xhr.readyState ===4 ){
     37           //判断响应状态码 200  404  403  401  500
     38           // 2xx成功
     39           if(xhr.status >=200 && xhr.status < 300 ){
     40             //处理结果 行 头  空行 体
     41             //1 .响应行
     42             //console.log(xhr.status);  //状态码
     43             //console.log(xhr.statusText);  //状态字符串
     44             //console.log(xhr.getAllResponseHeaders());  //所有响应头
     45             //console.log(xhr.response);  //响应体
     46             result.innerHTML = xhr.response;
     47           }else{
     48           
     49           }
     50         }
     51       }
     52     }
     53     
     54     F12 ->network ->XHR说明是AJAX
     55     
     56     <script>
     57       //获取元素对象
     58       const result = document.getElementById("result");
     59       //绑定事件
     60       result.addEventListener("mouseover", function(){
     61         //1. 创建对象
     62         const xhr = new XMLHttpRequest();
     63         //2. 初始化 设置类型与Url
     64         xhr.open('POST', 'http://127.0.0.1:8000/serve');
     65         //设置请求头,只能放在open
     66         //Content-Type设置请求体类型,application/x-www-form是参数查询字符串的固定类型
     67         //也可以自己定义,但是可能会报错。需要后端在app.post里添加response.setHeader('Access-Control-Allow-Headers','*');
     68         //一般把身份校验的信息放在头部
     69         xhr.setRequestHeader('Content-Type','application/x-www-form');
     70         //3. 发送
     71         // xhr.send('a=100&b=200&c=300');
     72         // xhr.send('a:100&b:200&c:300'); 
     73         xhr.send();
     74         //4. 事件绑定
     75         xhr.onreadystatechange = function(){
     76           //判断
     77           if(xhr.readyState ===4 ){
     78             if(xhr.status >=200 && xhr.status < 300){
     79               //处理服务端返回结果
     80               result.innerHTML = xhr.response;
     81             }
     82           }
     83         }
     84       })
     85     </script>
     86     
     87     后端返回的结果绝大多数都是JSON格式
     88     <script>
     89       const result = document.getElementById('result');
     90       //绑定键盘按下事件
     91       window.onkeydown = function(){
     92         //发送请求
     93         const xhr = new XMLHttpRequest();
     94         //设置响应体数据类型
     95         xhr.responseType = 'json';
     96         //初始化
     97         xhr.open('GET','http://127.0.0.1:8000/json-server');
     98         //发送
     99         xhr.send();
    100         //事件绑定
    101         xhr.onreadystatechange = function(){
    102           if(xhr.readyState === 4){
    103             if(xhr.status >=200 && xhr.status < 300){
    104               // console.log(xhr.response);
    105               // result.innerHTML = xhr.response;
    106               // 手动对数据转化
    107               // let data = JSON.parse(xhr.response);
    108               // console.log(data);
    109               //自动转换,需要在顶部设置响应体数据的类型
    110               // result.innerHTML = data.name;
    111               console.log(xhr.response);
    112               result.innerHTML = xhr.response.name;
    113             }
    114           }
    115         }
    116       }
    117     </script>
    118     
    119     app.all('/json-server',(Request, response)=>{
    120       //设置响应头,设置允许跨域
    121       response.setHeader('Access-Control-Allow-Origin','*');
    122       //响应头
    123       response.setHeader('Access-Control-Allow-Headers','*');
    124       //响应一个数据
    125       const data = {
    126         name: 'atguigu'
    127       };
    128       //对对象进行字符串转换
    129       let str = JSON.stringify(data);
    130       //设置响应体
    131       response.send();
    132     })

    AJAX在server.js里面

                  const express = require('express')

                  1.创建应用对象 const app = express( );

                  2.app.get('server', (request, response) =>{  })   //post设置类app.post  app.all可以接收任何信息

                                设置响应头 response.setHeader('Access-Control-Allow-Origin' , '*')

                                设置响应体 response.send('…')

                 

          

           AJAX的步骤在HTML里面:

                  1.获取元素对象 const result = document.getElementBy….

                  2.给这个对象绑定事件 result.addEventListener( 事件名称 , 回调函数function( ){   })

                  3.在回调函数里创建xhr对象

                         创建对象: const xhr = new XMLHttpRequest( );

                         初始化 设置类型和URL: xhr.open('POST', 'http:// ….')

                         设置请求头  xhr.setRequestHeader('Content-Type' , ' ….. ');

                                      

                         在这里可以写数组const data = {  },但是想要在send里面发送,就需要把data变成JSON数据

                         let str = JSON.stringify(data)  , 再把str放到下面的send里面

                        

                         发送    xhr.send( );       //send里的内容会出现在浏览器 NetWorks -- Headers -- Request Payload里面,里面写的内容服务端要能处理

                         事件绑定  xhr.onreadystatechange = function( ){  }

                                       在函数里 先判断 xhr.readyState 判断有没有收到结果

                                                     在通过比如xhr.status >=200 && …返回的结果用if语句处理服务器端返回的结果

                                                            在这里可以把JSON转化为对象,

                                                            自动转换需要在xhr.open上面设置响应体数据类型xhr.responseType = 'json',result.innerHTML = xhr.response;

                        

                        

           nodemon可以解决重启服务端代码时候需要重启

          

           IE缓存问题

                         IE会保存下来AJAX, 不能即使获取服务器最新数据

                                在xhr.open里面的url里面后面加上/ie?t=' + Date.now( )

          

           超时和网络异常处理

                        在js文件里面app.get -- response.setHeader( 里面设置延时响应 setTimeout( ()=>{ response.send(….) } , 3000 )

                         在HTML文件里 要设置超时时间 xhr.timeout = 2000  ,超时回调 xhr.ontimeout = function( ){ }

                         网络异常时  xhr.onerror = function( ) {   }

                        

           AJAX 取消请求

                         let x = null;

                         给不同的按钮绑定不同的事件,第一个按钮添加x.send( ),第二个按钮添加x.abort( )

                        

           AJAX重复发送

                         发送新的时候要把上一个没有发完的取消掉

                         let isSending = false ;

                         在事件响应函数里, isSending = true

                         在onreadystatechange 里面当x.readyState ===4 时 isSending = false

                         if(isSending) x.abort( );  //如果正在发送,则取消掉该请求,创建一个新的请求

                        

           Axios发送AJAX请求

                         axios({  })

                                       method

                                       url

                                       params

                                       headers

                                       data

          

           使用fetch发送AJAX请求

                         用到了promise里的then

                        

           同源策略

                         协议、域名、端口相同

                        

           CROS

  • 相关阅读:
    Java中的线程安全问题
    谈谈你对Spring的理解
    Word 2016问题导致无法创建其他博客账号
    JS中 Cookie、 LocalStorage 与 SessionStorage
    CSDN代码块显示颜色
    Java中创建线程的两种方式
    毕业设计每日博客——第五周1
    毕业设计每日博客--第四周5
    毕业设计每日博客--第四周4
    毕业设计每日博客--第四周3
  • 原文地址:https://www.cnblogs.com/oaoa/p/14678865.html
Copyright © 2020-2023  润新知