Blogger Information
Blog 21
fans 0
comment 0
visits 21523
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
实例演示Ajax-post的三种方式
N.
Original
1070 people have browsed it

1. 同步与异步

以前端请求,后端响应为例

  • 同步: 前端发请求, 必须等到后端响应完成,才允许发送另一个请求
  • 异步: 前端发请求后不等待后端响应结果继续执行,后端响应完成通过事件通知前端处理

异步最常用的处理形式就是回调函数


2. XMLHttpRequest 对象:XMLHttpRequest是浏览器提供的,处理异步请求的宿主对象,而非 JS 内置对象

3. GET 请求
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 发送请求: send()
  • 服务器: 返回 JSON
  • 前端: JSON.parse()解析 JSON 字符串

4. POST 请求
  • 请求流程:
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange()
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 设置请求头: setRequestHeader()
  5. 发送请求: send(data)

post 与 get 相比, 多了一步: 设置请求头

  • 前端: 发送 JSON
  • 后端:
    • json 数据以表单数据类型发送,可$_POST 接收
    • json 数组就是以 JSON 发送, php://input 流文件方式接收

5. FormData
  • 可直接序列化表单数据
  • 可直接被 Ajax 识别,所以可以不设置请求头
  • 除了表单数据外,也可用于普通数据

    GET 请求实例演示:

    代码如下

    1. <html lang="">
    2. <head>
    3. <meta charset="UTF-8" />
    4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    5. <title>Document</title>
    6. <style>
    7. form {
    8. display: inline-grid;
    9. grid-template-columns: 5em 15em;
    10. gap: 1em;
    11. padding: 1em;
    12. border: 1px solid #000;
    13. background-color: lightcyan;
    14. }
    15. form button {
    16. grid-area: auto / 2 / auto / span 1;
    17. }
    18. </style>
    19. </head>
    20. <body>
    21. <form action="" onsubmit="return false;">
    22. <label for="username">用户名:</label>
    23. <input type="text" id="username" name="username" />
    24. <label for="email">邮箱:</label>
    25. <input type="email" id="email" name="email" />
    26. <button>保存</button>
    27. <script>
    28. // 1. 创建请求对象: `new XMLHttpRequest()`
    29. const aaa = new XMLHttpRequest();
    30. // 2. 监听请求回调: `onreadystatechange`
    31. aaa.addEventListener("readystatechange", hanshu, false);
    32. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
    33. aaa.open("GET", "hhhh/text.php", true);
    34. // 4. 发送请求: `send()`
    35. aaa.send(null);
    36. /////
    37. function hanshu() {
    38. if (aaa.readyState === 4) {
    39. console.log(aaa.responseText);
    40. const user = JSON.parse(aaa.responseText);
    41. console.log(user);
    42. // alue=user.后面aa和ccc对应的是php文档里的数据名称
    43. document.querySelector("#username").value=user.aa
    44. document.querySelector("#email").value=user.ccc
    45. }
    46. }
    47. </script>
    48. </body>
    49. </html>

    php代码

    1. echo json_encode(['aa'=>'bbb', 'ccc'=>'ssss']);

页面效果

GTE请求

  1. <html lang="">
  2. <head>
  3. <meta charset="UTF-8" />
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  5. <title>Document</title>
  6. </head>
  7. <body>
  8. <script>
  9. // 1. 创建请求对象: `new XMLHttpRequest()`
  10. const aaa = new XMLHttpRequest();
  11. // 2. 监听请求回调: `onreadystatechange`
  12. aaa.addEventListener("readystatechange", hanshu, false);
  13. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
  14. aaa.open("POST", "hhhh/text2.php", true);
  15. // 4. 设置请求头: `setRequestHeader()`
  16. // 以表单键值对的方式
  17. aaa.setRequestHeader("content-type", "application/x-www-form-urlencoded");
  18. const user = {
  19. email: "admin@php.cn",
  20. password: "123456",
  21. };
  22. // js转json
  23. const bbbb = JSON.stringify(user);
  24. // 5. 发送请求: `send()`
  25. aaa.send(bbbb);
  26. /////
  27. function hanshu() {
  28. if (aaa.readyState === 4) {
  29. console.log(aaa.responseText);
  30. }
  31. }
  32. </script>
  33. </body>
  34. </html>

php代码

  1. <?php
  2. // print_r($_POST);
  3. $date=key($_POST);
  4. echo $date;
  5. // echo "aaaa";

效果图

FormData代码:

  1. <html lang="">
  2. <head>
  3. <meta charset="UTF-8" />
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  5. <title>Document</title>
  6. <style>
  7. form {
  8. display: inline-grid;
  9. grid-template-columns: 5em 15em;
  10. gap: 1em;
  11. padding: 1em;
  12. border: 1px solid #000;
  13. background-color: lightcyan;
  14. }
  15. form button {
  16. grid-area: auto / 2 / auto / span 1;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <form action="" onsubmit="return false;">
  22. <label for="username">用户名:</label>
  23. <input type="text" id="username" name="username" />
  24. <label for="email">邮箱:</label>
  25. <input type="email" id="email" name="email" />
  26. <button>保存</button>
  27. <script>
  28. const form=document.querySelector("form");
  29. const but=document.querySelector("button")
  30. // 1. 创建请求对象: `new XMLHttpRequest()`
  31. const aaa = new XMLHttpRequest();
  32. but.addEventListener("click",zzz,false)
  33. function zzz(aa) {
  34. // 2. 监听请求回调: `onreadystatechange`
  35. aaa.addEventListener("readystatechange", hanshu, false);
  36. // 3. 初始化请求参数: `open(请求类型,请求地址,是否异步)`
  37. aaa.open("POST", "hhhh/text3.php", true);
  38. // 4. 发送请求: `send()`
  39. // new FormData(form): 当前表单数据的封装
  40. aaa.send(new FormData(form));
  41. }
  42. /////
  43. function hanshu(ev) {
  44. if (aaa.readyState === 4) {
  45. console.log(aaa.responseText);
  46. }
  47. }
  48. </script>
  49. </body>
  50. </html>

PHP代码:

  1. print_r($_POST);

效果图

jsonp跨域
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:做为经典的异步请求方式,Ajax即将完成它的历史使命, 建议有空关注一下fetch api
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post