AJAX学习总结二

一、Ajax请求的几个问题

1.1 IE缓存问题

IE浏览器会对Ajax的请求结果做一个缓存,当响应体改变时,它不会更新,而是走缓存。
解决办法:让每次请求的url都不一样,在后面加一个参数,值为时间戳,就可以解决改变响应体时IE走缓存不更新的问题。

//针对IE缓存
app.get('/ie',(request,response)=>{
    //设置响应头  设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');

    //设置响应体
    response.send('hello IE');
});
<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');

        btn.addEventListener('click',function(){
            // console.log('test');
            const xhr = new XMLHttpRequest();
            xhr.open("GET",'http://127.0.0.1:8000/ieie?t='+ Date.now());
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status< 300){
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>

1.2 AJAX请求超时与网络异常处理

在服务端设置一个定时器

//延时响应
app.all('/delay',(request,response)=>{
    //设置响应头  设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    setTimeout(() => {
         //设置响应体
        response.send('延时响应');
    },3000)

点击按钮发送请求时,可以设置超时xhr.timeout和超时回调xhr.ontimeout,还有网络异常回调xhr.onerror

<body>
    <button>点击发送请求</button>
    <div id="result"></div>
    <script>
        const btn = document.getElementsByTagName('button')[0];
        const result = document.querySelector('#result');

        btn.addEventListener('click',function(){
            const xhr = new XMLHttpRequest();
            //超时设置2s
            xhr.timeout = 2000;
            //超时回调
            xhr.ontimeout = function(){
                alert("网络异常,请稍后重试!");
            }
            //网络异常回调
            xhr.onerror = function(){
                alert("网络异常,请稍后重试");
            }
            xhr.open("GET",'http://127.0.0.1:8000/delay');
            xhr.send();
            xhr.onreadystatechange = function(){
                if(xhr.readyState === 4){
                    if(xhr.status >= 200 && xhr.status< 300){
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
    </script>
</body>

1.3 AJAX手动取消请求

在服务端设置一个定时器

//延时响应
app.all('/delay',(request,response)=>{
    //设置响应头  设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    setTimeout(() => {
         //设置响应体
        response.send('延时响应');
    },3000)

取消请求,用xhr.abort()方法

<body>
    <button>点击发送</button>
    <button>点击取消</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll("button");
        let x = null;

        btns[0].onclick = function(){
            x = new XMLHttpRequest();
            x.open("GET",'http://127.0.0.1:8000/delay');
            x.send();
        }

        //abort 取消请求
        btns[1].onclick = function(){
            x.abort();
        }
    </script>
</body>

1.4 AJAX请求重复发送问题

在服务端设置一个定时器

//延时响应
app.all('/delay',(request,response)=>{
    //设置响应头  设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*');
    setTimeout(() => {
         //设置响应体
        response.send('延时响应');
    },3000)
<body>
    <button>点击发送</button>
    <script>
        //获取元素对象
        const btns = document.querySelectorAll("button");
        let x = null;
        //标识变量
        let isSending = false; // 是否正在发送AJAX请求

        btns[0].onclick = function(){
            x = new XMLHttpRequest();
            //判断标识变量
            if(isSending) x.abort();//如果正在发送,则取消该请求,创建一个新的请求
            //修改标识变量的值
            isSending = true;
            x.open("GET",'http://127.0.0.1:8000/delay');
            x.send();
            x.onreadystatechange = function(){
                if(x.readyState === 4){
                    //修改标识变量
                    isSending = false;
                }
            }
        }
    </script>
</body>

二、axios发送AJAX请求

服务端:

//axios 服务
app.all('/axios-server',(request,response)=>{
    //设置响应头  
    response.setHeader('Access-Control-Allow-Origin','*'); //设置允许跨域
    response.setHeader('Access-Control-Allow-Headers','*'); //接收自定义请求头
   
    const data = {name:'xiaoxiao'}
    response.send(JSON.stringify(data));
});

2.1 GET请求、POST请求和axios函数发送通用请求

<body>
    <button>GET</button>
    <button>POST</button>
    <button>AJAX</button>

    <script>
        const btns = document.querySelectorAll('button');

        //配置 baseURL
        axios.defaults.baseURL = 'http://127.0.0.1:8000';

        btns[0].onclick = function(){
            //GET请求
            axios.get('/axios-server',{
                //url参数
                params:{
                    id:100,
                    vip:7
                },
                //请求头信息
                Headers:{
                    name:'atguigu',
                    age:20
                }
            }).then(value => {
                console.log(value);
            })
        }

        btns[1].onclick = function(){
            //post请求
            axios.post('/axios-server',{
                    username:'admin',
                    password:'admin'
                },{
                //url参数
                params:{
                    id:200,
                    vip:0
                },
                //请求头信息
                Headers:{
                    height:120,
                    weight:130,
                }
         
            })
            
        }
        
        btns[2].onclick = function(){
            axios({
                //请求方法
                method:'POST',
                //url
                url:'/axios-server',
                //url参数
                params:{
                    vip:10,
                    level:30
                },
                //头信息
                Headers:{
                    a:100,
                    b:200
                },
                //请求体参数
                data:{
                    username:'admin',
                    password:'admin'
                }
            }).then(response => {
                console.log(response);
                //响应状态码
                console.log(response.status);
                //响应状态字符串
                console.log(response.statusText);
                //响应头信息
                console.log(response.Headers);
                //响应体
                console.log(response.data);
            })
        }
   </script>
</body>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值