博客列表 >前端 - JS - 将JSON字符串转换为JS对象和Ajax编程

前端 - JS - 将JSON字符串转换为JS对象和Ajax编程

郴
原创
2020年05月27日 17:25:441230浏览

前端 - JS - 将JSON字符串转换为JS对象和Ajax编程

一、将JSON字符串转换为JS对象

1. 简单转换

  1. <!DOCTYPE html>
  2. <html lang="zh_hans">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. var obj = {name: '小明', sex: '男', age: 18, email: 'xiaoming@xm.cn', study: {
  11. school: '北京大学',
  12. class: '软件工程一班'
  13. }};
  14. var json_str = JSON.stringify(obj, function(key, value){
  15. if (key === 'name') {
  16. return '小王';
  17. } else {
  18. return value;
  19. }
  20. }, 4);
  21. var new_obj = JSON.parse(json_str);
  22. console.log(new_obj);
  23. </script>
  24. </body>
  25. </html>

2. 为每个属性执行回调

  1. <!DOCTYPE html>
  2. <html lang="zh_hans">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. var obj = {name: '小明', sex: '男', age: 18, email: 'xiaoming@xm.cn', study: {
  11. school: '北京大学',
  12. class: '软件工程一班'
  13. }};
  14. var json_str = JSON.stringify(obj, function(key, value){
  15. if (key === 'name') {
  16. return '小王';
  17. } else {
  18. return value;
  19. }
  20. }, 4);
  21. var new_obj = JSON.parse(json_str, function(key, value){
  22. switch (key) {
  23. case 'name':
  24. return '小赵';
  25. case 'age':
  26. return 20;
  27. default:
  28. return value;
  29. }
  30. });
  31. console.log(new_obj);
  32. </script>
  33. </body>
  34. </html>

二、Ajax编程

1. GET请求

  • 流程
  1. 1. 创建Ajax对象
  2. 2. 监听请求
  3. 3. 初始化请求参数
  4. 4. 发送请求
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-GET</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 创建Ajax对象
  11. var xhr = new XMLHttpRequest();
  12. // 2. 监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. // 3. 初始化请求参数
  19. xhr.open("GET", "ajget.php", true);
  20. // 4. 发送请求
  21. xhr.send(null);
  22. </script>
  23. </body>
  24. </html>
  1. $user = ["name"=>'jack', "sex"=>'male', "age"=>18];
  2. echo json_encode($user);

2. POST请求

  • 流程
  1. 1. 创建Ajax对象
  2. 2. 监听请求
  3. 3. 初始化请求参数
  4. 4. 设置请求头,模拟表单类型的数组进行发送(包括application/x-www-form-urlencoded和application/json)
  5. 5. 发送请求
  • 请求头数据类型为表单数据
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-GET</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 创建Ajax对象
  11. var xhr = new XMLHttpRequest();
  12. // 2. 监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. // 3. 初始化请求参数
  19. xhr.open("POST", "ajpost1.php", true);
  20. // 4. 设置请求头
  21. xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
  22. //定义一个对象
  23. var user = {
  24. name: '小明',
  25. sex: '男',
  26. age: 18
  27. };
  28. //转为json字符串
  29. var data = JSON.stringify(user);
  30. // 4. 发送请求
  31. xhr.send(data);
  32. </script>
  33. </body>
  34. </html>
  1. <?php
  2. //键为从前端传过来的数据
  3. print_r($_POST);
  4. //获取数据
  5. $data = key($_POST);
  6. //将json字符串转为对象
  7. $user = json_decode($data);
  8. print_r($user);
  9. //将json字符串转为数组
  10. $user = json_decode($data, true);
  11. print_r($user);

  • 请求头数据类型为JSON数据(服务端需要使用原始文件流接受json数据)
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-GET</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 创建Ajax对象
  11. var xhr = new XMLHttpRequest();
  12. // 2. 监听请求
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. // 3. 初始化请求参数
  19. xhr.open("POST", "ajpost2.php", true);
  20. // 4. 设置请求头
  21. xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
  22. //定义一个对象
  23. var user = {
  24. name: '小明',
  25. sex: '男',
  26. age: 18
  27. };
  28. //转为json字符串
  29. var data = JSON.stringify(user);
  30. // 4. 发送请求
  31. xhr.send(data);
  32. </script>
  33. </body>
  34. </html>
  1. <?php
  2. //获取数据
  3. $data = file_get_contents('php://input');
  4. echo $data;
  5. //将json字符串转为对象
  6. $user = json_decode($data);
  7. print_r($user);

3. POST-FormData

  • 流程
  1. 1. 创建Ajax对象
  2. 2. 监听请求
  3. 3. 初始化请求参数
  4. 4. 发送请求
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Document</title>
  7. </head>
  8. <body>
  9. <script>
  10. // 1. 创建Ajax对象
  11. var xhr = new XMLHttpRequest();
  12. // 2. 监听请求
  13. xhr.onreadystatechange = function() {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. console.log(xhr.responseText);
  16. }
  17. };
  18. // 3. 初始化请求参数
  19. xhr.open("POST", "work.php", true);
  20. //创建formdata对象
  21. var data = new FormData();
  22. data.append("username", "admin");
  23. data.append("password", "qwer1234");
  24. // 4. 发送请求
  25. xhr.send(data);
  26. </script>
  27. </body>
  28. </html>
  1. print_r($_POST);

