Blogger Information
Blog 145
fans 7
comment 7
visits 164674
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS关键知识点:JSON和Ajax
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
Original
997 people have browsed it

随堂知识总结:

一、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>

运行结果图:

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:js是比较有意思的, 不要着急
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