一步一步学前端(四)

防抖

防抖的应用场景是用户点击一个按钮多次会触发多次操作,其实用户目的只是触发一次操作。这样控制每一次点击操作的时间间隔的函数叫防抖。防抖根据不同场景也可以细化为可以立即执行的防抖与延时执行的防抖。

简单的防抖

function debounce(func, delay = 200) {
  let timer;
  return function (...args) {
    let th = this;
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      timer = null;
      func.apply(th, args);
    }, delay);
  }
}

立即执行的防抖函数

function debounce(func, wait = 200, immediate = false) {
  let timer;
  return function (...args) {
    let that = this;
    if (timer) {
      clearTimeout(timer);
    } else if (immediate) {
      func.apply(that, args);
    }
    timer = setTimeout(() => {
      timer = null;
      if (!immediate) {
        func.apply(that, args);
      }
    }, wait);
  }
}

节流

节流函数就是将多次操作合并为一次定时触发

function throttle(func, wait) {
  let now = +new Date();
  let last;
  return function (...args) {
    let th = this;
    if (last && last - now < wait) {
      clearTimeout(timer);
      timer = setTimeout(() => {
        last = +new Date();
        func.apply(this, args);
      }, wait);
    } else {
      timer = null;
      func.apply(this, args);
    }
  }

页面穿透(300毫秒延时)

点击穿透

由于是移动浏览器默认支持双击放大页面的操作,当单击第一次时会有一个300ms的判定是不是双击事件。另外在移动端会有touch事件与click事件的混用也会造成点击穿透(因为触发顺序touchstart-》touchmove-》touchend-》click)
解决方案:

  • 头部标签禁止用双击缩放
<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scaleble = no" />
或
<meta name="viewport" content="width=device-width"/>
  • click事件或touch事件统一
  • 点击手350ms再切换页面
  • 阻止事件继续冒泡
  • 垫个遮罩层
  • 改变css属性
pointer-events
    e.preventDefault();//阻止事件默认行为
    e.stopPropagation();//阻止事件冒泡

滚动穿透

暂时掠过

深拷贝与浅拷贝

对于引用类型(对象或数组)的数据可能会出现修改同一个对象的现象,复制的时候只把地址传递过去,而不是创建新的对象

浅拷贝

通过=赋值或object.assign

let a = {
  a: 'a'
};
console.log(a['a']); => a

let b = a;
b['a'] = 'b';
console.log(a['a']); => b
console.log(b['a']); => b

let a = {
  a: [1,2,3]
};
console.log(a['a']); => [ 1, 2, 3 ]

let b = {};
Object.assign(b,a);
b['a'][0] = 'b';
console.log(a['a']); => [ 'b', 2, 3 ]
console.log(b['a']); => [ 'b', 2, 3 ]

深拷贝

对于对象或者嵌套对象可以创建新的空间进行存储

  • json方法实现
let a = {'a':{
  b:{
    c:'c'
  }
}};

let c = JSON.parse(JSON.stringify(a));
console.log(c == a); => false
c['a']['b']['c'] = 'a';
console.log(a); => { a: { b: { c: 'c' } } }
console.log(c); => { a: { b: { c: 'a' } } }
  • 自己实现深拷贝方法(广度优先与深度优先)
function deepClone(data) {
  let obj;
  if(Array.isArray(data)){
    obj = [];
  } else if(typeof data == "object"){
    obj = {};
  } else {
    return data
  }
  
  if(Array.isArray(data))
  {
    for (let index = 0; index < data.length; index++) {
      obj.push(deepClone(data[index]));      
    }
  } else{
    for (const key in data) {
        obj[key] = deepClone(data[key]);
    }
  }
  return obj;
}
let a = {'a':{
  b:{
    c:'c'
  }
}};
console.log(deepClone(a));
  • messageChanel
function structuralClone(obj) {
  return new Promise(resolve => {
    const {port1, port2} = new MessageChannel();
    port2.onmessage = ev => resolve(ev.data);
    port1.postMessage(obj);
  });
}


var obj = {
  a: 1,
  b: {
    c: obj
  }
}
// 注意该方法是异步的
// 可以处理 undefined 和循环引用对象
async function func() {
  const clone = await structuralClone(obj);
  console.log(clone);
}
func();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,生可以习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
前端需要掌握HTML、CSS和JavaScript这三个技术。 以下是建议的步骤: 1. 习HTML。HTML是构建Web页面的基本语言,你需要习HTML标签的使用,如何构建表单,如何插入图片等。你可以在W3Schools等网站上找到HTML的入门教程。 2. 习CSS。CSS用于控制网页的外观和样式。你需要习CSS的基本语法,如何设置背景颜色、字体、大小等,如何定位元素等。同样,你可以在W3Schools等网站上找到CSS的入门教程。 3. 习JavaScript。JavaScript是一种脚本语言,可以用于动态地修改HTML和CSS。你需要习JavaScript的基本语法,如何声明变量、编写函数、控制流程等。同样,你可以在W3Schools等网站上找到JavaScript的入门教程。 4. 练习项目。习完基础知识后,你需要练习项目来巩固所内容。你可以尝试构建一个简单的静态网站,如个人博客或简历网站,也可以尝试构建一个简单的动态网站,如一个简单的记事本应用程序。 5. 习框架和库。习完基础知识后,你可以开始习一些流行的前端框架和库,如React、Vue、Angular等。这些框架和库可以帮助你更快地构建Web应用程序。你可以在官方文档和在线教程中找到相关的习资源。 总之,前端需要一步一步来,并且需要大量的实践和练习。通过不断习和练习,你可以掌握前端技术,并成为一名合格的前端开发人员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值