You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现含日/月/年下拉框的Date Picker并通过JS前端校验限制最小年龄18岁?

实现带18岁年龄校验的下拉式日期选择器

当然可以!我给你一套完整的实现方案,包含三个下拉选择框的日期选择器,再加上前端JS校验逻辑,确保用户选择的日期对应的年龄不小于18周岁。

HTML结构

首先咱们先写基础的HTML布局,包含日、月、年三个下拉框,还有提交按钮和错误提示区域:

<div class="date-picker">
  <label for="day">日:</label>
  <select id="day" name="day"></select>

  <label for="month">月:</label>
  <select id="month" name="month">
    <option value="1">1月</option>
    <option value="2">2月</option>
    <option value="3">3月</option>
    <option value="4">4月</option>
    <option value="5">5月</option>
    <option value="6">6月</option>
    <option value="7">7月</option>
    <option value="8">8月</option>
    <option value="9">9月</option>
    <option value="10">10月</option>
    <option value="11">11月</option>
    <option value="12">12月</option>
  </select>

  <label for="year">年:</label>
  <select id="year" name="year"></select>

  <button onclick="validateAge()">提交</button>
  <p id="error-message" style="color: red; display: none;"></p>
</div>

JavaScript逻辑

接下来是核心的JS代码,负责初始化下拉选项、动态调整天数,以及年龄校验:

// 初始化年份下拉框(从当前年份倒推100年,覆盖大部分用户的年龄范围)
function initYearOptions() {
  const yearSelect = document.getElementById('year');
  const currentYear = new Date().getFullYear();
  for (let year = currentYear; year >= currentYear - 100; year--) {
    const option = document.createElement('option');
    option.value = year;
    option.textContent = `${year}年`;
    yearSelect.appendChild(option);
  }
  // 页面加载完成后默认初始化1月的天数
  updateDayOptions(1);
}

// 根据选中的月份和年份,动态更新天数选项(处理闰年2月的特殊情况)
function updateDayOptions(month) {
  const daySelect = document.getElementById('day');
  daySelect.innerHTML = ''; // 清空现有天数选项
  // 各月份的默认天数
  const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  const selectedYear = parseInt(document.getElementById('year').value);
  
  // 判断闰年:能被4整除但不能被100整除,或者能被400整除的年份,2月有29天
  if (month === 2 && ((selectedYear % 4 === 0 && selectedYear % 100 !== 0) || selectedYear % 400 === 0)) {
    daysInMonth[1] = 29;
  }
  
  // 生成对应月份的天数选项
  for (let day = 1; day <= daysInMonth[month - 1]; day++) {
    const option = document.createElement('option');
    option.value = day;
    option.textContent = day;
    daySelect.appendChild(option);
  }
}

// 核心校验函数:判断用户选择的日期是否满足年满18周岁
function validateAge() {
  const selectedDay = parseInt(document.getElementById('day').value);
  const selectedMonth = parseInt(document.getElementById('month').value);
  const selectedYear = parseInt(document.getElementById('year').value);
  const errorElement = document.getElementById('error-message');

  // 创建用户选择的日期对象(注意JS的Date对象月份是0-based,所以要减1)
  const userBirthDate = new Date(selectedYear, selectedMonth - 1, selectedDay);
  // 计算18年前的日期:以当前日期为基准,减去18年
  const minAllowedDate = new Date();
  minAllowedDate.setFullYear(minAllowedDate.getFullYear() - 18);

  // 日期比较:如果用户选择的日期晚于最小允许日期,说明年龄不足18岁
  if (userBirthDate > minAllowedDate) {
    errorElement.textContent = '抱歉,您必须年满18周岁才能继续操作!';
    errorElement.style.display = 'block';
    return false;
  } else {
    errorElement.style.display = 'none';
    alert('年龄校验通过!');
    // 这里可以添加后续的业务逻辑,比如表单提交
    return true;
  }
}

// 页面加载完成后初始化,同时监听月份/年份变化事件,实时更新天数
window.addEventListener('load', function() {
  initYearOptions();
  
  document.getElementById('month').addEventListener('change', function() {
    updateDayOptions(parseInt(this.value));
    // 可选:每次切换日期时自动校验
    // validateAge();
  });
  
  document.getElementById('year').addEventListener('change', function() {
    updateDayOptions(parseInt(document.getElementById('month').value));
    // 可选:每次切换日期时自动校验
    // validateAge();
  });
});

关键细节说明

  • 动态天数适配:这套代码会自动根据选中的月份和年份调整天数选项,避免用户选择像“4月31日”这种无效日期,同时处理了闰年2月的特殊情况。
  • 精准年龄校验:核心逻辑是对比用户选择的日期和“当前日期减18年”的日期,确保用户的实际年龄满18岁(比如今天是2024年5月20日,那么用户的出生日期必须早于2006年5月20日)。
  • 灵活校验时机:示例里是点击提交按钮触发校验,你也可以取消注释代码里的validateAge()调用,让用户每次切换日期时就实时校验,提升交互体验。

内容的提问来源于stack exchange,提问作者Shubham Goyal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:15