博客列表 >JS的事件循环、添加、删除与派发、fetch常用场景

JS的事件循环、添加、删除与派发、fetch常用场景

Leo的博客
Leo的博客原创
2021年10月18日 17:08:25689浏览

JS单线程与事件循环

同一时刻,只有执行一个代码,不像C++,java,可以并行
一个任务接一个任务的执行,代码的书写顺序与执行顺序是一致的

  1. 1.单线程:主线程
  2. console.log(1);
  3. setTimeout(() => console.log(2), 5000);
  4. setTimeout(() => console.log(4), 0);
  5. // 定时任务: setTimeout(函数,等待时间)
  6. console.log(3);
  7. // js引擎将第二个任务离开了"主线程",放到了"任务队列"的地方
  8. // 当主线程上已没有任务的时候,由"事件循环"将这个任务重新放回到主线程中执行
  9. // 执行机制
  10. // 1.同步任务:主线程
  11. // 2.异步任务:任务队列,事件循环来调度
  12. // 以下是异步任务
  13. // 1.定时任务, 2.事件, 3.IO操作(input、output) 4.http 请求

单线程异步演示

  1. <body>
  2. <form action="" style="display: grid; gap: 1em; width: 20em">
  3. <!-- 添加个事件,onkeydown事件属性 -->
  4. <input type="text" onkeydown="console.log(this.value);" />
  5. <!-- 输出会慢半拍,因为dom操作是同步任务,keydown是异步任务,所以总是获取上一个数据 -->
  6. <!-- 解决方案:就是让异步事件等等,等同步的dom渲染完了再执行 -->
  7. <!-- 在异步任务里在嵌套一个异步任务就行了 -->
  8. <input
  9. type="text"
  10. onkeydown=" setTimeout (()=>console.log(this.value),0);"
  11. />
  12. <!-- onkeydown改为onipunt可实现和上面一样的效果 -->
  13. <input type="text" oninput="console.log(this.value);" />
  14. </form>
  15. </body>

输出:

事件添加与删除

1.事件属性

  1. <body style="display: grid; gap: 0.5em">
  2. <button onclick="alert('hello')">事件属性</button>

2.元素对象

  1. <button>元素对象</button>
  2. <script>
  3. const btn2 = document.querySelector("button:nth-of-type(2)");
  4. btn2.onclick = () => console.log(111);
  5. btn2.onclick = () => console.log(222);
  6. btn2.onclick = () => console.log(333);
  7. // onclick以最后一个数据为准
  8. // 不让它显示
  9. // btn2.onclick = null;
  10. </script>

3.事件监听器

  1. <button>事件监听器</button>
  2. <script>
  3. const btn3 = document.querySelector("button:nth-of-type(3)");
  4. // btn3.addEventListener(事件类型,事件回调,是否冒泡false/teue)
  5. // 添加事件类型
  6. btn3.addEventListener("click", () => console.log(111));
  7. btn3.addEventListener("click", () => console.log(222));
  8. btn3.addEventListener("click", () => console.log(333));
  9. let show = () => console.log(444);
  10. btn3.addEventListener("click", show);
  11. // 移除掉上方的(444)
  12. btn3.removeEventListener("click", show);
  13. let show = () => console.log(444);
  14. bth3.addEventListener("click", show);
  15. // 删除
  16. btn3.removeEventListener("click", show);
  17. </script>

4.事件派发

  1. <button>事件派发</button>
  2. <script>
  3. const btn4 = document.querySelector("button:nth-of-type(4)");
  4. let i = 10;
  5. btn4.addEventListener("click", () => {
  6. console.log("恭喜,你又赚了: " + i + "元");
  7. i += 100;
  8. i += 150;
  9. });
  10. // const btn4 = document.querySelector("button:nth-of-type(4)");
  11. // let i = 0;
  12. // btn4.addEventListener("click", () => {
  13. // console.log("恭喜你, 又赚了: " + i + " 元");
  14. // i += 0.5;
  15. // });
  16. // 创建一个自定义事件
  17. const myclick = new Event("click");
  18. // btn4.dispatchEvent(myclick);
  19. // setTimeout:定时器,用于执行一次性的定时任务
  20. // setInterval:定时器,用于执行间歇性的定时任务也
  21. setInterval(() => btn4.dispatchEvent(myclick), 3000);
  22. </script>
  23. </body>

