欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

js执行机制与异步任务

程序员文章站 2022-03-13 12:51:54
...
1、执行机制:代码从上往下执行
  1. 1. 同步任务:主线程
  2. 2. 异步任务:任务队列,使用事件循环来调度。有定时任务,事件,IO操作(inputoutput),http请求
  3. 定时任务:setTimeout(函数,等待时间);
  4. 3.在代码执行过程中dom渲染为同步任务,事件为异步任务,如输入框输入内容总是获取上一个输入的内容,
  5. 解决方案:
  6. 给事件套多一个定时任务,等同步的dom渲染完再执行。
  7. 使用 oninput 事件同步输入内容
2、事件添加与删除
  1. // 1、事件属性
  2. <button onclick="alert('hell')">事件属性</button>
  3. // 2.元素对象
  4. <button>元素对象</button>
  5. <script>
  6. const btn2 = document.querySelector("button:nth-of-type(2)");
  7. btn2.onclick = () => console.log(111);
  8. btn2.onclick = null; // 移除事件
  9. </script>
  10. // 3.事件监听器
  11. <button>事件监听器</button>
  12. <script>
  13. const btn3 = document.querySelector("button:nth-of-type(3)");
  14. // btn3.addEventListener(事件类型, 事件回调,是否冒泡false/true)
  15. btn3.addEventListener("click", () => console.log(111));
  16. let show = () => console.log(111);
  17. btn3.addEventListener("click", show);
  18. //移除
  19. btn3.removeEventListener("click", show);
  20. </script>
  21. // 4.事件派发
  22. <button>事件派发</button>
  23. <script>
  24. const btn4 = document.querySelector("button:nth-of-type(4)");
  25. let i = 0;
  26. btn4.addEventListener("click", () =>{
  27. console.log("恭喜你,又赚了:" + i + "元");
  28. i += 0.5;
  29. });
  30. // 创建一个自定义事件
  31. // setTimeout: 定时器,用于执行一次性的定时任务
  32. // setInterval: 定时器,用于执行间歇性的定时任务
  33. const myclick = new Event("click");
  34. setInterval(() => btn4.dispatchEvent(myclick),3000);
  35. </script>
  36. // 事件冒泡
  37. <script>
  38. function show(ev){
  39. // ev: 事件对象
  40. // console.log(ev.type);
  41. // ev中有二个重要属性
  42. // 1. 事件绑定者(主体)
  43. console.log(ev.currentTarget);
  44. // 2.事件触发者(目标)
  45. console.log(ev.target);
  46. console.log(ev.target === ev.currentTarget);
  47. }
  48. const lis = document.querySelectorAll("li");
  49. // 循环给每一个li添加点击事件
  50. lis.forEach(li => (li.onclick = ev => console.log(ev.currentTarget)));
  51. // onclick这种通过事件属性的添加的事件,是冒泡事件
  52. // 冒泡:子元素的同名事件,会沿着dom树向上逐级触发上级元素的同名事件
  53. // document.querySelector("ul").onclick = ev => console.log(ev.currentTarget);
  54. // document.querySelector("body").onclick = ev => console.log(ev.currentTarget);
  55. // document.documentElement.onclick = ev => console.log(ev.currentTarget);
  56. document.querySelector("ul").onclick = ev =>{
  57. // 1.事件绑定者
  58. // console.log(ev.currentTarget);
  59. // 2.事件触发者
  60. // console.log(ev.target);
  61. console.log(ev.target.textContent);
  62. }
  63. </script>
