〖大前端 - 基础入门三大核心之JS篇㊺〗- 定时器和延时器

  • 说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费如需要项目实战或者是体系化资源,文末名片加V!
  • 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作,目前在公司担任研发部门CTO。
  • 荣誉:2022年度博客之星Top4、2023年度超级个体得主、谷歌与亚马逊开发者大会特约speaker全栈领域优质创作者

  • 🏆 白宝书系列
    • 🏅 启示录 - 攻城狮的自我修养
    • 🏅 Python全栈白宝书
    • 🏅 ChatGPT实践指南白宝书
    • 🏅 产品思维训练白宝书
    • 🏅 全域运营实战白宝书
    • 🏅 大前端全栈架构白宝书


文章目录

  • ⭐ 定时器
  • ⭐ 延时器
  • ⭐ 异步语句
  • ⭐ 使用定时器实现动画

⭐ 定时器

定时器

setInterval()函数可以设置一个定时器,原理是可以重复调用一个函数,在每次调用函数之间具有固定的时间间隔

示例代码:

//第一个参数是需要被固定时间间隔调用的函数,第二个参数是固定的时间间隔(单位:毫秒)
setInterval(function () {
    //函数体
}, 2000);

比如书写一段程序,在控制台每1秒输出一个数字,每个数字等于前一个数字加1:

var a = 0;
setInterval(function () {
    console.log(a++);
}, 1000);

image-20230424133038304

setInterval()函数可以接收第3、4…个参数,它们将作为实参按顺序传入函数

示例代码:

setInterval(function (a, b) {
    //函数体
}, 2000, 11, 22);  //11, 22将作为实参传入函数

在编写程序时,也可以先书写一个具体的函数,再把这个函数名(注意函数名后面不要书写圆括号)作为参数传入setInterval()

示例代码:

var a = 1;
function add(n) {
    a += n;
    console.log(a);
};
setInterval(add, 1000, 100);  //每秒调用一次add函数,最后一个参数作为参数传入add函数

image-20230424133752448

清除定时器

clearInterval()函数可以清除一个定时器

示例代码:

<body>
    <button id="btn">清除定时器</button>
    <script>
        var oBtn = document.getElementById('btn');

        var a = 1;
        function add(n) {
            a += n;
            console.log(a);
        };
        //设置定时器
        var timer = setInterval(add, 1000, 1);  //每秒调用一次add函数,最后一个参数作为参数传入add函数

        //点击按钮清除定时器
        oBtn.onclick = function () {
            clearInterval(timer);
        };
    </script>
</body>

image-20230424135123897

现在我们来做一个有趣的案例:在页面上制作一个简易计时器(单位:秒),点击开始按钮开始计时,点击停止按钮停止计时:

<body>
    <h1 id="info">0</h1>
    <button id="btn1">开始</button>
    <button id="btn2">停止</button>

    <script>
        var oInfo = document.getElementById('info');
        var oBtn1 = document.getElementById('btn1');
        var oBtn2 = document.getElementById('btn2');

        //注意,需要将定时器定义为全局变量
        var timer;
        //点击开始,设置定时器
        oBtn1.onclick = function () {
            //先清除一次定时器,避免出现连续点击开始按钮,触发多次事件监听,创建多个定时器问题
            clearInterval(timer);
            var a = 1;
            timer = setInterval(function add() {
                oInfo.innerText = a++;
            }, 1000);
        };
        //点击停止,清除定时器
        oBtn2.onclick = function () {
            clearInterval(timer);
        };
    </script>
</body>

image-20230424141048069

⭐ 延时器

延时器

setTimeout()函数可以设置一个延时器,当指定时间到了之后,会执行函数,注意不会重复执行

示例代码:

setTimeout(function () {
    //2秒后执行一次这个函数
}, 2000);

清除延时器

clearTimeout()函数可以清除延时器,和clearInterval()非常类似

比如书写一个程序,在用户打开页面2秒钟后,弹出一个弹框:欢迎进入哈士奇的主页!,如果用户在打开页面2秒内点击了任意空白部分,则不弹出这个弹框。

<body>
    <script>
        var timer;

        //设置延时器
        timer = setTimeout(function () {
            alert('欢迎进入哈士奇的主页!');
        }, 2000);

        document.onclick = function () {
            //清除延时器
            clearTimeout(timer);
        }
    </script>
