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

yizhihongxing

下面是详细讲解“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日

相关文章

  • javascript的onchange事件与jQuery的change()方法比较

    当需要捕获表单控件的值发生变化时,可以使用JavaScript的onchange事件或jQuery的change()方法,下面进行详细比较。 JavaScript的onchange事件 原理 JavaScript的onchange事件是触发在表单控件的value值发生改变,并且失去焦点的情况下。 比如input,select等表单控件。 使用示例 <i…

    JavaScript 2023年6月11日
    00
  • JS Generator函数yield表达式示例详解

    JS Generator函数yield表达式示例详解 什么是JS Generator函数 JS Generator函数是另一种可以从函数中提供多个值的方法。Generator函数使用yield关键字来定义生成器函数体内的多个值。当调用生成器函数时,会返回一个迭代器对象,使用此对象可以使用next()方法从函数中提取这些值。 以下是JS Generator函数…

    JavaScript 2023年6月11日
    00
  • TypeScript接口和类型的区别小结

    下面我将为您介绍关于“TypeScript接口和类型的区别”的详细攻略。 什么是TypeScript接口? TypeScript接口是一种抽象结构,用于描述对象的形状。它们描述了对象具有什么属性,以及属性的类型。接口定义了一个协议(规范),对象实现该协议则视为符合该接口需求。例如: interface Person { name: string; age: …

    JavaScript 2023年6月11日
    00
  • Chrome开发者工具9个调试技巧详解

    Chrome开发者工具9个调试技巧详解 Chrome开发者工具是Web开发中常用的工具之一,能够极大地提高Web开发效率和质量。下面介绍9个Chrome开发者工具的调试技巧和使用方法。 1. 各种设备模拟 开发人员可以使用Chrome开发者工具模拟各种设备,例如手机、平板电脑等。在开发过程中,可以方便地查看网站在不同设备上的样式表现和响应速度。 示例:在Ch…

    JavaScript 2023年6月11日
    00
  • js完全解析url和拼接

    当我们在编写JavaScript代码时,有时候需要操作URL来完成一些特定的需求,比如向服务器发送请求、获取参数以及跳转到其他页面等。本文将为您详细讲解如何完全解析和拼接URL,以便于您在开发中更加轻松地完成URL相关的操作。 解析完整URL 我们先来看一下如何解析一个完整的URL,这个过程中要获取的部分包括协议、主机、端口、路径、查询参数以及哈希值。我们可…

    JavaScript 2023年6月11日
    00
  • utf-8编码引起js输出中文乱码的解决办法

    下面是关于“utf-8编码引起js输出中文乱码”的解决办法的完整攻略。 问题描述 当我们在使用 JavaScript 输出中文时,如果页面的编码方式为 utf-8,那么经常会出现中文乱码的问题。就算页面的编码设置正确且合法,但还是无法避免可能遇到的中文输出乱码问题。接下来我们将介绍如何解决这个问题。 解决办法 一个常见的解决方法是将需要输出的中文字符转为 u…

    JavaScript 2023年5月20日
    00
  • JS获取当前日期和时间的简单实例

    JS获取当前日期和时间的简单实例,可以使用内置的Date对象来实现。 第一步:创建Date对象 要获取当前日期和时间,我们首先需要创建一个Date对象。可以使用以下代码来创建: let currentDate = new Date(); 在上面的代码中,new关键字创建了一个新的Date对象,并将其分配给变量currentDate。这将创建一个包含当前日期和…

    JavaScript 2023年5月27日
    00
  • js中yield参数应用示例深入理解

    我来详细讲解一下“js中yield参数应用示例深入理解”的攻略。 标题一:yield的概念 yield的定义 在JavaScript中,yield是ES6(ECMAScript 6)中的一种关键字,用于生成器函数中。通过yield,我们可以在生成器函数中暂停执行并返回一个迭代器对象给调用者,再次调用时可以从上一次暂停的地方继续执行。 yield的应用场景 协…

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