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日

相关文章

  • 巧用weui.topTips验证数据的实例

    下面是使用weui.topTips验证数据的完整攻略: 准备工作 首先需要在你的项目中引入WeUI和jQuery。可以通过以下方法引入: <!– WeUI样式 –> <link rel="stylesheet" href="https://res.wx.qq.com/open/libs/weui/2.0.1…

    JavaScript 2023年6月11日
    00
  • Javascript 之封装(Package)

    Javascript 之封装(Package) 在编程中,封装是重要的概念之一,它可以避免代码的重复,提高代码的可维护性和可复用性。本篇教程将介绍Javascript中的封装,重点讲解在Javascript中如何将多个函数和变量进行封装打包,以便于代码的复用和维护。 一、Javascript中的私有变量和私有函数 Javascript中并不存在真正意义上的私…

    JavaScript 2023年5月27日
    00
  • javascript学习随笔(使用window和frame)的技巧

    JavaScript学习随笔:使用Window和Frame的技巧 在本文中,我们将深入了解JavaScript中Window和Frame对象的使用技巧。这些对象是JavaScript中最基本的对象之一,也是Web开发必不可少的一部分。本文将涵盖以下内容: Window对象和Frame对象的区别 如何访问和操作窗口对象 如何访问和操作框架(Frame)对象 示…

    JavaScript 2023年6月11日
    00
  • Javascript Date getUTCDate() 方法

    JavaScript 中的 getUTCDate() 方法用于获取 UTC 时间的日期部分。在本教程中,我们将详细介绍 getUTCDate() 方法的使用方法。 getUTCDate() 方法的基本语法如下: date.getUTCDate() 其中,date 是获取日期部分的 UTC 日期对象。 以下两个示例说明: 示例一:使用 getUTCDate()…

    JavaScript 2023年5月11日
    00
  • JavaScript DOM节点操作方式全面讲解

    JavaScript DOM节点操作是前端开发中非常重要的一部分,通过节点操作可以改变页面的结构、样式和内容。本文将全面讲解JavaScript DOM节点操作的方式,包括获取节点、修改节点的属性、添加节点、删除节点等。同时,本文还将通过两个实例对节点操作进行说明,帮助读者更好地理解。 获取节点 获取节点是在操作节点之前必须要进行的步骤。在JavaScrip…

    JavaScript 2023年6月10日
    00
  • js中的触发事件对象event.srcElement与event.target详解

    题目:js中的触发事件对象event.srcElement与event.target详解 什么是事件对象 在JavaScript中,事件对象是在事件触发时由浏览器自动创建的一个对象,它包含着当前事件的属性、方法和一些有用的信息。我们可以通过这个对象来获取有关事件的信息。 事件对象属性 在JavaScript中,事件对象包含有一些有用的属性,如下: type:…

    JavaScript 2023年6月10日
    00
  • 在JavaScript中处理时间之getHours()方法的使用

    在JavaScript中处理时间之getHours()方法的使用 getHours()是JavaScript的Date对象的方法,用于获取当前的小时数。这个方法返回一个0到23之间的整数,表示当前时间的小时数。 语法 date.getHours() 其中date是一个Date对象。 示例说明 示例1:获取当前时间的小时数 let now = new Date…

    JavaScript 2023年5月27日
    00
  • js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)

    实现用户离开页面前提示是否离开此页面的方法通常使用beforeunload事件。该事件会在用户关闭或离开页面前触发。在这个事件中,你可以弹出一个提示框,询问用户是否确认离开页面。下面是具体的实现步骤: 1. 监听beforeunload事件 首先,在 JavaScript 代码中添加如下代码来监听beforeunload事件: window.addEvent…

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