博客列表 >JS执行机制、事件模型、表单事件、事件冒泡、fetch的常用场景

JS执行机制、事件模型、表单事件、事件冒泡、fetch的常用场景

初见
初见原创
2021年09月30日 14:26:51552浏览

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