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>

更多相关文章

  1. 一起学习laravel中的事件以及观察者吧!
  2. .NET Core 中的并发编程
  3. Executors创建线程池有哪几种方式?
  4. 【前端】移动端吸顶后页面滚动,导航也随之变化定位的组件 大家有
  5. 【前端】微信浏览器触摸事件流程
  6. js 事件与 fetch api 简单总结
  7. JavaScript 事件
  8. 【前端】添加draggable 属性,无论怎么设置都无法触发dragstart后
  9. 【前端】Canvas 内部元素如何实现 mouseover/mousemove 事件?

随机推荐

  1. Android Developers:日历提供者
  2. Android下载网络图片到本地
  3. android如何改变默认横竖屏方向
  4. Android判断当前系统语言
  5. android SDK 更新出现错误的解决办法
  6. WebView 简单使用一
  7. layout_weight 权重
  8. Android各版本对应的SDK版本
  9. 使用Android studio导入源码工程
  10. 高通平台Android N SystemUI添加qcnvitem