博客列表 >JS关键知识点:JSON和Ajax

JS关键知识点:JSON和Ajax

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月25日 16:30:58996浏览

随堂知识总结:

一、JSON相关知识:

1、json是借用了JS对象字面量法来表示数据,是一种轻量级,用于数据交换与存储的格式化的字符串(本质上仍是一个字符串);
2、json数据类型:

  • 简单值:100,”hello”,true,null,没有undefined
  • 对象:{……}
  • 数组:[……]
  • 简单值字符串:必须且只能用双引号作为定界符;

3、JS中有关json的两个方法:

  • 序列化:JS对象序列化为JSON格式的字符串JSON.stringify(JS_obj,array|fucntion(key,value){……},'字符缩进数和字符');当第二个参数为数组时:限制序列化成员(序列化白名单);反之为回调函数对JS对象中的元素进一步处理返回JSON中(必须有return value;否则为空,如果不需要某值返回undefined);第三个参数为JSON缩进字符;
    注意:JS对象序列化之后,会将以下三种成员删除:
    (1)方法(函数)
    (2)值为undefined的属性
    (3)继承的原型对象成员

  • 解析:将JSON格式的字符串解析/还原为JS对象JSON.parse(json,function(key,value){……;return value;});当只有一个参数时:直接解析JSON对象返回JS对象;当为两个参数时:第二个参数为回调函数,把JSON对象中的值处理后在返回;

4、JSON与JS对象的区别:

  • (1)没有变量声明:JSON中没有变量的概念
  • (2)没有分号:JSON不是语句;
  • (3)JSON属性名必须加上双引号:任何时候任何地方都必须加双引号,且必须加双引号

tips:为了规范/自定义序列化的返回结果,允许在JS对象中创建一个方法:toJSON;toJSON在调用JSON.stringify()时自动调用,像魔术方法一样;

二、AJax相关知识:

1、同步和异步的概念:
同步:发出请求得到响应放回数据,才可以发送另一个
异步:发出请求,不需要得到响应回复就可以发出另一个请求,(回调函数);
2、XMLHttpRequest基本流程(两种形式GET和POST):
(1)、请求的进本流程(GET)

  1. 创建请求对象:xhr=new XMLHttpRequest();
  2. 监听请求回调:xhr.onreadystatechange=function(){};
  3. 设置请求参数:xhr.open(请求类型,请求url,是否异步)(默认true,异步)
  4. 发送请求:xhr.send(null)

(2)、请求的基本流程(POST)

  1. 创建请求对象:xhr=new XMLHttpRequest();
  2. 监听请求回调:xhr.onreadystatechange=function(){};
  3. 设置请求头:xhr.open(请求类型,请求url,是否异步):默认true,异步
  4. 设置请求头:xhr.setRequestHeader()
  5. 准备请求的数据:var data={……}
  6. 发送请求:xhr.send(data);可以添加键值对形式返回:send(‘user=’+data);

