当前位置: 首页 > news >正文

练习小项目:倒数日小工具

功能描述:

  • 输入一个未来日期(使用 <input type="date">

  • 点击“计算倒计时”按钮后

  • 页面显示「还剩 XX 天!」

你要完成的逻辑点提示:

  1. 获取日期输入框的值

  2. new Date() 获取今天的时间

  3. 用 JS 算出两个日期相差的天数

  4. 把结果渲染到页面中

你可以假设 HTML 结构如下(也可自定义): 

<input type="date" id="targetDate">
<button id="calcBtn">计算倒计时</button>
<div id="result"></div>

 实践代码如下:

const targetDate = document.getElementById('targetDate');
const calcBtn = document.getElementById('calcBtn');
const result = document.getElementById('result');calcBtn.addEventListener('click', () => {const inputDate = new Date(targetDate.value);const today = new Date();// 判断日期是否合法if (isNaN(inputDate.getTime())) {alert("请选择有效日期");return;}// 计算剩余天数// 时间差计算:日期对象可以直接相减,结果是以毫秒为单位的时间差。const timeDifference = inputDate - today;//转换为天数:将毫秒数除以一天的毫秒数(1000 * 60 * 60 * 24),用Math.ceil向上取整,确保结果是正整数。const dayDifference = Math.ceil(timeDifference / (1000 * 60 * 60 * 24));// 清空旧结果result.innerHTML = '';// 展示结果const p1 = document.createElement('p');p1.textContent = `目标日期: ${targetDate.value}`;const p2 = document.createElement('p');if (dayDifference < 0) {p2.textContent = '目标日期已过去 🎉';} else if (dayDifference === 0) {p2.textContent = '就是今天!🎯';} else {p2.textContent = `还有 ${dayDifference} 天!`;}result.appendChild(p1);result.appendChild(p2);
});

关于为什么用 isNaN()来判断targetDate.value是否为空

如果new Date()传入的是一个空字符串 ''。虽然我们可能期望它返回 nullundefined,但实际上它返回的是一个 Date 实例对象,只是这个对象的值是 "Invalid Date"

所以:

  • new Date('') 不是 null

  • new Date('') 不是 undefined

  • 它是一个 Date 对象,只是这个对象无效。

  • 如果你调用 .getTime().valueOf(),它会返回 NaN

  • isNaN() 就是用来判断这个 NaN 的。

 你已经完成挑战了!总结你今天掌握的知识:

  • new Date() 和日期计算

  • getTime() 处理时间差

  • 动态生成/替换 DOM 内容

  • 健壮性判断 & 边界处理

  • 提升用户体验的思路

进阶思考挑战(选做):

  • 输入目标名称,比如“考试日” → 显示“距离考试日还有 X 天!”

  • 加一个“重置”按钮

  • 支持多个目标日期记录并保存(localStorage)

http://www.xdnf.cn/news/451369.html

相关文章:

  • Windows软件插件-写wav
  • 【Embedding Models】嵌入模型选择指南
  • 蓝卓入选2025宁波最具潜力新品牌TOP10
  • 数据库字段唯一性修复指南:从设计缺陷到规范实现
  • 安装windows版本的nacos
  • 总结下Jackson 中的JsonNode,ObjectNode,ArrayNode的方法
  • 时代推动建筑管理变革,楼宇自控系统成现代建筑管理必由之路
  • 数据结构·字典树
  • 每周靶点:TREM2、DLL3及文献分享
  • 代码随想录算法训练营第60期第三十六天打卡
  • W1电力线载波通信技术
  • Linux 常用命令 -hostnamectl【主机名控制】
  • Mixup
  • 【RabbitMQ】发布确认机制的具体实现
  • 3Dblox
  • 【Python3教程】Python3基础篇之输入与输出
  • 车载网关--- 职责边界划分与功能解耦设计
  • 安卓基础(Bitmap)
  • 致远OA项目管理应用包简介【附百度网盘链接】
  • scratch基础-外观模块
  • 基于EFISH-SCB-RK3576/SAIL-RK3576的智能安检机技术方案‌
  • 基于SpringBoot+Vue的房屋租赁管理系统源码包(完整版)开发实战
  • matlab提取脑电数据的五种频域特征指标数值
  • 电脑软件出现应用程序未响应
  • JJJ:linux ida
  • 深入掌握 Python 切片操作:解锁数据处理的高效密码
  • hadoop知识点
  • Guix System 系统详解:从架构到生态的深度解析
  • WebGL图形编程实战【7】:变换流水线 × 坐标系与矩阵精讲
  • 【ESP32-S3】Guru Meditation Error 崩溃分析实战:使用 addr2line 工具 + bat 脚本自动解析 Backtrace