JavaScript实现手写原生任务定时器

下面是详细讲解“JavaScript实现手写原生任务定时器”的完整攻略:

1. 什么是任务定时器

任务定时器指的是可以在指定时间间隔内重复执行某个函数或者只执行一次某个函数的机制。JavaScript原生的任务定时器包括setIntervalsetTimeout两个函数,它们都可以通过回调函数托管一个任务到任务队列中,等待JavaScript引擎空闲后执行任务。

2. 如何手写实现任务定时器

手写实现任务定时器主要依赖于setTimeout函数,我们可以通过不断地调用setTimeout来模拟任务定时器的实现。

下面以一段代码来说明手写原生任务定时器的实现过程:

function interval(fn, time) {
  let timer = null;

  const loop = () => {
    fn();
    timer = setTimeout(loop, time);
  }

  timer = setTimeout(loop, time);

  return {
    cancel: () => {
      clearTimeout(timer);
    }
  }
}

const repeat = interval(() => {
  console.log('Hello World!');
}, 1000);

// 5秒后取消任务定时器
setTimeout(() => {
  repeat.cancel();
}, 5000);

上面的代码中,我们定义了一个名为interval的函数,它接受两个参数:第一个参数是需要重复执行的函数,第二个参数表示时间间隔。在函数体内部,我们定义了一个timer变量来保存每次调用setTimeout函数返回的计时器ID。 在loop函数内部,我们首先调用传入的函数,然后再通过setTimeout调用自身,从而实现重复执行的效果。 在调用interval函数时,我们获得了一个包含cancel函数的对象,我们可以通过调用该函数来取消任务定时器。

3. 示例说明

3.1 实现圆形进度条

我们可以使用任务定时器来实现一个圆形进度条,让它能够模拟一个旋转的动画。

<div class="progress-bar">
  <div class="progress"></div>
</div>
.progress-bar {
  width: 100px;
  height: 100px;
  position: relative;
}

.progress {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  border: 5px solid #ccc;
  position: absolute;
  top: 0;
  left: 0;

  /* 添加动画效果 */
  animation: rotate-progress 1s linear infinite;
}

@keyframes rotate-progress {
  from {
    transform: rotate(0deg);
  }

  to {
    transform: rotate(360deg);
  }
}
function rotate() {
  const progress = document.querySelector('.progress');

  // 获取当前的旋转角度
  let deg = parseInt(progress.style.transform.replace(/[^0-9]/g, '')) || 0;

  // 计算下一个旋转角度
  deg = (deg + 5) % 360;

  // 更新旋转角度
  progress.style.transform = `rotate(${deg}deg)`;

  setTimeout(rotate, 50);
}

rotate();

上述代码中,我们首先定义了一个rotate函数,用于更新进度条的旋转角度。在函数体内,我们首先通过querySelector获取到进度条节点,然后获取当前的旋转角度,并计算下一个旋转角度,最后更新进度条节点的transform样式。

在最后一行,我们调用setTimeout函数,让rotate函数每50毫秒执行一次,从而实现圆形进度条转动的效果。

3.2 实现轮播图自动播放

我们可以使用任务定时器来实现一个轮播图自动播放的功能。

<div class="slider">
  <div class="slider-item active"><img src="./1.jpg" alt=""></div>
  <div class="slider-item"><img src="./2.jpg" alt=""></div>
  <div class="slider-item"><img src="./3.jpg" alt=""></div>
  <div class="slider-item"><img src="./4.jpg" alt=""></div>
</div>
.slider {
  width: 320px;
  height: 240px;
  overflow: hidden;
  position: relative;
}

.slider-item {
  width: 320px;
  height: 240px;
  position: absolute;
  left: 0;
  top: 0;
  opacity: 0;
  transition: opacity 0.5s ease;

  &.active {
    z-index: 1;
    opacity: 1;
  }

  & + .slider-item {
    left: 100%;
  }
}
let index = 0;
let timer = null;

function start() {
  timer = setInterval(() => {
    const prevIndex = index;

    index++;
    if (index >= 4) {
      index = 0;
    }

    const currItem = document.querySelector(`.slider-item:nth-child(${index + 1})`);
    const prevItem = document.querySelector(`.slider-item:nth-child(${prevIndex + 1})`);

    currItem.classList.add('active');
    prevItem.classList.remove('active');
  }, 2000);
}

function stop() {
  clearInterval(timer);
  timer = null;
}

start();

const slider = document.querySelector('.slider');
slider.addEventListener('mouseover', stop);
slider.addEventListener('mouseout', start);

