Blogger Information
Blog 119
fans 3
comment 1
visits 94583
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
Ajax常用请求类型和FormData
赵大叔
Original
1708 people have browsed it

一、Ajax请求流程

  • 1、创建Ajax对象:var xhr = new XMLHttpRequest();
  • 2、监听请求:
  1. xhr.onreadystatechange = function () {
  2. if (xhr.readyState === 4 && xhr.status === 200) {
  3. console.log(xhr.responseText);
  4. }
  • 3、初始化请求参数:xhr.open("GET", "test1.php", true);
  • 4、发送请求:xhr.send(null);

post请求方式:多一步:设置请求头,模拟表单类型的数组进行发送,application/x-www-form-urlencoded默认,还有其它类型

代码演示:

  1. <script>
  2. // 1. 创建Ajax对象
  3. var xhr = new XMLHttpRequest();
  4. // 2. 监听请求
  5. xhr.onreadystatechange = function () {
  6. if (xhr.readyState === 4 && xhr.status === 200) {
  7. console.log(xhr.responseText);
  8. }
  9. };
  10. // 3. 初始化请求参数
  11. xhr.open("GET", "test1.php", true);
  12. // 4. 发送请求
  13. xhr.send(null);
  14. </script>

二、POST请求数据的处理方式

1、模拟表单类型的数组进行发送,application/x-www-form-urlencoded,默认

代码实例演示:

  1. <script>
  2. // 1. 创建Ajax对象
  3. var xhr = new XMLHttpRequest();
  4. // 2. 监听请求
  5. xhr.onreadystatechange = function () {
  6. if (xhr.readyState === 4 && xhr.status === 200) {
  7. console.log(xhr.responseText);
  8. }
  9. };
  10. // 3. 初始化请求参数
  11. xhr.open("POST", "test2.php", true);
  12. // 4. 设置请求头,模拟表单类型的数组进行发送,application/x-www-form-urlencoded默认
  13. xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
  14. var user = {
  15. name: "minh",
  16. email: "minh@texhong.con",
  17. password: "123456",
  18. };
  19. // 5. 将js对象转为json
  20. // 前后端数据传递只能是字符串
  21. var data = JSON.stringify(user);
  22. // 6. 发送请求
  23. xhr.send(data);
  24. </script>

演示效果:

2、直接传递json字符串,application/json;charset=utf-8

代码实例演示:

  1. <script>
  2. // 1. 创建Ajax对象
  3. var xhr = new XMLHttpRequest();
  4. // 2. 监听请求
  5. xhr.onreadystatechange = function () {
  6. if (xhr.readyState === 4 && xhr.status === 200) {
  7. console.log(xhr.responseText);
  8. }
  9. };
  10. // 3. 初始化请求参数
  11. xhr.open("POST", "test3.php", true);
  12. // 4. 设置请求头
  13. xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
  14. var user = {
  15. email: "admin@php.cn",
  16. password: "123456",
  17. };
  18. // 将js对象转为json
  19. var data = JSON.stringify(user);
  20. // 5. 发送请求
  21. xhr.send(data);
  22. </script>

演示效果:

三、FormData较传统的请求头表单数据模拟的优势

  • 快速序列化表单数据
  • FormData包装的数据可以直接被Ajax对象识别,无需设置请求头
  • 除了表单数据,FormData还兼容其它普通数据
  • 服务器上可以使用原生的$_POST来处理

代码实例演示:

  1. <script>
  2. // 1. 创建Ajax对象
  3. var xhr = new XMLHttpRequest();
  4. // 2. 监听请求
  5. xhr.onreadystatechange = function () {
  6. if (xhr.readyState === 4 && xhr.status === 200) {
  7. console.log(xhr.responseText);
  8. }
  9. };
  10. // 3. 初始化请求参数
  11. xhr.open("POST", "test4.php", true);
  12. // FormData
  13. var data = new FormData();
  14. // 封装数据
  15. // data.append("键", "值");
  16. data.append("username", "admin");
  17. data.append("password", "admin888");
  18. // 5. 发送请求
  19. xhr.send(data);
  20. </script>

演示效果:

四、FormData实现用户登录验证

代码实例演示:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Ajax-POST-FormData</title>
  6. </head>
  7. <style>
  8. p { text-align: center;}
  9. form {display: grid;gap: 15px;width: 160px;margin: auto;}
  10. </style>
  11. <body>
  12. <p>用户登录</p>
  13. <!-- onsubmit="return false": 禁用表单的默认提交,改为自定义的Ajax提交 -->
  14. <form action="" method="POST" onsubmit="return false">
  15. <input type="text" name="name" placeholder="name" required autofocus/>
  16. <input type="password" name="password" placeholder="******" required />
  17. <button>提交</button>
  18. </form>
  19. <script>
  20. // 1. 获取表单和按钮
  21. var form = document.querySelector("form");
  22. var btn = document.querySelector("form button");
  23. // 2. 给按钮绑定点击事件,进行Ajax请求
  24. btn.onclick = function () {
  25. // 1. 创建Ajax对象
  26. var xhr = new XMLHttpRequest();
  27. // 2. 监听请求
  28. xhr.onreadystatechange = function () {
  29. if (xhr.readyState === 4 && xhr.status === 200) {
  30. // console.log(xhr.responseText);
  31. // 将jsonl转js对象
  32. var res = JSON.parse(xhr.responseText);
  33. // console.log(res.message);
  34. switch (res.status) {
  35. case 0:
  36. case 1:
  37. error = res.message;
  38. break;
  39. default:
  40. error = "未知错误";
  41. }
  42. // console.log(error);
  43. // 将提示显示到表单中
  44. var span = document.createElement("span");
  45. span.innerHTML = error;
  46. span.style.color = "red";
  47. form.appendChild(span);
  48. }
  49. };
  50. // 3. 初始化请求参数
  51. xhr.open("POST", "test5.php", true);
  52. // FormData
  53. var data = new FormData(form);
  54. data.append("login_time", new Date().getTime());
  55. // 5. 发送请求
  56. xhr.send(data);
  57. };
  58. // 清除提示信息
  59. var inputs = document.querySelectorAll("input");
  60. for (var i = 0; i < inputs.length; i++) {
  61. inputs[i].oninput = function () {
  62. if (btn.nextElementSibling !== null)
  63. form.removeChild(btn.nextElementSibling);
  64. };
  65. }
  66. </script>
  67. </body>
  68. </html>

后端处理代码:

  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname=phpedu', 'root', 'root');
  3. $stmt = $pdo->prepare("SELECT COUNT(`id`) FROM `users` WHERE `name`=? && `password`=?");
  4. $stmt->execute([$_POST['name'], sha1($_POST['password'])]);
  5. $user = $stmt->fetch(PDO::FETCH_NUM);
  6. if ($user[0] == 1) echo json_encode(['status'=>1, 'message'=>'验证通过']);
  7. else echo json_encode(['status'=>0, 'message'=>'用户名或密码错误']);

演示效果:


总结:

1、AJAX 代表前后端异步操作。
2、AJAX 数据传递方式:GET、POST(模拟表单、Json格式、FormDta)。
3、AJAX 的基本操作感觉就是:固定的套路,背下来就好。

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:如果不要源码, 自己能否顺利写出来,这很重要
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
1 comments
Help 2020-05-23 09:09:51
朱老师好早啊。不看源码,自己写的话还是有困难的。
1 floor
Author's latest blog post