使用XMLHttpRequest进行AJAX请求的详解

前言

Ajax的核心是XMLHttpRequest对象,它允许浏览器在不刷新页面的情况下与服务器通信,从而实现局部更新页面内容的效果。本文将通过几个具体的代码示例,详细介绍如何使用XMLHttpRequest对象进行GET和POST请求,并解释每个步骤的作用和注意事项。


1. 创建XMLHttpRequest对象

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 兼容性处理
        let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
        console.log(xhr);
    </script>
</body>
</html>

代码解析

在这段代码中,我们创建了一个XMLHttpRequest对象。为了确保兼容性,我们使用了条件判断:

  • window.XMLHttpRequest:现代浏览器都支持这种方式。
  • new ActiveXObject('Microsoft.XMLHTTP'):用于兼容IE6等旧版本浏览器。

通过这种方式,我们可以确保代码在不同浏览器环境下都能正常工作。


2. 发送GET请求

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 1. 创建XMLHttpRequest对象
        let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');

        // 2. 与服务器建立连接
        xhr.open('get', 'http://localhost:8888/test/first', true);

        // 3. 发送请求
        xhr.send();

        // 4. 等待响应
        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && /^(2|3)\d{2}$/.test(xhr.status)) {
                console.log(xhr.responseText);
            }
        };
    </script>
</body>
</html>

代码解析

这段代码展示了如何发送一个GET请求:

  1. 创建对象:同上一步骤。
  2. 建立连接 :使用xhr.open()方法指定请求方式(GET)、URL和是否异步(true表示异步)。
  3. 发送请求 :调用xhr.send()方法发送请求。
  4. 等待响应 :通过xhr.onreadystatechange事件监听器来处理服务器响应。当readyState为4且状态码为2xx或3xx时,表示请求成功,可以处理响应数据。

3. 发送POST请求

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <input type="button" value="请求数据">
    <script>
        const btn = document.querySelector('input');
        btn.onclick = function () {
            let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
            xhr.open('post', 'http://localhost:8888/test/fourth', true);
            xhr.onload = function () {
                console.log(JSON.parse(xhr.responseText));
            };
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            xhr.send('name=张三&age=18');
        };
    </script>
</body>
</html>

代码解析

这段代码展示了如何发送一个POST请求:

  1. 获取页面元素 :通过document.querySelector选择按钮元素,并为其添加点击事件。
  2. 创建对象:同上。
  3. 建立连接 :使用xhr.open()方法指定请求方式(POST)、URL和是否异步。
  4. 注册事件 :设置xhr.onload事件处理函数,用于处理服务器返回的数据。
  5. 设置请求头 :使用xhr.setRequestHeader()方法设置请求头,指定内容类型为application/x-www-form-urlencoded,即表单格式。
  6. 发送请求 :通过xhr.send()方法发送请求体数据,数据格式为键值对字符串。

4. 处理JSON数据

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE-edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        let str = '{"id": 1, "name": "苹果", "price": 30}';
        console.log(str); // 输出原始JSON字符串

        let obj = JSON.parse(str);
        console.log(obj); // 输出解析后的对象

        obj.price = 50; // 修改价格

        str = JSON.stringify(obj);
        console.log(str); // 输出修改后的JSON字符串
    </script>
</body>
</html>

代码解析

这段代码展示了如何处理JSON数据:

  1. 定义JSON字符串:定义一个包含商品信息的JSON字符串。
  2. 解析JSON字符串 :使用JSON.parse()方法将JSON字符串转换为JavaScript对象。
  3. 修改对象属性:直接操作对象属性,如修改商品价格。
  4. 序列化对象 :使用JSON.stringify()方法将JavaScript对象转换回JSON字符串。

5. 同步与异步请求

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE-edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 异步请求
        let xhrAsync = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
        xhrAsync.open('get', 'http://localhost:8888/test/second', true);
        xhrAsync.onload = function () {
            console.log(JSON.parse(xhrAsync.responseText));
        };
        xhrAsync.send();

        // 同步请求
        let xhrSync = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
        xhrSync.open('get', 'http://localhost:8888/test/second', false);
        xhrSync.send();
        console.log(JSON.parse(xhrSync.responseText));
    </script>
</body>
</html>

代码解析

这段代码展示了同步和异步请求的区别:

  1. 异步请求 :通过设置open()方法的第三个参数为true,请求会在后台执行,不会阻塞主线程。响应处理通过onload事件完成。
  2. 同步请求 :通过设置open()方法的第三个参数为false,请求会阻塞主线程,直到服务器响应返回。响应处理可以直接在send()之后进行。

需要注意的是,同步请求会导致页面卡顿,通常不推荐使用,除非有特殊需求。


6. 表单提交与AJAX结合

代码片段

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE-edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form action="http://www.baidu.com" method="post">
        <label for="">
            请输入姓名:
            <input type="text" name="userName" id="">
        </label>
        <label for="">
            请输入密码:
            <input type="password" name="password" id="">
        </label>
        <p><input type="submit" value="注册"></p>
    </form>
    <script>
        const form = document.querySelector('form');
        form.addEventListener('submit', function (event) {
            event.preventDefault(); // 阻止默认提交行为

            let xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
            xhr.open('post', 'http://localhost:8888/test/register', true);
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            xhr.onload = function () {
                console.log(JSON.parse(xhr.responseText));
            };
            xhr.send(`userName=${form.userName.value}&password=${form.password.value}`);
        });
    </script>
</body>
</html>

代码解析

这段代码展示了如何将表单提交与AJAX结合:

  1. 阻止默认提交行为 :通过event.preventDefault()防止表单自动提交。
  2. 创建并配置XMLHttpRequest对象:同上。
  3. 发送POST请求:从表单中获取用户输入的数据,并将其作为请求体发送。
  4. 处理响应 :通过xhr.onload事件处理服务器返回的数据。

结尾

通过上述代码示例,我们详细介绍了如何使用XMLHttpRequest对象进行GET和POST请求、处理JSON数据、以及同步与异步请求的区别。这些技术点在实际开发中非常常用,掌握它们可以帮助开发者构建更加高效和响应迅速的Web应用。

相关推荐
福兮说4 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理4 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6665 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人5 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)5 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan6 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_7 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒7 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技7 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu8 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub