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

如何在Materializecss Datepicker中实现全日期选择功能?

实现MaterializeCSS Date-Picker的「全部」选项功能

嘿,我之前也碰到过类似的需求——Materialize的日期选择器本身确实没有内置「全部」选项,但完全不用额外插件,靠原生JS结合Materialize的组件API就能搞定,给你两种实用的方案:

方案1:搭配单选按钮组(直观易维护)

这种方法是在日期选择器旁边加一组单选按钮,让用户选择「选择日期」或「全部」,通过切换单选状态来控制日期选择器的可用性,提交时根据选中状态传递对应值。

HTML结构

<div class="row">
  <div class="col s12">
    <!-- 单选选项组 -->
    <div class="input-field">
      <label>
        <input name="date_scope" type="radio" class="with-gap" value="date" checked />
        <span>选择日期</span>
      </label>
      <label>
        <input name="date_scope" type="radio" class="with-gap" value="all" />
        <span>全部</span>
      </label>
    </div>

    <!-- Materialize日期选择器 -->
    <div class="input-field">
      <input type="text" id="single-datepicker" class="datepicker" />
      <label for="single-datepicker">选择日期</label>
    </div>

    <!-- 提交按钮 -->
    <button class="btn waves-effect waves-light" id="submit-btn">提交</button>
  </div>
</div>

JavaScript逻辑

document.addEventListener('DOMContentLoaded', function() {
  // 初始化日期选择器
  const datepickerInstance = M.Datepicker.init(document.getElementById('single-datepicker'), {
    format: 'yyyy-mm-dd', // 按后端要求的日期格式设置
    autoClose: true,
    defaultDate: new Date()
  });

  // 监听单选按钮切换
  document.querySelectorAll('input[name="date_scope"]').forEach(radio => {
    radio.addEventListener('change', function() {
      if (this.value === 'all') {
        // 选中「全部」时禁用日期选择器并清空值
        datepickerInstance.disable();
        document.getElementById('single-datepicker').value = '';
      } else {
        // 选中「选择日期」时启用日期选择器
        datepickerInstance.enable();
      }
    });
  });

  // 提交时处理参数
  document.getElementById('submit-btn').addEventListener('click', function() {
    const selectedScope = document.querySelector('input[name="date_scope"]:checked').value;
    let submitParams = {};

    if (selectedScope === 'all') {
      submitParams.date = 'all';
    } else {
      submitParams.date = document.getElementById('single-datepicker').value;
    }

    // 这里替换成你的后端API调用逻辑
    console.log('提交参数:', submitParams);
    // fetch('/your-api-url', { method: 'POST', body: JSON.stringify(submitParams) })
  });
});

方案2:自定义日期选择器面板(集成度更高)

如果你希望「全部」选项直接集成在日期选择器面板里,可以通过修改Materialize日期选择器的DOM结构,在面板底部添加一个「全部」按钮,点击后标记为选择全部数据。

HTML结构

<div class="row">
  <div class="col s12">
    <div class="input-field">
      <input type="text" id="integrated-datepicker" class="datepicker" />
      <label for="integrated-datepicker">选择日期或全部</label>
    </div>
    <button class="btn waves-effect waves-light" id="integrated-submit-btn">提交</button>
  </div>
</div>

JavaScript逻辑

document.addEventListener('DOMContentLoaded', function() {
  const datepickerInstance = M.Datepicker.init(document.getElementById('integrated-datepicker'), {
    format: 'yyyy-mm-dd',
    autoClose: true,
    onOpen: function() {
      // 在日期选择器的底部添加「全部」按钮
      const footer = this.el.parentNode.querySelector('.datepicker-footer');
      if (!footer.querySelector('.select-all-btn')) {
        const allBtn = document.createElement('button');
        allBtn.className = 'btn-flat select-all-btn';
        allBtn.textContent = '全部';
        
        allBtn.addEventListener('click', () => {
          // 清空日期选择,关闭面板,标记为选择全部
          this.setDate(null);
          this.close();
          this.el.setAttribute('data-select-all', 'true');
          this.el.value = '全部'; // 可选:给输入框显示「全部」文字
        });
        
        footer.appendChild(allBtn);
      }
    },
    onSelect: function() {
      // 选择具体日期时清除「全部」标记
      this.el.setAttribute('data-select-all', 'false');
    }
  });

  // 提交时处理参数
  document.getElementById('integrated-submit-btn').addEventListener('click', function() {
    const dateInput = document.getElementById('integrated-datepicker');
    const isSelectAll = dateInput.getAttribute('data-select-all') === 'true';
    const submitDate = isSelectAll ? 'all' : dateInput.value;

    // 这里替换成你的后端API调用逻辑
    console.log('提交参数:', { date: submitDate });
  });
});

两种方案都不需要额外插件,方案1逻辑简单、易维护,适合大多数场景;方案2体验更流畅,适合追求集成度的需求,你可以根据自己的项目情况选择~

内容的提问来源于stack exchange,提问作者web developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:17