上述代码中,我们定义了一个index变量来标记当前展示的轮播图的索引,以及一个timer变量来保存任务计时器的ID。

在页面初始化后,我们调用start函数,通过setInterval实现图片轮播的自动播放功能。在start函数内部,我们首先获取到上一个和下一个即将要展示的轮播图,然后通过给它们添加和删除.active类来切换图片。

在最后,我们通过mouseovermouseout事件来停止和启动轮播图自动播放的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaScript实现手写原生任务定时器 - Python技术站

(0)
上一篇 2023年6月11日
下一篇 2023年6月11日

相关文章

  • JS中检测数据类型的几种方式及优缺点小结

    让我来详细讲解一下 “JS中检测数据类型的几种方式及优缺点小结” 的完整攻略。 什么是数据类型 在JavaScript中,数据类型即表示数据的类型或值的类型。JavaScript中的数据类型包括以下几种: 基本类型(也称为原始类型):undefined、null、布尔值(Boolean)、数值(Number)和字符串(String)。 引用类型:对象(Obj…

    JavaScript 2023年6月10日
    00
  • JavaScript 异常处理 详解

    JavaScript 异常处理详解 前言 JavaScript 异常处理是 JavaScript 编程中非常重要的一个方面,它能让我们在程序运行过程中更好地掌控代码的运行情况,减少程序出错的可能性,提高代码的可维护性和安全性。 什么是异常 在程序运行过程中,如果出现了错误,比如说访问了一个不存在的变量、将字符串和数字相加等非法操作,JavaScript 引擎…

    JavaScript 2023年5月27日
    00
  • javascript中类型判断的最佳方式

    Javascript中类型判断的最佳方式一般包括三种方法:typeof、instanceof和Object.prototype.toString()。下面将详细介绍这三种方法的使用场景和注意事项。 1. typeof操作符 typeof 操作符可以返回一个字符串,表示未经计算的操作数的类型。一般用于基本类型的判断,如字符串、数字、布尔、undefined等。…

    JavaScript 2023年6月10日
    00
  • 浅析JavaScript回调函数应用

    浅析JavaScript回调函数应用 什么是回调函数 回调函数是指在一个函数A中调用另一个函数B时,将B作为参数传递给A,并且在A内部执行B的过程就叫做回调函数。 为什么需要回调函数 JavaScript中的函数都是一等公民,可以被当作参数来使用。回调函数在异步编程中非常常见,因为回调函数可以在异步操作完成后被执行,而不会阻塞整个程序的运行。 如何使用回调函…

    JavaScript 2023年5月27日
    00
  • Javascript数组Array基础介绍

    Javascript数组Array基础介绍攻略 什么是Javascript数组? Javascript数组是一种可变长的数据结构,它可以存储任意数量的元素,这些元素可以是任何类型:数字、字符串、布尔值等,甚至是其他数组、对象或函数。Javascript数组是一种非常常用的数据结构,它在各种Javascript应用程序中都扮演着重要的角色。 创建Javascr…

    JavaScript 2023年5月27日
    00
  • Js参数值中含有单引号或双引号问题的解决方法

    Js参数值中含有单引号或双引号问题的解决方法可以通过转义字符进行转义。以下是详细的攻略: 方法一:使用转义字符 在引号前加上反斜杠(\)作为转义字符即可解决问题。如果参数值中含有单引号,则用反斜杠转义单引号(\’),如果参数值中含有双引号,则用反斜杠转义双引号(\”)。 例如: let name1 = "Tom’s cat"; // 包含…

    JavaScript 2023年6月11日
    00
  • JavaScript中的函数式编程详解

    JavaScript中的函数式编程详解 函数式编程是一种编程范式,它将控制状态和变化的副作用最小化,并强调使用函数来解决问题。在JavaScript中,函数作为第一类对象已广泛使用,这使得函数式编程成为编写可维护和可扩展代码的理想选择。 特点 函数式编程有以下几个特点: 函数是一等公民,可以作为变量传递和返回值 纯函数,不改变外部状态,也不受全局状态的影响 …

    JavaScript 2023年5月27日
    00
  • javascript cookie操作类的实现代码小结附使用方法

    JavaScript Cookie 操作类的实现代码小结 什么是 Cookie Cookie 是一种在浏览器中用于存储信息的小型文本文件,通常用来存储用户的偏好设置、购物车内容等信息。Cookie 存储在用户的计算机上,由服务器生成并发送给浏览器。 JavaScript Cookie 操作类实现 以下代码演示了如何通过 JavaScript 操作 Cooki…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部