事件冒泡和事件委托

event: 事件对象

  1. <body>
  2. <button onclick="show(event)">click</button>
  3. <ul>
  4. <li>item1</li>
  5. <li>item2</li>
  6. <li>item3</li>
  7. <li>item4</li>
  8. <li>item5</li>
  9. </ul>
  10. <script>
  11. function show(ev) {
  12. // ev: 事件对象
  13. // console.log(ev.type);
  14. // ev中有二个特别重要的属性
  15. // 1. 事件绑定者(主体)
  16. console.log(ev.currentTarget);
  17. // 2.事件触发者(目标)
  18. console.log(ev.target);
  19. console.log(ev.target === ev.currentTarget);
  20. }
  21. // const lis = document.querySelectorAll("li");
  22. // 循环给每一个li添加点击事件
  23. // lis.forEach(li => (li.onclick = ev => console.log(ev.currentTarget)));
  24. // onclick这种通过事件属性的添加的事件,是冒泡事件
  25. // 冒泡: 子元素的同名事件,会沿着dom树向上逐级触发上级元素的同名事件
  26. // document.querySelector("ul").onclick = ev => console.log(ev.currentTarget);
  27. // document.querySelector("body").onclick = ev => console.log(ev.currentTarget);
  28. // document.documentElement.onclick = ev => console.log(ev.currentTarget);
  29. document.querySelector("ul").onclick = (ev) => {
  30. // 1.事件绑定者
  31. // console.log(ev.currentTarget);
  32. // 2. 事件触发者
  33. // console.log(ev.target);
  34. console.log(ev.target.textContent);
  35. // console.log(ev.target === ev.currentTarget);
  36. };
  37. </script>
  38. </body>

document.querySelector(“button”).onclick = null;

json

1.json:就是一个字符串
2.json:用对象或数组的字面量语法,来表示一组相关的数据

  1. <body>
  2. <script>
  3. // json字符串
  4. let jsonStr = `
  5. {
  6. "id":111,
  7. "name":"JS就该这样学",
  8. "price":99
  9. }
  10. `;
  1. 属性必须是字符串,且必须使用”双引号”
  2. 字符串类型的值必须使用”双引号”
  3. 最后一个数据后面不要有逗号
  1. // 1. json 如何用到 js中
  2. // (1)json -> js对象
  3. let book = JSON.parse(jsonStr);
  4. console.log(book);
  5. // (2) js对象渲染到页面中
  6. let html = `
  7. <ul>
  8. <li>书号:${book.id}</li>
  9. <li>名称${book.name}</li>
  10. <li>价格:${book.price}元</li>
  11. <ul>
  12. `;
  13. // 渲染到页面中
  14. document.body.insertAdjacentHTML("afterbegin", html);
  15. // 第二种方式json用在别的语言中,php,java,python,go ...
  16. // js对象 ==> json 字符串 --> 由不同的语言的api处理
  17. let obj = { id: 111, name: "JS就该这样学", price: 99 };
  18. // js ->json
  19. let str = JSON.stringify(obj);
  20. console.log(str);
  21. </script>
  22. </body>

fetch的常用场景

fetch用来替代原来的 XMLHttpRequest 对象
拿 data1.json 文件模拟批量数据
data1.json代码

  1. [
  2. { "id": 1, "name": "wjs", "course": "骑车/跑步/游泳" },
  3. { "id": 2, "name": "gzm", "course": "骑车/跑步/游泳" },
  4. { "id": 3, "name": "zyj", "course": "骑车/跑步/游泳" },
  5. { "id": 4, "name": "lzy", "course": "骑车/跑步/游泳" },
  6. { "id": 5, "name": "lkj", "course": "学习/踢球" }
  7. ]
  1. fetch("data1.json")
  2. .then((response) => response.json())
  3. .then((json) => console.log(json));
  4. console.log(3);

输出:

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