博客列表 >Ajax常用请求类型和FormData

Ajax常用请求类型和FormData

赵大叔
赵大叔原创
2020年05月22日 16:41:581705浏览

一、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 的基本操作感觉就是:固定的套路,背下来就好。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议
Help2020-05-23 09:09:511楼
朱老师好早啊。不看源码,自己写的话还是有困难的。