Blogger Information
Blog 16
fans 0
comment 0
visits 16151
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS的事件循环、添加、删除与派发、fetch常用场景
Leo的博客
Original
688 people have browsed it

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);

输出:

Correcting teacher:PHPzPHPz

Correction status:qualified

Teacher's comments:
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