Loading

Ajax起步

Express作为一个基于Node.js的一个极简的开发框架

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

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

//创建路由规则
app.get('/server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*'); 
    //设置响应体
    response.send('Hello Express');
});

app.listen(8000 , ()=>{
    console.log("服务已经启动,8000端口打开");
})

app.liesten()是 Express 框架中启动 HTTP 服务器的核心方法,其作用是将 Express 应用绑定到指定端口并开始监听客户端请求。第一个是开放端口,第二个是回调函数,在端口开启后紧接着触发

response.setHeader('Access-Control-Allow-Origin','*'); 设置响应头,表示允许跨域,这样设置表示允许所有类型的请求进行跨域

Ajax进行基本请求

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ajax Get请求</title>
    <style>
        #result{
            width: 200px;
            height:100px;
            border:solid 1px #90b;
        }
    </style>
</head>
<body>
    <button>按钮1</button>
    <div id="result"></div>

    <script>
        //获取button元素
        const btn = document.getElementsByTagName('button')[0];
        const result = document.getElementById("result");
        //绑定事件
        btn.onclick = function(){
            //创建对象
            const xhr = new XMLHttpRequest();
            xhr.open('GET','http:127.0.0.1:8000/server');
            //发送
            xhr.send();
            //事件绑定,处理服务端返回结果
            //当状态发生改变时调用,其中readystate是xhr对象的属性
            //其中有五个状态0 1 2 3 4 
            //0是刚开始的属性,1是初始化完成,2是发送请求,3是服务端返回部分值,4是服务端返回所有值
            //change是改变
            xhr.onreadystatechange = function(){
                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);
                        result.innerHTML=xhr.response;
                    }
                }
            }
        }
    </script>
</body>
</html>

其中getElementsByTagName是根据标签获取一个动态的集合,其中[0]是用来获取第0个按钮

getElementById是根据id,作为唯一标识获取相对应的元素

get传参

xhr.open('GET','http:127.0.0.1:8000/server');直接在对应的url后面?加参数就可以

post传参

<script>
        const result = document.getElementById("result");
        //绑定事件
        result.addEventListener("mouseover",function(){
            //1.创建对象
            const xhr = new XMLHttpRequest();
            //2.对象初始化
            xhr.open('POST','http://127.0.0.1:8000/server');
            //3.发送
            xhr.send("a=111&b=222");
            //4.事件绑定
            xhr.onreadystatechange = function(){
                //判断
                if(xhr.readyState === 4){
                    if(xhr.status>=200&& xhr.status<300){
                        result.innerHTML = xhr.response;
                    }
                }
            }
        })
        
    </script>

当鼠标移过result对象时,执行函数,向服务端发送post请求,服务端需要有进行接收

将请求体放在send里,可以直接进行传参

app.post('/server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Origin','*'); 
    //设置响应体
    response.send('Hello Express ;try to Post it!!!');
});

请求头设置

const xhr = new XMLHttpRequest();
//2.对象初始化
xhr.open('POST','http://127.0.0.1:8000/server');
//设置请求头
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.setRequestHeader('name','huidu');
//3.发送
xhr.send('a=111&b=222');

由于有自定义的请求头,这就需要响应服务端可以接收任意请求头:由于服务端还要进行预检,需要对服务端进行option传参,所以建议用all

app.all('/server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Headers','*');
    response.setHeader('Access-Control-Allow-Origin','*'); 
    //设置响应体
    response.send('Hello Express ;try to Post it!!!');
});

服务端响应JSON数据

app.get('/json-server',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Headers','*');
    response.setHeader('Access-Control-Allow-Origin','*'); 
    //设置响应体
    const data ={
        name:'huidu'
    }
    //response.send('Hello Json;try to get it!!!');
    response.send(JSON.stringify(data));
});

服务端的响应体中是不能返回一个对象的,所以需要JSON.stringify()将对象数据转化为字符串,然后进行响应对象的传输

我们可以在发送之前设置响应体的类型

<script>
        const result = document.getElementById('result');
        window.onkeydown = function(){
            //发送请求
            const xhr = new XMLHttpRequest();
            //初始化
            xhr.open('GET','http://127.0.0.1:8000/json-server');
            xhr.responseType='json';
            //发送
            xhr.send();
            //事件绑定
            xhr.onreadystatechange = function(){
                if(xhr.readyState ===4){
                    if(xhr.status>=200&&xhr.status<300){
                        console.log(xhr.response);
                        
                        result.innerHTML = xhr.response.name;
                    }
                }
            }
        }
    </script>

也可以用JSON.parse()进行数据转换const result =JSON.parse(xhr.response)

Ajax对于网络超时与网络异常的处理

为了测试相关内容,我们首先需要让服务端进行延时处理setTimeout,第一个回调函数,第二个是延迟事件

