javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > AJAX具体用法

AJAX本质、核心概念、实现方式、及具体用法

作者:zhougl996

ajax即异步JavaScript和XML,它是一种用于创建快速动态网页的技术,作用是通过在后台与服务器进行少量数据交换,使网页实现异步更新,这篇文章主要介绍了AJAX本质、核心概念、实现方式、及具体用法的相关资料,需要的朋友可以参考下

前言

AJAX并不是一种独立的请求方法,而是一种「前端异步请求数据、实现页面局部刷新」的技术思想/方案,我们先厘清核心概念,再详细说明AJAX的实现方式、历史演变及具体用法:

一、先明确:AJAX的本质与核心概念

1. AJAX的全称与定义

AJAX = Asynchronous JavaScript and XML(异步JavaScript和XML),它不是一种新的技术,而是整合了「JavaScript、XMLHttpRequest、DOM、CSS」等现有技术的异步数据交互方案

2. AJAX的核心特点

3. 关键误区:AJAX ≠ 具体请求工具

很多人会混淆「AJAX」和「XMLHttpRequest/axios/fetch」,它们的关系是:

AJAX(技术思想/方案) = 异步数据交互 + 局部页面刷新
实现AJAX的工具/手段:XMLHttpRequest(原生)、jQuery AJAX(封装)、axios(现代封装)、fetch(现代原生)

简单说:XMLHttpRequest/axios/fetch等都是AJAX思想的具体实现,AJAX是这些工具的“上层思想”

二、AJAX的发展历程(从经典到现代)

阶段核心实现工具特点时代背景
早期AJAX(2005年起)XMLHttpRequest(原生)语法繁琐、需手动封装、兼容IE早期前端项目(jQuery流行前)
经典AJAX(2010年起)jQuery AJAX(封装)语法简洁、跨浏览器兼容、内置常用功能jQuery主导的前端时代
现代AJAX(2015年起)fetch(原生)、axios(封装)Promise化、语法简洁、功能完善、支持现代框架Vue/React等现代前端框架时代

三、AJAX的3种核心实现方式(附详细示例)

结合你的翻译场景,我们分别演示「经典原生AJAX(XHR)」「jQuery AJAX」「现代AJAX(axios/fetch)」的具体用法:

1. 经典原生AJAX(基于XMLHttpRequest)

这是AJAX的最早实现方式,也是所有AJAX工具的底层基础,对应你之前问到的XMLHttpRequest

/**
 * 原生XMLHttpRequest实现AJAX(翻译请求)
 * (这是最早期的AJAX实现,属于AJAX范畴)
 */
export function ajaxByXHR(query, from = 'auto', to = 'en') {
  return new Promise((resolve, reject) => {
    // 1. 前置校验
    if (!query?.trim()) {
      reject(new Error('请传入有效翻译文本'));
      return;
    }

    // 2. 创建XHR实例(AJAX的核心载体)
    const xhr = new XMLHttpRequest();

    // 3. 配置请求(异步请求:第三个参数为true)
    const url = 'http://localhost:3000/api/translate/baidu';
    xhr.open('POST', url, true); // 异步是AJAX的核心特性

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

    // 5. 监听异步响应(onreadystatechange是异步回调的核心)
    xhr.onreadystatechange = function () {
      // readyState=4:请求完成(异步响应接收完毕)
      if (xhr.readyState === 4) {
        // 状态码200-299:请求成功
        if (xhr.status >= 200 && xhr.status < 300) {
          try {
            // 早期用XML解析,现在用JSON解析
            const data = JSON.parse(xhr.responseText);
            if (data.code !== 0) {
              reject(new Error(data.msg || '翻译失败'));
              return;
            }
            // 仅更新页面局部内容(AJAX的局部刷新特性)
            document.getElementById('translate-result').innerText = data.data.text;
            resolve(data.data);
          } catch (err) {
            reject(new Error('响应解析失败:' + err.message));
          }
        } else {
          reject(new Error(`请求失败:${xhr.status} ${xhr.statusText}`));
        }
      }
    };

    // 6. 监听超时/错误
    xhr.ontimeout = () => reject(new Error('请求超时'));
    xhr.onerror = () => reject(new Error('网络异常'));

    // 7. 发送异步请求
    xhr.send(JSON.stringify({ query, from, to }));
  });
}

2. 经典jQuery AJAX(曾经的AJAX主流方案)

jQuery对原生XMLHttpRequest进行了封装,简化了AJAX语法,是过去很长一段时间的前端AJAX标配:

前置准备:引入jQuery

<!-- CDN引入jQuery -->
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

完整示例

/**
 * jQuery AJAX实现翻译请求(经典AJAX方案)
 */
