AJAX的学习

AJAX介绍

AJAX,即Asynchronous Javascript And XML,是一种创建交互式网页应用的开发技术,通过与服务器进行数据交换实现局部网页的刷新(异步),传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页页面。

AJAX中的JavaScript指的是使用JavaScript技术来发送异步请求,并接受响应的数据,而XML指的是请求与响应间传输的数据格式是XML(现在主流数据格式是JSON)。

AJAX应用场景

表单异步校验:比如我们在注册一个账号时,如果用户名已经存在,网页会给我们友好提示用户名已经占用,通过AJAX技术,异步与服务器进行数据交换,在数据库中查询用户名是否存在并局部渲染到网页上。

搜索框联想:我们在百度查阅资料时,输入字就会出现联想框,整个页面并未刷新,但会根据输入的字显示相关词条,异步实现。

原生的AJAX

原生的AJAX指的是不使用任何的框架,通过原始的JS来实现AJAX,这个过程依赖于AJAX的引擎对象:XMLHttpRequest

原生AJAX的api如下:

|--------------------------------------|---------------------------------------|----------------------------------------------------------------------------------------|
| new XMLHttpRequest | 创建AJAX引擎对象 | |
| onreadystatechange | 监听请求和响应的变化 | 事件处理程序属性 |
| readyState | 获取请求状态值 | 值从0到4 |
| status | 获取响应状态值 | 值为响应状态码,请自行查阅 |
| responseText | 获取响应的文本数据 | 服务器只能响应回字符串 |
| open(methon,url,async,user,password) | 初始化一个 HTTP 请求,即配置请求的类型、URL 和是否异步。 | method:get/post(请求方式) url:请求的资源路径 async:true/false(是否为异步) user和password:用于基本身份验证(了解即可) |
| send() | 把open方法配置好的请求真正发送出去 | 可以携带请求体(例如 POST 请求中的数据),请求过程中会触发onreadtstatechange等一系列事件 |

概念补充:事件处理程序属性是对象的一个特殊属性,它用来指定当特定事件发生时要调用的函数。这些事件通常是用户交互(例如点击、输入)或者浏览器事件(如请求完成、加载完成)。它的值是一个函数,该函数会在事件被触发时执行(如window.onload或element.onclick)。

工作流程

  1. 创建 XMLHttpRequest 对象
    const xhr = new XMLHttpRequest();
  2. 配置请求信息
    xhr.open("GET", url, true);
  3. (可选)设置请求头
    xhr.setRequestHeader("Content-Type", "application/json");
  4. 发送请求
    xhr.send();

小任务:通过原生AJAX实现登陆表单校验

  1. 创建一个 HTML 表单,用户输入用户名和密码。
  2. 使用原生 AJAX 请求验证用户名和密码(假设请求会返回一个 JSON 响应)。
  3. 进行前端验证,检查用户名和密码是否为空。
  4. 发送请求,并根据响应处理表单的验证结果。
html 复制代码
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login Form</title>
</head>
<body>

    <h2>Login</h2>
    <form id="loginForm">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
        <br><br>
        <label for="password">Password:</label>
        <input type="password" id="password" name="password" required>
        <br><br>
        <button type="submit">Login</button>
    </form>

    <div id="error-message" style="color:red;"></div>

    <script src="login.js"></script>
</body>
</html>
javascript 复制代码
//login.js
document.getElementById('loginForm').addEventListener('submit', function(event) {
    event.preventDefault(); // 阻止表单的默认提交行为

    // 获取用户名和密码
    const username = document.getElementById('username').value;
    const password = document.getElementById('password').value;

    // 清除上一次的错误消息
    document.getElementById('error-message').textContent = '';

    // 前端表单校验
    if (!username || !password) {
        document.getElementById('error-message').textContent = 'Username and Password are required!';
        return;
    }

    // 创建 XMLHttpRequest 对象
    const xhr = new XMLHttpRequest();
    
    // 配置请求方式和 URL(假设服务器地址为 /api/login)
    xhr.open('POST', '/api/login', true);

    // 设置请求头为 JSON 格式
    xhr.setRequestHeader('Content-Type', 'application/json');

    // 请求完成后的回调函数
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) { // 请求已完成
            if (xhr.status === 200) { // 请求成功
                const response = JSON.parse(xhr.responseText); // 假设服务器返回 JSON 响应
                if (response.success) {
                    alert('Login successful!');
                } else {
                    document.getElementById('error-message').textContent = response.message;
                }
            } else {
                document.getElementById('error-message').textContent = 'An error occurred. Please try again.';
            }
        }
    };

    // 发送请求,传递用户名和密码
    xhr.send(JSON.stringify({ username, password }));
});
javascript 复制代码
//服务器(node.js实现,使用express框架)
const express = require('express');
const app = express();
app.use(express.json());

app.post('/api/login', (req, res) => {
    const { username, password } = req.body;

    // 简单的用户名和密码验证(可以替换为数据库验证)
    if (username === 'admin' && password === '12345') {
        res.json({ success: true });
    } else {
        res.json({ success: false, message: 'Invalid username or password' });
    }
});

app.listen(3000, () => {
    console.log('Server running on http://localhost:3000');
});

基于fetch的AJAX

fetch是一种现代的网络请求API ,用于在 JavaScript 中替代传统的xhr来发送 HTTP 请求(如 GET、POST)。它语法更简洁、基于Promise,适合异步操作。

基本语法如下:

javascript 复制代码
fetch(url, options)
  .then(response => response.json()) // 解析响应
  .then(data => console.log(data))   // 处理数据
  .catch(error => console.error(error)); // 错误处理

其中,options是一个配置对象,用来告诉fetch请求的方式,头信息,请求体等参数,如果只传一个参数,fetch默认发起get请求。

以下是一个post请求的实例:

javascript 复制代码
fetch('https://api.example.com/login', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    username: 'admin',
    password: '12345'
  })
})
.then(response => response.json())
.then(data => console.log('Success:', data))
.catch(error => console.error('Error:', error));

两者对比

特性 XMLHttpRequest fetch
语法 回调(callback) Promise
可读性 较复杂 更简洁
默认异步
支持流式响应 支持
错误处理 通过onreadystatechange 通过.catch()

以上就是笔者对于AJAX的学习,如有错误,请大家多多指!

相关推荐
ganshenml16 小时前
【Web】证书(SSL/TLS)与域名之间的关系:完整、通俗、可落地的讲解
前端·网络协议·ssl
摆烂积极分子17 小时前
安卓开发学习-安卓版本
android·学习
这是个栗子17 小时前
npm报错 : 无法加载文件 npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
HIT_Weston17 小时前
44、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(一)
前端·ubuntu·gitlab
华仔啊18 小时前
Vue3 如何实现图片懒加载?其实一个 Intersection Observer 就搞定了
前端·vue.js
JamesGosling66618 小时前
深入理解内容安全策略(CSP):原理、作用与实践指南
前端·浏览器
2***s67218 小时前
【Go】Go语言基础学习(Go安装配置、基础语法)
服务器·学习·golang
不要想太多18 小时前
前端进阶系列之《浏览器渲染原理》
前端
g***969018 小时前
Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
前端·npm·node.js
七喜小伙儿18 小时前
第2节:趣谈FreeRTOS--打工人的日常
前端