Blogger Information
Blog 40
fans 0
comment 0
visits 27860
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JS执行机制、事件模型、表单事件、事件冒泡、fetch的常用场景
初见
Original
553 people have browsed it

JS事件和异步

js运行机制:单线程+事件循环

  1. //1、单线程:主线程 //同一时刻,只能执行一段代码 不像c++java 可以并行
  2. //一个任务接一个任务的执行,代码的书写顺序和执行顺序是一致的
  3. console.log(1);
  4. setTimeout(() => console.log(2), 3000);
  5. setTimeout(() => console.log(4), 0);
  6. //定时任务:setTimeout(函数,等待时间)
  7. console.log(3);
  8. //js引擎将第二个任务离开了主线程,放到了任务队列中
  9. //当主线程执行完毕,由事件循环 将定时任务(异步任务)放回
  10. console.log("---------");
  11. // 定时任务就是异步任务,异步任务不在主线程执行
  12. //执行机制
  13. //1、同步任务:主线程
  14. //2、异步任务:任务队列,事件循环来调度
  15. //哪些是异步任务
  16. //1、定时任务 2、事件 3、io操作 4、网络请求(http)
  17. //实现异步 ?回调函数

单线程异步演示

  1. <form action="" style="display: grid; gap: 1em; width: 20em">
  2. <input type="text" onkeydown="console.log(this.value)" />
  3. <input
  4. type="text"
  5. onkeydown="setTimeout(()=>console.log(this.value),0)"
  6. />
  7. <input type="text" oninput="console.log(this.value)" />
  8. </form>
  9. <!-- 慢半拍 ?dom渲染是同步任务,keydown事件是异步任务 -->
  10. <!-- 解决方案:异步事件等一等,等同步的dom渲染完成再执行 -->

事件增删

  1. <body style="display: grid; gap: 0.5em">
  2. <!-- !1、事件属性 -->
  3. <button onclick="alert('hello')">事件属性</button>
  4. <!-- !!2、元素对象 -->
  5. <button>元素对象</button>
  6. <script>
  7. const btn2 = document.querySelector("button:nth-of-type(2)");
  8. btn2.onclick = () => console.log(111);
  9. btn2.onclick = (_) => console.log(222);
  10. btn2.onclick = ($) => console.log(333);
  11. btn2.onclick = null;
  12. // 覆盖事件
  13. </script>
  14. <!-- 3、事件监听器 -->
  15. <button>事件监听器</button>
  16. <script>
  17. const btn3 = document.querySelector("button:nth-of-type(3)");
  18. //btn3.addEventListener(事件类型,事件回调,是否冒泡false)
  19. btn3.addEventListener("click", () => console.log(111));
  20. btn3.addEventListener("click", () => console.log(222));
  21. btn3.addEventListener("click", () => console.log(333));
  22. let show = () => console.log(444);
  23. btn3.addEventListener("click", show);
  24. //删除
  25. btn3.removeEventListener("click", show);
  26. </script>
  27. <!-- 4、事件派发 -->
  28. <button>事件派发</button>
  29. <script>
  30. const btn4 = document.querySelector("button:nth-of-type(4)");
  31. let i = 0;
  32. btn4.addEventListener("click", () => {
  33. console.log("恭喜又赚了:" + i + "元");
  34. i += 0.5;
  35. });
  36. //创建一个自定义事件
  37. const myclick = new Event("click");
  38. //setTimeout定时任务 setInterval 执行间歇事件
  39. setInterval(() => {
  40. btn4.dispatchEvent(myclick);
  41. }, 3000);
  42. </script>
  43. </body>

事件冒泡和事件委托

  1. <!-- event:事件对象 -->
  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. <li>item6</li>
  10. </ul>
  11. <script>
  12. function show(ev) {
  13. // ev:事件对象
  14. //console.log(ev.type);
  15. //1 事件绑定者(主体)
  16. console.log(ev.currentTarget);
  17. //2 事件触发者
  18. console.log(ev.target);
  19. console.log(ev.currentTarget === ev.target);
  20. }
  21. const lis = document.querySelectorAll("li");
  22. lis.forEach(li => (li.onclick = ev => console.log(ev.currentTarget)));
  23. //冒泡:子元素的同名事件,会沿着dom树向上逐级触发上级元素的同名事件
  24. //document.querySelector("ul").onclick = ev =>
  25. //console.log(ev.currentTarget);
  26. //document.querySelector("body").onclick = ev =>
  27. //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.textContent);
  34. ///console.log(ev.currentTarget === ev.target);
  35. };
  36. </script>