3、监听事件:onreadystatechange(在xhr监听对象中,xhr可以用this代替)

  1. reponseText:返回ajax请求文本
  2. reponseXML:返回的html/xml;
  3. readyState===4:标识Ajax请求状态(4代表成功)
  4. status:返回数据(200代表OK

4、发送数据的两种格式在请求头中设置:

  1. xhr.setRequestHeader('content-type','applicaton/x-www-form-urlencoded')表单数据形式
  2. xhr.setRequestHeader('content-type','applicaton/json;charset=utf-8')json数据形式

在Ajax中POST形式中还有一种默认表单数据发送形式(不需要设置请求头):FormData();

  1. var data=new FormData();
  2. data.append(key,value);
  3. xhr.send(data);

5、附加知识点:
setTimeout(函数、time) 方法用于在指定的毫秒数后调用函数或计算表达式。
onsubmit="return false"禁用表单提交事件;
6、获取Ajax发送的数据:以GET形式发送的数据:$_GET
以POST形式发送的数:$_POST
数据格式如果是JSON格式,则以file_get_contents(‘php://input’)获取,其他都已$_POST获取;
Ajax请求返回的响应一般是responseText文本格式,所以服务端接受Ajax默认返回数据转化成JSON格式返回;

代码练习

1.Ajax请求GET形式

  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. <span>服务器成功调用</span>
  10. </body>
  11. <script>
  12. // 创建请求对象
  13. var xhr = new XMLHttpRequest();
  14. //创建回调监听
  15. xhr.onreadystatechange = function () {
  16. if (xhr.readyState === 4 && xhr.status === 200) {
  17. console.log(xhr.responseText);
  18. var h2 = document.createElement("h2");
  19. h2.innerHTML = xhr.responseText;
  20. document.body.appendChild(h2);
  21. }
  22. };
  23. xhr.open("GET", "test.php", true);
  24. xhr.send(null);
  25. </script>
  26. </html>

运行结果

2.Ajax请求POST形式(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,演练POST</title>
  7. </head>
  8. <body>
  9. <script>
  10. // new一个XMLHttpRequest对象
  11. var xhr = new XMLHttpRequest();
  12. //监听事件操作
  13. xhr.onreadystatechange = function () {
  14. if (xhr.readyState === 4 && xhr.status === 200) {
  15. var data = JSON.parse(xhr.responseText);
  16. // console.log(data);
  17. var name = document.createElement("span");
  18. name.innerText = "用户名:" + data.username;
  19. document.body.append(name);
  20. var pass = document.createElement("span");
  21. pass.innerText = "密 码:" + data.password;
  22. document.body.append(pass);
  23. }
  24. };
  25. //初始化请求参数
  26. xhr.open("POST", "test3.php", true);
  27. //设置请求头
  28. xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
  29. //准备请求数据
  30. var user = {
  31. username: "ldy",
  32. password: "123456",
  33. };
  34. //发送数据
  35. xhr.send(JSON.stringify(user));
  36. </script>
  37. </body>
  38. </html>

代码演示结果:

3.Ajax请求POST形式(FormData对象):

  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,演练POST</title>
  7. <style></style>
  8. </head>
  9. <body>
  10. <h1>用户信息</h1>
  11. <table aglin="center" cellpadding="3" cellspacing="0" border="2" }>
  12. <tr>
  13. <th>账户</th>
  14. <th>密码</th>
  15. </tr>
  16. </table>
  17. <script>
  18. // new一个XMLHttpRequest对象
  19. var xhr = new XMLHttpRequest();
  20. //监听事件操作
  21. xhr.onreadystatechange = function () {
  22. if (xhr.readyState === 4 && xhr.status === 200) {
  23. var user = xhr.responseText;
  24. var userdata = JSON.parse(user);
  25. console.log(userdata.name);
  26. var name = document.createElement("tr");
  27. name.innerHTML =
  28. "<td>" + userdata.name + "</td><td>" + userdata.ps + "</td>";
  29. document.body.getElementsByTagName("table").item(0).append(name);
  30. }
  31. };
  32. //初始化请求参数
  33. xhr.open("POST", "test2.php", true);
  34. //省略设置请求头
  35. // xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
  36. //准备请求数据
  37. var data = new FormData();
  38. data.append("name", "ldy@qq.com");
  39. data.append("ps", "123456");
  40. //发送数据
  41. xhr.send(data);
  42. </script>
  43. </body>
  44. </html>

演示结果

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>用户注册</title>
  7. <style>
  8. * {
  9. margin: 0;
  10. padding: 0;
  11. }
  12. h2 {
  13. /* display: block; */
  14. width: 350px;
  15. margin: 0 auto;
  16. text-align: center;
  17. padding-top: 10px;
  18. box-sizing: border-box;
  19. }
  20. form {
  21. margin: 10px auto;
  22. width: 350px;
  23. height: 250px;
  24. background-color: #5384e8;
  25. display: flex;
  26. flex-flow: column nowrap;
  27. justify-content: space-evenly;
  28. align-content: center;
  29. align-items: center;
  30. font-size: 1.2rem;
  31. }
  32. form:hover {
  33. box-shadow: 0 0 5px #626262;
  34. }
  35. form>.button {
  36. width: 280px;
  37. display: flex;
  38. justify-content: space-evenly;
  39. }
  40. form>.button>input {
  41. width: 100px;
  42. height: 30px;
  43. background-color: #00bb00;
  44. border: none;
  45. border-radius: 15px;
  46. }
  47. form>.button>input:hover {
  48. background-color: red;
  49. color: white;
  50. }
  51. a {
  52. color: white;
  53. text-decoration: none;
  54. }
  55. </style>
  56. </head>
  57. <body>
  58. <h2>用户注册</h2>
  59. <form method="POST" onsubmit="return false">
  60. <div class='account'>
  61. <label for="username">账户:</label>
  62. <input type="email" required name="username" id="username" placeholder="example@163.com">
  63. </div>
  64. <div class='pwd'>
  65. <label for="p2">密码:</label>
  66. <input type="password" required name="p2" id="p2" placeholder="不少于六位">
  67. </div>
  68. <div class="button">
  69. <input type="submit" value="登陆">
  70. <input type="reset" value="重置">
  71. </div>
  72. <div>
  73. <a href="regist.php">没有账号,点击此处注册!</a>
  74. </div>
  75. </form>
  76. </body>
  77. <script>
  78. var form = document.querySelector('form');
  79. var btn = document.querySelector('.button>:first-child');
  80. btn.onclick = function() {
  81. var xhr = new XMLHttpRequest();
  82. xhr.onreadystatechange = function() {
  83. if (xhr.readyState === 4 && xhr.status === 200) {
  84. var res;
  85. res = JSON.parse(xhr.responseText);
  86. var span = document.createElement('span');
  87. span.innerText = res.messages;
  88. form.append(span);
  89. }
  90. }
  91. xhr.open("POST", "log.php", true);
  92. var user = new FormData(form);
  93. xhr.send(user);
  94. }
  95. </script>
  96. </html>

运行结果图:

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议