3、表单事件:非空验证
  1. <form action="" method="POST" id="login" onsubmit="return false"> <!--onsubmit:禁用表单事件-->>
  2. <label class="title">用户登录</label>
  3. <label for="email">邮箱:</label>
  4. <input type="email" id="email" name="email" value="" autofocus>
  5. <label for="password">密码:</label>
  6. <input type="password" id="password" name="password">
  7. <button name="submit">登录</button>
  8. </form>
  9. <script>
  10. const login = document.forms.login;
  11. // submit: 提交事件
  12. // login.onsubmit = () => console.log("提交了");
  13. // login.onsubmit = ev.preventDefault();
  14. login.submit.onclick = ev =>{
  15. // 禁止冒泡
  16. ev.stopPropagation();
  17. // 每个表单元素都有一个form属性,与所属的表单绑定
  18. // console.log(ev.currentTarget.form);
  19. // 非空验证
  20. isEmpty(ev.currentTarget.form);
  21. };
  22. function isEmpty(form){
  23. console.log(form.email.value.length);
  24. console.log(form.password.value.trim().length);
  25. if(form.form.email.value.length === 0){
  26. alert("邮箱不能为空");
  27. form.email.focus();
  28. return false;
  29. }else if(form.password.value.trim().length === 0){
  30. alert("密码不能为空");
  31. form.email.focus();
  32. return false;
  33. }else{
  34. alert("验证通过");
  35. }
  36. }
  37. </script>
4、json数据转换
  1. json :用来序列化其它语言创建的数据类型
  2. json仅支持6种数据类型:对象、数组、数值、字符串、布尔值、null
  3. JSON.stringify() : 将js对象序列化为json字符串
  4. JSON.parse() : 将json字符串解析为js对象
  1. <script>
  2. // json字符串
  3. let jsonstr = `{
  4. "id" : 111,
  5. "name" : "js",
  6. "price" : 99
  7. }`;
  8. // 将json数据转换为js对象
  9. let book = JSON.parse(jsonstr);
  10. console.log(book);
  11. let html = `
  12. <ul>
  13. <li>书名:${book.id}</li>
  14. <li>名称:${book.name}</li>
  15. <li>价格:${book.price}</li>
  16. </ul>
  17. `;
  18. // 渲染到HTML页面
  19. document.body.insertAdjacentHTML("afterbegin",html);
  20. </script>
5、promise/fetch异步请求
  1. promise : 期约,是一个对象,用来表示“异步”操作的结果
  2. 浏览器默认是禁止通过脚本发起一个跨域请求
  3. 用fetch api进行异步请求
  1. <script>
  2. // 使用链式操作
  3. // fetch(url).then(响应回调).then(结果处理)
  4. // console.log(fetch("https://php.cn/"));
  5. // response :成功响应回调的响应值
  6. fetch("data.json")
  7. .then(response => response.json())
  8. .then(data => console.log(data));
  9. //json测试数据网站
  10. fetch("https://jsonplaceholder.typicode.com/todos")
  11. .then(response => response.json())
  12. .then(data => console.log(data));
  13. // async 异步函数,返回 Promise
  14. // await : 等待,用来执行耗时操作,完成异步任务
  15. async function f1(){
  16. return await console.log("aaa");
  17. }
  18. </script>
6、fetch异步请求应用
  1. <button onclick="getList()">查看留言列表</button>
  2. <div id="box">
  3. <!-- 这里用来显示全部数据 -->
  4. </div>
  5. <script>
  6. // 创建异步函数
  7. async function getList(){
  8. // 请求数据
  9. // 使用 await 请求数据,避免数据过多影响主线程,造成阻塞,使页面加载数据卡顿
  10. const response = await fetch("https://jsonplaceholder.typicode.com/comments");
  11. // 将数据转化为json格式
  12. const comments = await response.json();
  13. console.log(comments);
  14. // 返回,将数据渲染到页面中
  15. render(comments);
  16. }
  17. function render(data){
  18. const box = document.querySelector('#box');
  19. const li = document.createElement('lo');
  20. data.forEach(item =>{
  21. console.log(item);
  22. const li = document.createElement("li");
  23. li.textContent = item.body.slice(0,120) + "...";
  24. // textContent : 只支持存文本
  25. // innerHTML : 支持html标签,并解析
  26. li.innerHTML = `<span style="color:green">${item.body.slice(0,120)}...</span><hr>`;
  27. ol.append(li);
  28. });
  29. box.append(ol);
  30. }
  31. </script>