AJAX笔记(1)-原生的AJAX使用

1.AJAX简介

ajax是异步的JS和XML,可以向服务器发送异步请求从而无刷新获取数据

2.XML简介

xml是可拓展文本标记语言,通常用来存储数据

<student>
	<name>张三</name>
	<sex></sex>
</student>

现在通常使用JSON格式代替

{”student“{”name“:“张三",”sex“:"男"}}
3.AJAX的缺点

1)没有浏览历史,不能回退
2)存在跨域问题(同源)
3)SEO(搜索引擎优化)不友好,因为是动态响应的,所以在HTTP响应体中没有

4.EXPRESS框架的使用

1)下载nodejs
2)VScode中创建项目,在项目最外层打开终端,要求路径全英文
3)编写express服务器脚本

//1.引入express
const express = require('express');

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

//3.创建路由规则
//request封装请求报文
//response封装响应报文
app.get('/',(request,response)=>{
    //设置响应
    response.send('Hello,Express!');
});

//4.监听端口启动服务
app.listen(8000,()=>{
    console.log('服务已启动,8000端口监听中...');
});

3)终端安装express

npm init --yes
npm i express

安装出错可以尝试以管理员发生打开VScode
4)再次右键以终端方式打开express运行脚本的上级文件夹

node+' '+Tab  即可运行脚本

5)浏览器打开 127.0.0.1:8000显示响应

6.一般在JS中创建方法使用AJAX
<script>
        const btn = document.getElementById('send');
        btn.onclick = function(){
            console.log('test');
            //创建对象
            const xhr = new XMLHttpRequest();
            //设置请求方式和URL
            xhr.open('GET','http://127.0.0.1:8000/server');
            //设置响应头信息
            //xhr.setRequestHeader('Content-Type','application/x-www-from-urlencoded');
            //发送
            xhr.send(); 
            //事件绑定处理服务器发送回的结果
            //readystate是xhr对象中的属性,表示状态,有0、1、2、3、4
            xhr.onreadystatechange = function(){
                //判断(4表示服务器返回了所有的结果)
                if(xhr.readyState === 4){
                    //判断响应状态码
                    if(xhr.status >= 200 && xhr.status < 300){
                        //处理结果 行 头 空行 体
                        console.log(xhr.status);//状态码
                        console.log(xhr.statusText);//状态字符串
                        console.log(xhr.getAllResponseHeaders);//所有响应头
                        console.log(xhr.response);//响应体
                    }
                    else{

                    }
                }
            }
        }
    </script>
7.AJAX传递参数方式

1)GET方式
在url后缀参数,如:

xhr.open('GET','http://127.0.0.1:8000/server?a=100&b=200&c=300');

2)POST方式
在send()方法中传参,格式不限,服务端能处理就行

xhr.send('a=100&b=200&c=300');
xhr.send('a:100&b:200&c:300');
8.JSON格式数据的传输

服务端代码(使用express框架)

app.all('/json-server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    //响应头    
    response.setHeader('Access-Control-Allow-Headers','*')
    //设置响应
    const data = {
        name:'liuyang'
    };
    let str = JSON.stringify(data);//只能传输字符串
    response.send(str);
});

前端接收JS代码

if(xhr.status >= 200 && xhr.status <= 300){
                        // console.log(xhr.response);
                        // rlt.innerHTML = xhr.response;
                        //1.手动对数据转化
                        // let data = JSON.parse(xhr.response);
                        // console.log(data);
                        // rlt.innerHTML = data.name;
                        //2.自动转化数据
                        //在send()前设置接收数据的格式:xhr.responseType = 'json';
                        //rlt.innerHTML = xhr.response.name;
                    }
9.使用nodemon自动重启工具

使用该工具后修改服务端代码就不用重启终端了

#安装命令
npm install -g nodemon
#重启终端
nodemon server.js
#使用失败时加npx
npx nodemon  server.js
10.解决IE缓存问题

在发送的URL后加上参数便于识别,如:

xhr.open('GET','http://127.0.0.1?t='+Date.now())
11.AJAX请求超时的处理
//超时设置
xhr.timeout = 2000;
//超时回调
xhr.ontimeout = function(){
    alert('响应超时,请稍后重试');
}
//网络异常回调
xhr.onerror = function(){
	alert('网络异常,请稍后重试');
}
12.AJAX取消请求
let xhr = null; 
btn1.onclick = function(){
	xhr = new XMLHttpRequest();
	xhr.open('GET','http://127.0.0.1:8000/server');
	xhr.send(); 
}
//abort方法取消请求
btn2.onclick = function(){
	xhr.abort();
}
13.AJAX解决重复请求问题

添加一个标识变量

<script>
        const btn = document.getElementById('send');
        const rlt = document.getElementById('result');
        let issending = false;
        let xhr = null;
        btn.onclick = function(){
            //判断标识变量
            if(issending){
                xhr.abort();//如果正在发送请求,则取消并发送一个新的请求
            }
            xhr = new XMLHttpRequest();
            issending = true;
            xhr.open('GET','http://127.0.0.1:8000/delay');
            xhr.send(); 
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                   issending = false;
                    if(xhr.status >= 200 && xhr.status < 300){
                        rlt.innerHTML = xhr.response;
                    }
                    else{

                    }
                }
            }
        }
 </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值