function ajaxByJQuery(query, from = 'auto', to = 'en') {
  if (!query?.trim()) {
    alert('请传入有效翻译文本');
    return;
  }

  // $.ajax()是jQuery封装的AJAX核心方法
  $.ajax({
    url: 'http://localhost:3000/api/translate/baidu', // 请求地址
    method: 'POST', // 请求方法
    dataType: 'json', // 预期响应数据格式(自动解析JSON)
    contentType: 'application/json', // 请求体格式
    data: JSON.stringify({ query, from, to }), // 请求数据
    timeout: 8000, // 超时时间
    async: true, // 开启异步(默认true,AJAX核心特性)
    // 异步成功回调(局部刷新页面)
    success: function (data) {
      if (data.code === 0) {
        $('#translate-result').text(data.data.text); // 局部更新DOM
        console.log('jQuery AJAX翻译成功:', data.data);
      } else {
        alert('翻译失败:' + data.msg);
      }
    },
    // 异步失败回调
    error: function (xhr, status, error) {
      console.error('jQuery AJAX失败:', status, error);
      alert('请求失败,请稍后重试');
    }
  });
}

// 调用
// ajaxByJQuery('你好世界', 'auto', 'en');

jQuery AJAX的简化写法

// $.get():简化GET请求
$.get('/api/public/info', function (data) {
  $('#info').html(data.content);
});

// $.post():简化POST请求
$.post('/api/translate/baidu', { query: '你好', from: 'auto', to: 'en' }, function (data) {
  $('#translate-result').text(data.data.text);
}, 'json');

3. 现代AJAX(基于axios/fetch)

随着Promise和现代前端框架的普及,原生fetch和axios成为了现代AJAX的主流实现,它们本质上依然是AJAX思想的延续(异步请求+局部刷新):

(1)axios实现现代AJAX(推荐)

import axios from 'axios';

/**
 * axios实现现代AJAX(翻译请求)
 * (axios是AJAX思想的现代封装,保留异步+局部刷新核心)
 */
export async function ajaxByAxios(query, from = 'auto', to = 'en') {
  if (!query?.trim()) {
    throw new Error('请传入有效翻译文本');
  }

  try {
    // 异步请求(await体现异步特性)
    const response = await axios.post(
      'http://localhost:3000/api/translate/baidu',
      { query, from, to },
      { timeout: 8000 }
    );

    const data = response.data;
    if (data.code === 0) {
      // 局部刷新页面(AJAX核心特性)
      document.getElementById('translate-result').innerText = data.data.text;
      return data.data;
    } else {
      throw new Error(data.msg || '翻译失败');
    }
  } catch (error) {
    console.error('axios AJAX失败:', error.message);
    window.$message?.error('请求失败');
    throw error;
  }
}

(2)fetch实现现代AJAX

/**
 * fetch实现现代AJAX(原生Promise化,无需依赖)
 */
export async function ajaxByFetch(query, from = 'auto', to = 'en') {
  if (!query?.trim()) {
    throw new Error('请传入有效翻译文本');
  }

  const controller = new AbortController();
  const timeoutId = setTimeout(() => controller.abort(), 8000);

  try {
    // 异步请求(Promise化异步)
    const response = await fetch('http://localhost:3000/api/translate/baidu', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ query, from, to }),
      signal: controller.signal
    });

    clearTimeout(timeoutId);

    if (!response.ok) {
      throw new Error(`请求失败:${response.status}`);
    }

    const data = await response.json();
    if (data.code === 0) {
      // 局部刷新页面
      document.getElementById('translate-result').innerText = data.data.text;
      return data.data;
    } else {
      throw new Error(data.msg || '翻译失败');
    }
  } catch (error) {
    console.error('fetch AJAX失败:', error.message);
    window.$message?.error('请求失败');
    throw error;
  }
}

四、AJAX与传统同步请求的核心区别

特性AJAX(异步请求)传统同步请求(如form表单提交)
页面刷新方式局部刷新(仅更新指定DOM)整页刷新(页面跳转/重载)
执行阻塞性异步非阻塞(请求发送后可继续操作页面)同步阻塞(请求发送后页面无法操作,等待响应)
用户体验流畅(无页面闪烁、无需等待整页加载)较差(页面闪烁、等待时间长)
数据格式支持JSON/XML/Blob等(灵活)多为表单数据/HTML(不灵活)
实现方式XMLHttpRequest/jQuery AJAX/axios/fetchform表单提交、window.location.href

五、AJAX的适用场景与局限性

1. 适用场景

2. 局限性

六、总结

  1. AJAX是思想,不是具体工具:它的核心是「异步数据交互+页面局部刷新」,XMLHttpRequest、jQuery AJAX、axios、fetch都是AJAX的实现方式;
  2. 发展历程:原生XHR(早期)→ jQuery AJAX(经典)→ axios/fetch(现代),功能越来越简洁、强大;
  3. 核心特性:异步性(不阻塞页面)、局部刷新(提升体验)是AJAX与传统请求的根本区别;
  4. 你的翻译场景:无论是用axios还是fetch,本质都是AJAX请求,生产环境需通过后端中转实现安全访问。

到此这篇关于AJAX本质、核心概念、实现方式、及具体用法的文章就介绍到这了,更多相关AJAX具体用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文