表单事件

  1. <form action="" method="post" id="login" onsubmit="return false">
  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. //login.onsubmit = () => console.log("提交了");
  12. //login.onsubmit = ev => ev.preventDefault(); onsubmit="return false"
  13. login.submit.onclick = ev => {
  14. //禁止冒泡
  15. ev.stopPropagation();
  16. //console.log(ev.currentTarget.form);
  17. //非空验证
  18. isEmpty(ev.currentTarget.form);
  19. };
  20. function isEmpty(form) {
  21. console.log(form.email.value.length);
  22. console.log(form.password.value.trim().length);
  23. if (form.email.value.length === 0) {
  24. alert("邮箱不能为空");
  25. form.email.focus();
  26. return false;
  27. } else if (form.password.value.trim().length === 0) {
  28. alert("密码不能为空");
  29. form.password.focus();
  30. return false;
  31. } else {
  32. alert("验证通过");
  33. }
  34. }
  35. //input blur 失去焦点 change 值发生改变时触发 select 触发
  36. </script>

json

  1. //1、json 就是一个字符串
  2. //2、 json用对象或数组的字面量语法,来表示一组相关数据
  3. let josnStr = `
  4. {
  5. "id":12,
  6. "name":"JS是怎么练成的",
  7. "price":99
  8. }
  9. `;
  10. // 1 属性必须是字符串,必须使用双引号
  11. //2、字符串类型必须使用双引号
  12. // 3、最后一个数据后面不能有逗号
  13. // 1、如何用到js中
  14. //(1)json ->js对象
  15. // (2)js对象->渲染到页面中
  16. let book = JSON.parse(josnStr);
  17. console.log(book);
  18. let html = `
  19. <ul>
  20. <li>书号:${book.id}</li>
  21. <li>书名:${book.name}</li>
  22. <li>价格:${book.price} 元</li>
  23. </ul>
  24. `;
  25. document.body.insertAdjacentHTML("afterbegin", html);
  26. //json用到其他编程语言中,如php,java,python go
  27. //js对象->json 字符串 ->由不同的语言的api处理
  28. let obj = { id: 12, name: "JS是怎么练成的", price: 99 };
  29. let str = JSON.stringify(obj);
  30. console.log(str);

Promise Fetch

  1. // let arr = [1, 2, 3];
  2. //pormise 契约 他是一个对象 表示异步操作的结果
  3. //工作中不直接用promise ,而是用fetch api进行异步请求
  4. //console.log(fetch("demo6.heml"));
  5. //语法 fetch(url).then(相应回调函数).then(处理结果)
  6. //console.log(response.json());
  7. fetch("data.json")
  8. .then(response => response.json())
  9. .then(json => console.log(json));

fetch json 实例

json实例

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>fetch json 实例</title>
  8. </head>
  9. <body>
  10. <!-- async await -->
  11. <button onclick="getPic()">查看图片信息</button>
  12. <div id="box"></div>
  13. <script>
  14. // fetch("https://jsonplaceholder.typicode.com/photos")
  15. // .then(response => response.json())
  16. // .then(json => console.log(json));
  17. async function getPic() {
  18. const pics = await fetch(
  19. "https://jsonplaceholder.typicode.com/photos?albumId=2"
  20. );
  21. const list = await pics.json();
  22. //console.log(list);
  23. //渲染
  24. render(list);
  25. }
  26. // function render(data) {
  27. // const box = document.querySelector("#box");
  28. // const div = document.createElement("div");
  29. // data.forEach(item => {
  30. // //console.log(item);
  31. // const h2 = document.createElement("h2");
  32. // h2.innerHTML = '<a href="' + item.url + '">' + item.title + "</a>";
  33. // const img = document.createElement("div");
  34. // img.innerHTML =
  35. // '<a href="' +
  36. // item.url +
  37. // '"><img src="' +
  38. // item.thumbnailUrl +
  39. // '"></a>';
  40. // div.append(h2);
  41. // div.append(img);
  42. // box.append(div);
  43. // });
  44. // }
  45. //改进
  46. function render(data) {
  47. const box = document.querySelector("#box");
  48. const div = document.createElement("div");
  49. data.forEach(item => {
  50. //console.log(item);
  51. const li = document.createElement("div");
  52. li.innerHTML =
  53. '<div class="lipic"><a href="' +
  54. item.url +
  55. '">' +
  56. item.title +
  57. '</a><a href="' +
  58. item.url +
  59. '"><img src="' +
  60. item.thumbnailUrl +
  61. '"></a></div>';
  62. div.append(li);
  63. box.append(div);
  64. });
  65. }
  66. </script>
  67. <style>
  68. #box div .lipic {
  69. display: grid;
  70. grid-template-columns: 1fr 10rem;
  71. gap: 2em;
  72. }
  73. #box div .lipic a:first-of-type {
  74. color: #333;
  75. line-height: 40px;
  76. text-decoration: none;
  77. }
  78. </style>
  79. </body>
  80. </html>
Correcting teacher:天蓬老师天蓬老师

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