</body>

⭐ 异步语句

在js中是有异步语句的,比如setInerval()setTimeout()就是两个异步语句。

**异步:**不会阻塞CPU继续执行其他语句,当异步完成时,会执行“回调函数”(callback)

image-20230424145054162

这是比较简单的异步语句,大致了解就好,在后面的用到ajax时,还会接触更多的异步语句。

⭐ 使用定时器实现动画

动画是网页上非常常见的需求,我们在前面已经学会了用css实现动画。动画的原理其实就是利用“视觉暂留”,比如一个盒子,在非常短暂的间隔时间里,不停的改变它的位置,我们肉眼看起来,就像是它在“运动”,所以,我们可以利用定时器来实现动画。

下面我们做一个案例,使用定时器来实现动画:点击开始按钮盒子开始向右移动,移动到500px的位置停止运动。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        #box {
            width: 100px;
            height: 100px;
            background-color: orange;
            position: absolute;
            top: 100px;
            left: 100px;
        }
    </style>
</head>
<body>
    <button id="btn">开始运动</button>
    <div id="box"></div>

    <script>
        var oBtn = document.getElementById('btn');
        var oBox = document.getElementById('box');

        var left = 100;

        oBtn.onclick = function () {
            var timer = setInterval(function name(params) {
                //每次执行函数,改变一次left值,并改变盒子的left属性
                left += 2;
                oBox.style.left = left + 'px';
                //当left值达到500时,清除定时器
                if (left >= 500) {
                    clearInterval(timer);
                }
            }, 20);
        };
    </script>
</body>
</html>

image-20230424163619723

这只是非常简单的例子,事实上,使用定时器实现动画并不方便,比如想改变运动速度曲线、想使盒子运动到指定位置后再返回、想多种运动叠加(比如一个方形一遍移动一边变为圆形)等等都很难仅仅通过定时器来实现。最方便的实现动画的方法是js+css,下篇我们就来介绍这个即简单又强大的实现动画的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213160.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

12月1号作业

实现运算符重载 #include <iostream>using namespace std; class Person{friend const Person operator-(const Person &L,const Person &R);friend bool operator<(const Person &L,const Person &R);friend Person operator-(Person &L,const …

第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间

文章目录 第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间指定被视为Global元素的对象的命名空间指定映射为元素的属性的命名空间案例1&#xff1a;属性被视为本地元素案例2:属性被视为Global元素 第二十二章 指定元素和属性的命名空间 - 指定被视…

Unity 简单打包脚本

打包脚本 这个打包脚本适用于做demo&#xff0c;脚本放在Editor目录下 using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine;public class BuildAB {[MenuItem("Tools/递归遍历文件夹下…

【蓝桥杯】带分数

带分数 题目要求用一个ab/c的形式得到一个值&#xff0c;而且只能在1~9里面不重复的组合。 可以对1~9进行全排列&#xff0c;然后不断划分区间。 #include<iostream> #include<vector> using namespace std; int st[15]; int num[15]; int res; int n;int calc(i…

基于Python实现的滑动验证码自动识别工具源码

滑动验证码识别 今天的目标地址是字节的巨量纵横&#xff0c;目前东家是一家广告营销型的公司&#xff0c;专注于在各大平台投放信息流广告。巨量纵横为字节跳动的广告平台&#xff0c;用于管理推广账户。今天破解一下这个平台的登陆入口&#xff0c;为今后的数据爬取开个头。…

Android 源码编译

一&#xff0c;虚拟机安装 ​ 1.1 进入https://cn.ubuntu.com/download中文官网下载iso镜像 1.2 这里我们下载Ubuntu 18.04 LTS 1.3虚拟VM机安装ubuntu系统&#xff0c;注意编译源码需要至少16G运行内存和400G磁盘空间&#xff0c;尽量设大点 二 配置编译环境 2.1 下载andr…

进行主从复制时出现的异常FATAL CONFIG FILE ERROR (Redis 6.2.6)Reading the configuration file

错误如下所示&#xff1a; FATAL CONFIG FILE ERROR (Redis 6.2.6) Reading the configuration file, at line 1 >>> include/myredis/redis.conf Bad directive or wrong number of arguments出现错误的原因是.conf文件中命令之间缺少空格&#xff0c;如下所示&…