app.get('/overtime',(request,response)=>{
    //设置响应头,设置允许跨域
    response.setHeader('Access-Control-Allow-Headers','*');
    response.setHeader('Access-Control-Allow-Origin','*'); 
    setTimeout(()=>{
        response.send('延迟显示');
    },3000)
    //设置响应体
    
});

xhr.timeout=用于设置超时时间,ontimeout用于超时处理,onerror同理

<script>
        const btn = document.getElementsByTagName('button')[0];
        const result=document.querySelector('#result');

        btn.addEventListener('click',function(){
            const xhr = new XMLHttpRequest();
            xhr.timeout = 2000;
            xhr.ontimeout=function(){
                result.innerHTML="网络超时!!!";
            }
            xhr.onerror=function(){
                result.innerHTML="网络异常!!!";
            }
            xhr.open('GET','http://127.0.0.1:8000/overtime');
            xhr.send();
            xhr.onreadystatechange= function(){
                if(xhr.readyState ===4){
                    if(xhr.status>=200&&xhr.status<300){
                        result.innerHTML=xhr.response;
                    }
                }
            }
        })
    </script>

在JavaScript中,document.querySelector('#result')document.getElementById('result') 都是用于获取DOM元素的方法,但它们在实现机制、适用场景和性能上存在关键区别。

其中document.querySelector('#result')被用于如嵌套结构、组合条件,但是作用时间较长,document.getElementById('result')实现速度较快,作用于唯一id值

箭头函数和传统函数最大的区别就是箭头函数无法实例化,且无法使用this,但是它胜在简洁

Ajax进行取消请求

<script>
        const btn = document.getElementsByTagName('button');
        const result=document.querySelector('#result');

        let hxr = null;
        btn[0].addEventListener('click',()=>{
            hxr = new XMLHttpRequest();
            hxr.open("GET","http://127.0.0.1:8000/no-send");
            hxr.send();
            hxr.onreadystatechange=function(){
                if(this.readyState===4){
                    if(this.status>=200&&this.status<300){
                        result.innerHTML=this.response;
                    }
                }
            }
        });
        btn[1].addEventListener('click',()=>{
            hxr.abort();
        })
    </script>

hxr.abort();取消请求的核心

jQuery的Ajax传输

GET/POST传参

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script>
        const result = document.getElementById('result');
        $('button').eq(0).click(()=>{
            // $.get('http://127.0.0.1:8000/jQuery',{a:100,b:200},(data)=>{
            //     // 正确操作:修改DOM内容而非变量本身
            //     result.innerHTML = JSON.stringify(data);
            // })
            $.post('http://127.0.0.1:8000/jQuery',{a:100,b:200},(data)=>{
                // 正确操作:修改DOM内容而非变量本身
                result.innerHTML = JSON.stringify(data);
            })
        })
    </script>

上面是简单的get/post传参,并非通用方法

$.post('url',传入参数,回调函数(获取的参数是response响应体对象))

通用型方法

<script>
        const result = document.getElementById('result');
        $('button').eq(0).click(() => {
            $.ajax({
                //url
                url: 'http://127.0.0.1:8000/jQuery',
                //请求类型
                type: 'POST',
                //响应体结果类型
                //dataType:'json',
                //传入参数
                data: {
                    a: 100,
                    b: 200
                },
                //成功的回调
                success: (data) => {
                    result.innerHTML = data;
                    console.log("成功的回调");
                },
                //超时时间
                timeout: 2000,
                //失败的回调
                error: () => {
                    console.log("出错了");
                },
                headers: {
                    a: 100,
                    b: 200
                }
            })
        })
    </script>

axios的Ajax传输

<script>
        const result = document.getElementById('result');
        const btn = document.getElementsByTagName('button');

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

        btn[0].addEventListener('click', () => {
            axios.get('/axios-serve', {
                //url参数
                params: {
                    id: 100,
                    vip: 7
                },
                //请求头信息
                headers: {
                    name: 'huidu',
                    age: 20
                }
            }).then((value) => {
                result.innerHTML = value.data;
            })
        })
        btn[1].addEventListener('click', () => {
            axios.post('/axios-serve', {
                name: 'huidu',
                age: 20
            }, {
                headers: {
                    id: 200,
                    vip: 1
                },
                params: {
                    id: 200,
                    vip: 500
                }
            })
        })
    </script>

其中params是get传入参数,也就是?之后的内容

跨域资源共享

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Guides/CORS

Ajax本身是支持同源策略的,需要同协议,同ip和同端口

但是我们可以在服务端加入响应头 ,来确保可以完成跨域资源共享

response.setHeader('Access-Control-Allow-Origin','*');

posted @ 2025-07-10 11:06  huidu01  阅读(9)  评论(0)    收藏  举报
; ;