4. POST-FormData(无刷新登录验证)

  1. <?php
  2. //判断是否登录
  3. if (isset($_COOKIE['user'])) {
  4. //如果已登录则输出请勿重复登录的信息并返回首页
  5. exit('<script>alert("请勿重复登录");location.href="/index.php"</script>');
  6. }
  7. ?>
  8. <!DOCTYPE html>
  9. <html lang="zh_hans">
  10. <head>
  11. <meta charset="UTF-8">
  12. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  13. <title>登录页</title>
  14. <link rel="stylesheet" href="\css\login.css">
  15. </head>
  16. <body>
  17. <h2>登录表单</h2>
  18. <div class="f-box">
  19. <!--取消表单的默认提交,改为自定义的Ajax提交-->
  20. <form action="" method="POST" onsubmit="return false">
  21. <fieldset>
  22. <div class="e-box">
  23. <label for="email">邮箱:</label>
  24. <input type="email" name="email" id="email" require autofocus autocomplete="on">
  25. </div>
  26. <div class="p-box">
  27. <label for="password">密码:</label>
  28. <input type="password" name="password" id="password" require>
  29. </div>
  30. <div class="s-box">
  31. <button type="submit">提交</button>
  32. </div>
  33. <div class="o-box">
  34. <!--链接到注册页-->
  35. <a href="register.php">还没有账户?注册一个吧!</a>
  36. </div>
  37. </fieldset>
  38. </form>
  39. </div>
  40. <!--ajax提交表单数据-->
  41. <script>
  42. //获取表单和按钮
  43. var form = document.querySelector("form");
  44. var bth = document.querySelector("button");
  45. //给按钮绑定点击事件,进行Ajax请求
  46. bth.onclick = function() {
  47. // 1. 创建Ajax对象
  48. var xhr = new XMLHttpRequest();
  49. // 2. 监听请求并将返回的提示信息展示在页面上
  50. xhr.onreadystatechange = function() {
  51. if (xhr.readyState === 4 && xhr.status === 200) {
  52. //将返回的json字符串转为js对象
  53. var res = JSON.parse(xhr.responseText);
  54. //根据状态代码输出相应的提示信息
  55. switch (res.status) {
  56. case 0:
  57. case 1:
  58. error = res.message;
  59. break;
  60. default:
  61. error = '未知错误';
  62. }
  63. //将提示信息展示在表单中
  64. var span = document.createElement("span");
  65. span.innerHTML = error;
  66. span.style.color = "red";
  67. form.appendChild(span);
  68. }
  69. };
  70. // 3. 初始化请求参数
  71. xhr.open("POST", "../handle.php", true);
  72. // 4. 打包数据
  73. var data = new FormData(form);
  74. // 5. 发送请求
  75. xhr.send(data);
  76. };
  77. //清除提示信息
  78. var inputs = document.querySelectorAll("input");
  79. for (var i = 0; i < inputs.length; i++) {
  80. inputs[i].oninput = function() {
  81. if (document.getElementsByTagName("fieldset")[0].nextElementSibling !== null) {
  82. form.removeChild(document.getElementsByTagName("fieldset")[0].nextElementSibling);
  83. }
  84. };
  85. }
  86. </script>
  87. </body>
  88. </html>
  1. <?php
  2. //1. 获取表中用户名、邮箱和密码字段数据
  3. $pdo = new PDO('mysql:host=localhost;dbname=shopping', 'root', 'root');
  4. $stmt = $pdo->prepare('SELECT `user_name`, `email`, `passwd` FROM `userinfo`');
  5. $stmt->execute();
  6. $t_data = $stmt->fetchAll(PDO::FETCH_ASSOC);
  7. //2. 处理用户登录
  8. //判断请求是否合法
  9. if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  10. //获取从前端传过来的数据
  11. $f_email = $_POST['email'];
  12. $f_passwd = md5($_POST['password']);
  13. //与后台数据进行校验并获取
  14. $results = array_filter($t_data, function($user) use ($f_email, $f_passwd) {
  15. return $user['email'] === $f_email && $user['passwd'] === $f_passwd;
  16. });
  17. //如果有记录证明校验成功并在客户端设置用户cookie
  18. if (count($results) === 1) {
  19. $user_v = (current($results))['user_name'];
  20. setcookie('user', $user_v);
  21. //返回验证通过的提示信息
  22. echo json_encode(['status'=>1, 'message'=>'验证通过']);
  23. } else {
  24. //返回验证失败的提示信息
  25. echo json_encode(['status'=>0, 'message'=>'邮箱或密码错误,或者还未注册账户']);
  26. }
  27. } else {
  28. die('请求类型错误');
  29. }



四、课程总结

  • 今天学习了 JavaScript 的Ajax编程,通过上课认真听讲和认真完成老师布置的作业,使得我对 Ajax 的理解和运用更加深入和熟悉。最主要的知识点是明白和掌握了Ajax请求的特点以及它的基本语法。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议