Sharding-Jdbc(4):Sharding-Jdbc分库

1 新建数据库 创建ds_0数据库和ds_1数据库&#xff0c;在两个数据库新建表如下&#xff1a; CREATE TABLE t_order (order_id bigint(20) NOT NULL,user_id bigint(20) NOT NULL,PRIMARY KEY (order_id) ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_bin; 2 新建maven项目…

GAMES101:作业2记录

总览 在上次作业中&#xff0c;虽然我们在屏幕上画出一个线框三角形&#xff0c;但这看起来并不是那么的有趣。所以这一次我们继续推进一步——在屏幕上画出一个实心三角形&#xff0c;换言之&#xff0c;栅格化一个三角形。上一次作业中&#xff0c;在视口变化之后&#xff0…

yolo.txt格式与voc格式互转,超详细易上手

众所周知,yolo训练所需的标签文件类型是.txt的,但我们平时使用标注软件(labelimage等)标注得到的标签文件是.xml类型的,故此xml2txt之间的转换就至关重要了,这点大家不可能想不到,但是网上的文章提供的代码大多数都是冗余,或者难看,难以上手,故此作者打算提供一个相对…

51单片机PWM讲解

前言 51单片机我已经很久没用过了&#xff0c;毕竟是十年前的产物了&#xff0c;但是由于工作室的学弟学妹需要学习&#xff0c;加之马上就要举行循迹小车比赛&#xff0c;很多人反映看不懂PWM&#xff0c;或者看了不会用&#xff0c;于是写一篇文章简单介绍一下。 PWM普遍应…

“B2B+OMS方案”,赋能家电巨头构建BC订单一体化能力,促进业务增长|徐礼昭

某国际知名家电电器品牌&#xff0c;年营收超过5000亿元。该电器企业其整体业务分三大类&#xff1a;线上线下B2B2C业务、线下B2B业务以及DTC零售业务。 随着业务的发展&#xff0c;该电器品牌对2B业务及DTC业务的数字化系统能力支撑需要更加全面和立体&#xff0c;以适应业务…

5个优质免费自然语言处理学习资源 | 语言技术导航

探索并利用我们的5个免费自然语言处理&#xff08;NLP&#xff09;学习资源&#xff0c;更有效地理解和实施自然语言处理技术。适合初学者和进阶者&#xff0c;涵盖基础理论到实际应用。 近年来&#xff0c;随着人工智能&#xff08;AI&#xff09;解决方案的商业应用&#xff…

前后端数据传输格式(上)

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 作为后端&#xff0c;写…

springboot足球社区管理系统

springboot足球社区管理系统 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekj…

【论文阅读】Bayes’ Rays:神经辐射场的不确定性量化

【论文阅读】Bayes’ Rays&#xff1a;神经辐射场的不确定性量化 1. Introduction2. Related work3. Background3.2. Neural Laplace Approximations 4. Method4.1. Intuition4.2. Modeling perturbations4.3. Approximating H4.4. Spatial uncertainty 5. Experiments & A…

多线程(初阶七:阻塞队列和生产者消费者模型)

一、阻塞队列的简单介绍 二、生产者消费者模型 三、模拟实现阻塞队列 一、阻塞队列的简单介绍 首先&#xff0c;我们都知道&#xff0c;队列是先进先出的一种数据结构&#xff0c;而阻塞队列&#xff0c;是基于队列&#xff0c;做了一些扩展&#xff0c;在多线程有就非常有意…

Task中Wait()和Result造成死锁

在使用Task的时候&#xff0c;一不留神就会造成死锁&#xff0c;而且难以发现&#xff0c;尤其是业务繁多的情况下&#xff0c;一个Task嵌套另一个Task的时候&#xff0c;下面就演示一下&#xff0c;在什么情况下&#xff0c;会产生Wait()和Result的死锁&#xff0c;因此&#…

Java系类 之 String、StringBuffer和StringBuilder类的区别

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 ✈️已经旅游的地点 | 新疆-乌鲁木齐、新疆-吐鲁番、广东-广州…

07、基于LunarLander登陆器的强化学习案例(含PYTHON工程)

07、基于LunarLander登陆器的强化学习&#xff08;含PYTHON工程&#xff09; 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 基于TENSORFLOW2.10 0、实践背景 gym的LunarLander是一个用于…