• AJAX的奇妙之旅(1)基础知识


    一、简介

    AJAX(Asynchronous JavaScript and XML)是一种使用现有标准的新方法。它是一种用于创建快速动态网页的技术。AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行

    1.1什么是 AJAX

    AJAX = 异步 JavaScript 和 XML

    AJAX 是一种用于创建快速动态网页的技术。

    通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面

    1.2AJAX 工作原理 

    1.3应用场景

    • 表单验证:使用 AJAX 可以在客户端进行表单验证,减少不必要的服务器开销。
    • 动态加载内容:使用 AJAX 可以动态地向页面中添加内容,而无需重新加载整个页面。
    • 设置联想词功能:使用 AJAX 可以根据用户输入自动完成搜索框联想词
    • 按需取数据:在 web 应用中,经常会用到分类树或树形结构,例如部门结构、文件的分类结构等。AJAX 技术可以实现树形结构,只获取第一级子分类的数据并显示,当用户点开一级分类的第一节点时,页面会通过 AJAX 向服务器请求当前分类所属的二级子分类的所有数据。如果再请求已经呈现的二级分类的某一节点时,再次向服务器请求当前分类所属的三级子分类的所有数据,以此类推。页面会根据用户的操作向服务器请求所需要的数据,这样就不会存在数据的冗余,减少了数据下载总量。同时,更新页面时不需要重新加载全部内容,只更新需要更新的那部分内容即可,大大缩短了用户的等待时间.
    • 自动更新页面:web 应用中有很多数据的变化是实时的,例如最新的新闻、天气预报以及聊天室等等。使用 AJAX 技术可以改善这种情况,页面加载以后,会通过 AJAX 在后台进行定时的轮询,向服务器发送请求,查看是否有最新的消息。如果有,则将新的数据下载并且在页面上进行动态更新,通过一定的方式通知用户

    1.4示例演示

    1. "en">
    2. "UTF-8">
    3. "X-UA-Compatible" content="IE=edge">
    4. "viewport" content="width=device-width, initial-scale=1.0">
    5. AJAX概念和axios使用
    6. "my-p">

    二、AJAX语法

    2.1URL是什么

    URL(Uniform Resource Locator)是一种字符串,用于标识互联网上的资源的位置12。它是一种用于定位和访问互联网上资源的标准格式。URL 通常由三部分组成:协议、主机名和路径。例如,https://www.bing.com/search?q=URL 中,https 是协议,www.bing.com 是主机名,search?q=URL 是路径

    2.2 URL查询参数

    查询参数是 URL 中的一部分,用于向服务器发送信息. 查询参数通常以 ? 开头,后跟一个或多个键值对,键和值之间用 = 分隔,不同键值对之间用 & 分隔 例如,在 https://www.bing.com/search?q=URL 中,查询参数为 q=URL 

     

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. head>
    8. <body>
    9. <p class="my-p">p>
    10. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    11. <script>
    12. // 2. 使用axios函数
    13. axios({
    14. url: 'http://hmajax.itheima.net/api/city',
    15. params:{
    16. pname:'黑龙江省'
    17. }
    18. }).then(result => {
    19. console.log(result)
    20. // 好习惯:多打印,确认属性名
    21. console.log(result.data.list)
    22. console.log(result.data.list.join('
      '
      ))
    23. // 把准备好省份列表,插入到页面
    24. document.querySelector('.my-p').innerHTML = result.data.list.join('
      '
      )
    25. // 将 result 对象的 data 属性中的 list 属性打印到控制台,并将 list 中的元素用
      标签连接起来,然后将连接后的字符串插入
    26. // 到页面中类名为 .my-p 的元素内。
    27. })
    28. script>
    29. body>
    30. html>

     2.3axios是什么

    Axios 是一个基于 JavaScript 的 HTTP 客户端,用于在浏览器和 Node.js 中发送异步请求。它是一个基于 Promise 的库,可以用于处理 HTTP 请求和 响应。

    Axios 可以在浏览器中使用 XMLHttpRequests,在服务器端使用 Node.js http 模块。它提供了许多功能,包括从浏览器中进行 XMLHttpRequests 请求、支持 Promise API、拦截请求和响应、转换请求和响应数据、取消请求、自动转换 JSON 数据等

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>04.案例_地区查询title>
    8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
    9. <style>
    10. :root {
    11. font-size: 15px;
    12. }
    13. body {
    14. padding-top: 15px;
    15. }
    16. style>
    17. head>
    18. <body>
    19. <div class="container">
    20. <form id="editForm" class="row">
    21. <div class="mb-3 col">
    22. <label class="form-label">省份名字label>
    23. <input type="text" value="北京" name="province" class="form-control province" placeholder="请输入省份名称" />
    24. div>
    25. <div class="mb-3 col">
    26. <label class="form-label">城市名字label>
    27. <input type="text" value="北京市" name="city" class="form-control city" placeholder="请输入城市名称" />
    28. div>
    29. form>
    30. <button type="button" class="btn btn-primary sel-btn">查询button>
    31. <br><br>
    32. <p>地区列表: p>
    33. <ul class="list-group">
    34. <li class="list-group-item">东城区li>
    35. ul>
    36. div>
    37. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    38. <script>
    39. /*
    40. 获取地区列表: http://hmajax.itheima.net/api/area
    41. 查询参数:
    42. pname: 省份或直辖市名字
    43. cname: 城市名字
    44. */
    45. // 目标: 根据省份和城市名字, 查询地区列表
    46. // 1. 查询按钮-点击事件
    47. document.querySelector('.sel-btn').addEventListener('click', () => {
    48. // 2. 获取省份和城市名字
    49. let pname = document.querySelector('.province').value
    50. let cname = document.querySelector('.city').value
    51. // 3. 基于axios请求地区列表数据
    52. axios({
    53. url: 'http://hmajax.itheima.net/api/area',
    54. params: {
    55. pname,
    56. cname
    57. }
    58. }).then(result => {
    59. // console.log(result)
    60. // 4. 把数据转li标签插入到页面上
    61. let list = result.data.list
    62. console.log(list)
    63. let theLi = list.map(areaName => `
    64. ${areaName}
    65. `).join('')
  • console.log(theLi)
  • document.querySelector('.list-group').innerHTML = theLi
  • })
  • })
  • script>
  • body>
  • html>
  • 2.4常用请求方法和数据提交

    常用请求方法

     axios请求数据

    1. axios({
    2. url: '目标资源地址',
    3. method: '请求方法',
    4. data: {
    5. 参数名: 值
    6. }
    7. }).then(result => {
    8. // 对服务器返回的数据做后续处理
    9. })
    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>05.常用请求方法和数据提交title>
    8. head>
    9. <body>
    10. <button class="btn">注册用户button>
    11. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    12. <script>
    13. /*
    14. 注册用户: http://hmajax.itheima.net/api/register
    15. 请求方法: POST
    16. 参数名:
    17. username: 用户名 (中英文和数字组成, 最少8位)
    18. password: 密码 (最少6位)
    19. 目标: 点击按钮, 通过axios提交用户和密码, 完成注册
    20. */
    21. document.querySelector('.btn').addEventListener('click', () => {
    22. axios({
    23. url: 'http://hmajax.itheima.net/api/register',
    24. method: 'POST',
    25. data: {
    26. username: 'yanyu0712',
    27. password: '7654321'
    28. }
    29. }).then(result=>{
    30. console.log(result)
    31. })
    32. })
    33. script>
    34. body>
    35. html>

    2.5axios错误处理

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>05.常用请求方法和数据提交title>
    8. head>
    9. <body>
    10. <button class="btn">注册用户button>
    11. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    12. <script>
    13. /*
    14. 注册用户: http://hmajax.itheima.net/api/register
    15. 请求方法: POST
    16. 参数名:
    17. username: 用户名 (中英文和数字组成, 最少8位)
    18. password: 密码 (最少6位)
    19. 目标: 点击按钮, 通过axios提交用户和密码, 完成注册
    20. */
    21. document.querySelector('.btn').addEventListener('click', () => {
    22. axios({
    23. url: 'http://hmajax.itheima.net/api/register',
    24. method: 'POST',
    25. data: {
    26. username: 'yanyu0712',
    27. password: '7654321'
    28. }
    29. }).then(result=>{
    30. console.log(result)
    31. }).catch(error => {
    32. // 失败
    33. // 处理错误信息
    34. console.log(error)
    35. console.log(error.response.data.message)
    36. alert(error.response.data.message)
    37. })
    38. })
    39. script>
    40. body>
    41. html>

     2.6HTTP 协议-请求报文

    HTTP 请求报文是在应用程序之间发送的数据块,用于 HTTP 协议交互。请求端(客户端)的 HTTP 报文叫做请求报文,响应端(服务器端)的叫做响应报文。HTTP 报文本身是由多行数据构成的字符串文本

    一个 HTTP 请求报文由四个部分组成:请求行、请求头部、空行和请求体

    1. GET /index.html HTTP/1.1
    2. Host: www.example.com
    3. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
    4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    5. Referer: https://www.google.com/
    • 请求行包含了请求方法、URL 和协议版本。
    • 请求头部包含了一系列属性,如 User-Agent、Accept 和 Referer,用于告知服务器有关客户端的信息。
    • 空行用于分隔请求头部和请求体。
    • 请求体包含了实际的请求数据,如表单字段等。

    2.7HTTP 协议-响应报文 

    HTTP 响应报文是指服务器在接收到客户端的 HTTP 请求后,返回给客户端的报文。它由四个部分组成:响应行、响应头部、空行和响应体

    1. HTTP/1.1 200 OK
    2. Content-Type: text/html; charset=UTF-8
    3. Content-Length: 138
    4. Date: Sat, 23 Sep 2023 12:43:55 GMT
    5. html>
    6. <html>
    7. <head>
    8. <title>Example Pagetitle>
    9. head>
    10. <body>
    11. <h1>Hello, World!h1>
    12. body>
    13. html>
    • 响应行包含了协议版本、状态码和状态描述。
    • 响应头部包含了一系列属性,如 Content-Type、Content-Length 和 Date,用于告知客户端有关响应的信息。
    • 空行用于分隔响应头部和响应体。
    • 响应体包含了实际的响应数据,如 HTML 页面内容。

    2.8接口文档

    接口文档是用于描述系统所提供接口信息的一种说明文档。在项目开发中,web项目是前后端分离开发的,APP开发,需要由前后端工程师共同定义接口,编写接口文档,之后大家都根据这个接口文档进行开发,到项目结束前都要一直维护。接口文档应当包括以下内容:

    • 接口简介: 描述接口的功能和用途。
    • 定义请求协议: 描述请求协议的类型,如HTTP、HTTPS、FTP等。
    • 请求地址源: 描述请求地址的来源。
    • 请求方式: 描述接口的功能和使用方法。
    • 请求参数: 描述请求参数的格式和内容。
    • 返回参数示例: 描述如何判断接口是否收到了请求,并且返回了正确的结果。
    • 状态码: 用于快速向请求方反馈当前请求的处理结果

     三、案例分析--用户登录

    登录实现

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>11.案例_登录title>
    8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
    9. <style>
    10. html,
    11. body {
    12. background-color: #EDF0F5;
    13. width: 100%;
    14. height: 100%;
    15. display: flex;
    16. justify-content: center;
    17. align-items: center;
    18. }
    19. .container {
    20. width: 520px;
    21. height: 540px;
    22. background-color: #fff;
    23. padding: 60px;
    24. box-sizing: border-box;
    25. }
    26. .container h3 {
    27. font-weight: 900;
    28. }
    29. style>
    30. <style>
    31. .form_wrap {
    32. color: #8B929D !important;
    33. }
    34. .form-text {
    35. color: #8B929D !important;
    36. }
    37. style>
    38. <style>
    39. .alert {
    40. transition: .5s;
    41. opacity: 0;
    42. }
    43. .alert.show {
    44. opacity: 1;
    45. }
    46. style>
    47. head>
    48. <body>
    49. <div class="container">
    50. <h3>欢迎-登录h3>
    51. <div class="alert alert-success" role="alert">
    52. 提示消息
    53. div>
    54. <div class="form_wrap">
    55. <form>
    56. <div class="mb-3">
    57. <label for="username" class="form-label" id="username">账号名label>
    58. <input type="text" class="form-control username">
    59. div>
    60. <div class="mb-3">
    61. <label for="password" class="form-label" id="password">密码label>
    62. <input type="password" class="form-control password">
    63. div>
    64. <button type="button" class="btn btn-primary btn-login"> 登 录 button>
    65. form>
    66. div>
    67. div>
    68. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    69. <script>
    70. // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
    71. // 1.1 登录-点击事件
    72. document.querySelector('.btn-login').addEventListener('click', () => {
    73. // 1.2 获取用户名和密码
    74. const username = document.querySelector('.username').value
    75. const password = document.querySelector('.password').value
    76. // console.log(username, password)
    77. // 1.3 判断长度
    78. if (username.length < 8) {
    79. console.log('用户名必须大于等于8位')
    80. return // 阻止代码继续执行
    81. }
    82. if (password.length < 6) {
    83. console.log('密码必须大于等于6位')
    84. return // 阻止代码继续执行
    85. }
    86. // 1.4 基于axios提交用户名和密码
    87. // console.log('提交数据到服务器')
    88. axios({
    89. url: 'http://hmajax.itheima.net/api/login',
    90. method: 'POST',
    91. data: {
    92. username,
    93. password
    94. }
    95. }).then(result => {
    96. console.log(result)
    97. console.log(result.data.message)
    98. }).catch(error => {
    99. console.log(error)
    100. console.log(error.response.data.message)
    101. alert(error.response.data.message)
    102. })
    103. })
    104. script>
    105. body>
    106. html>

    提示框

    1. /**
    2. * 2.2 封装提示框函数,重复调用,满足提示需求
    3. * 功能:
    4. * 1. 显示提示框
    5. * 2. 不同提示文字msg,和成功绿色失败红色isSuccess(true成功,false失败)
    6. * 3. 过2秒后,让提示框自动消失
    7. */
    8. const myAlert = document.querySelector( '.alert' )
    9. function alertFn(msg, isSuccess) {
    10. // 1> 显示提示框
    11. myAlert.classList.add('show')
    12. // 2> 实现细节
    13. myAlert.innerText = msg
    14. const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
    15. myAlert.classList.add(bgStyle)
    16. // 3> 过2秒隐藏
    17. setTimeout(() => {
    18. myAlert.classList.remove('show')
    19. // 提示:避免类名冲突,重置背景色
    20. myAlert.classList.remove(bgStyle)
    21. }, 2000)
    22. }

    form-serialize 插件

    form-serialize 是一个 JavaScript 库,用于将 HTML 表单的数据序列化为字符串或对象1。

    你可以使用 form-serialize 来简化获取表单数据的过程。它支持两种输出格式:URL 编码(默认)和哈希(JavaScript 对象)

     

    1. <script src="./lib/form-serialize.js">script>
    2. ```
    3. 2. 然后修改代码
    4. ```js
    5. // 3.2 使用serialize函数,收集登录表单里用户名和密码
    6. const form = document.querySelector('.login-form')
    7. const data = serialize(form, { hash: true, empty: true })
    8. console.log(data)
    9. // {username: 'itheima007', password: '7654321'}
    10. const { username, password } = data

    完整代码

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
    6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    7. <title>11.案例_登录title>
    8. <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css">
    9. <style>
    10. html,
    11. body {
    12. background-color: #EDF0F5;
    13. width: 100%;
    14. height: 100%;
    15. display: flex;
    16. justify-content: center;
    17. align-items: center;
    18. }
    19. .container {
    20. width: 520px;
    21. height: 540px;
    22. background-color: #fff;
    23. padding: 60px;
    24. box-sizing: border-box;
    25. }
    26. .container h3 {
    27. font-weight: 900;
    28. }
    29. style>
    30. <style>
    31. .form_wrap {
    32. color: #8B929D !important;
    33. }
    34. .form-text {
    35. color: #8B929D !important;
    36. }
    37. style>
    38. <style>
    39. .alert {
    40. transition: .5s;
    41. opacity: 0;
    42. }
    43. .alert.show {
    44. opacity: 1;
    45. }
    46. style>
    47. head>
    48. <body>
    49. <div class="container">
    50. <h3>欢迎-登录h3>
    51. <div class="alert alert-success" role="alert">
    52. 提示消息
    53. div>
    54. <div class="form_wrap">
    55. <form class="login-form">
    56. <div class="mb-3">
    57. <label for="username" class="form-label" id="username">账号名label>
    58. <input type="text" class="form-control username" name="username">
    59. div>
    60. <div class="mb-3">
    61. <label for="password" class="form-label" id="password">密码label>
    62. <input type="password" class="form-control password" name="password">
    63. div>
    64. <button type="button" class="btn btn-primary btn-login"> 登 录 button>
    65. form>
    66. div>
    67. div>
    68. <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js">script>
    69. <script src="./libs/form-serialize.js">script>
    70. <script>
    71. /**
    72. * 2.2 封装提示框函数,重复调用,满足提示需求
    73. * 功能:
    74. * 1. 显示提示框
    75. * 2. 不同提示文字msg,和成功绿色失败红色isSuccess(true成功,false失败)
    76. * 3. 过2秒后,让提示框自动消失
    77. */
    78. const myAlert = document.querySelector( '.alert' )
    79. function alertFn(msg, isSuccess) {
    80. // 1> 显示提示框
    81. myAlert.classList.add('show')
    82. // 2> 实现细节
    83. myAlert.innerText = msg
    84. const bgStyle = isSuccess ? 'alert-success' : 'alert-danger'
    85. myAlert.classList.add(bgStyle)
    86. // 3> 过2秒隐藏
    87. setTimeout(() => {
    88. myAlert.classList.remove('show')
    89. // 提示:避免类名冲突,重置背景色
    90. myAlert.classList.remove(bgStyle)
    91. }, 2000)
    92. }
    93. // 目标1:点击登录时,用户名和密码长度判断,并提交数据和服务器通信
    94. // 1.1 登录-点击事件
    95. document.querySelector('.btn-login').addEventListener('click', () => {
    96. const form = document.querySelector('.login-form')
    97. const data = serialize(form, { hash: true, empty: true })
    98. const { username, password } = data
    99. // 1.2 获取用户名和密码
    100. // const username = document.querySelector('.username').value
    101. // const password = document.querySelector('.password').value
    102. // console.log(username, password)
    103. // 1.3 判断长度
    104. if (username.length < 8) {
    105. alertFn('用户名必须大于等于8位',false)
    106. console.log('用户名必须大于等于8位')
    107. return // 阻止代码继续执行
    108. }
    109. if (password.length < 6) {
    110. alertFn('密码必须大于等于6位',false)
    111. console.log('密码必须大于等于6位')
    112. return // 阻止代码继续执行
    113. }
    114. // 1.4 基于axios提交用户名和密码
    115. // console.log('提交数据到服务器')
    116. axios({
    117. url: 'http://hmajax.itheima.net/api/login',
    118. method: 'POST',
    119. data: {
    120. username,
    121. password
    122. }
    123. }).then(result => {
    124. alertFn(result.data.message,true)
    125. console.log(result)
    126. console.log(result.data.message)
    127. }).catch(error => {
    128. console.log(error)
    129. console.log(error.response.data.message)
    130. alert(error.response.data.message)
    131. })
    132. })
    133. script>
    134. body>
    135. html>

  • 相关阅读:
    【ASM】字节码操作 Label 如何使用 生成 if 语句
    攻防世界-web-file_include
    SpringSecurity - 密码加密
    Pycharm打开时一直加载中?解决办法来了~
    初识 kubernetes
    DDTT Sulfurizing Reagent,DDTT硫化剂
    为什么要在网站上安装SSL证书?
    【vue】el-carousel实现视频自动播放与自动切换到下一个视频功能:
    西门子 S7 协议解析
    30. UE5 RPG GamplayAbility的配置项
  • 原文地址:https://blog.csdn.net/qq_62377885/article/details/133203367