我想在 fullcalendar 中有两个由 slotMinTime 和 slotMaxTime 定义的时间段
P粉617237727
P粉617237727 2023-09-04 11:32:30
[JavaScript讨论组]
<p>我打算在同一日历中使用两个不同的时期。到目前为止,我发现的唯一方法是在两个不同的日历中执行此操作,如下所示:</p> <p> <pre class="brush:js;toolbar:false;">$(".btn-show").click(function(e) { e.preventDefault(); el = $(this).data('element'); $(el).show(); $("section &gt; div").not(el).hide(); }); $(document).on('click', '.dad-visita', function(){ if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { initialViews = 'timeGridWeek'; }else{ initialViews = 'timeGridWeek'; } var calendarEl = document.getElementById('calendario'); var today = moment().day(); var calendar = new FullCalendar.Calendar(calendarEl, { headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, locale: "pt-br", buttonText:{ today: 'Hoje', list: 'Lista' }, navLinks: true, firstDay: today, hiddenDays: [ 0 ], initialView: initialViews, editable: true, selectable: true, unselectAuto:true, eventOverlap: false, eventColor: '#f16621', slotDuration: '00:45', allDaySlot : false, eventStartEditable: false, eventDurationEditable:false, longPressDelay: 0, nowIndicator: "true", slotMinTime: '10:30', slotMaxTime: '12:00', contentHeight: 'auto', }); calendar.render(); }); $(document).on('click', '.dad-visita', function(){ if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { initialViews = 'timeGridWeek'; }else{ initialViews = 'timeGridWeek'; } var calendarEl = document.getElementById('calendario1'); var today = moment().day(); var calendar = new FullCalendar.Calendar(calendarEl, { headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, locale: "pt-br", buttonText:{ today: 'Hoje', list: 'Lista' }, navLinks: true, firstDay: today, hiddenDays: [ 0 ], initialView: initialViews, editable: true, selectable: true, unselectAuto:true, eventOverlap: false, eventColor: '#f16621', slotDuration: '00:45', allDaySlot : false, eventStartEditable: false, eventDurationEditable:false, longPressDelay: 0, nowIndicator: "true", slotMinTime: '14:30', slotMaxTime: '19:00', contentHeight: 'auto', }); calendar.render(); });</pre> <pre class="brush:html;toolbar:false;">&lt;link href="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.css" rel="stylesheet"&gt; &lt;script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/pt-br.js"&gt;&lt;/script&gt; &lt;a href="s160" data-element="#minhaDiv160" class="btn-show dad-visita"&gt; &lt;i class="metismenu-icon pe-7s-info"&gt;&lt;/i&gt; Consultar Visitas &lt;/a&gt; &lt;section id="s160"&gt; &lt;div style="display:none;" id="minhaDiv160"&gt; &lt;div class="cal-wrapper"&gt;&lt;div id='calendario'&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="cal-wrapper"&gt;&lt;div id='calendario1'&gt;&lt;/div&gt;&lt;/div&gt; &lt;/div&gt; &lt;/section&gt;</pre> </p> <p>但是这样我就必须有两个日历,这不是正确的方法。我必须这样做的原因是我需要 slotDuration 为 45 分钟,并且在早上它会正确假设事件的时间。</p> <p>但是下午的活动从 14:30 开始,并且通过此 slotDuration,如果您将 slotMinTime 设置为 10:30,将 slotMaxTime 设置为 19:00,则下午活动的日历将从 14:15 开始,如示例所示: </p> <p> <pre class="brush:js;toolbar:false;">$(".btn-show").click(function(e) { e.preventDefault(); el = $(this).data('element'); $(el).show(); $("section &gt; div").not(el).hide(); }); $(document).on('click', '.dad-visita', function(){ if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { initialViews = 'timeGridWeek'; }else{ initialViews = 'timeGridWeek'; } var calendarEl = document.getElementById('calendario'); var today = moment().day(); var calendar = new FullCalendar.Calendar(calendarEl, { headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, locale: "pt-br", buttonText:{ today: 'Hoje', list: 'Lista' }, navLinks: true, firstDay: today, hiddenDays: [ 0 ], initialView: initialViews, editable: true, selectable: true, unselectAuto:true, eventOverlap: false, eventColor: '#f16621', slotDuration: '00:45', allDaySlot : false, eventStartEditable: false, eventDurationEditable:false, longPressDelay: 0, nowIndicator: "true", slotMinTime: '10:30', slotMaxTime: '19:00', contentHeight: 'auto', }); calendar.render(); });</pre> <pre class="brush:html;toolbar:false;">&lt;link href="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.css" rel="stylesheet"&gt; &lt;script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/pt-br.js"&gt;&lt;/script&gt; &lt;a href="s160" data-element="#minhaDiv160" class="btn-show dad-visita"&gt; &lt;i class="metismenu-icon pe-7s-info"&gt;&lt;/i&gt; Consultar Visitas &lt;/a&gt; &lt;section id="s160"&gt; &lt;div style="display:none;" id="minhaDiv160"&gt; &lt;div class="cal-wrapper"&gt;&lt;div id='calendario'&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class="cal-wrapper"&gt;&lt;div id='calendario1'&gt;&lt;/div&gt;&lt;/div&gt; &lt;/div&gt; &lt;/section&gt;</pre> </p> <p>当从 14:15 开始时,它很快就会返回我想要的所有不同下午事件的时间。</p> <p>我仍然找不到解决这个问题的方法。</p> <p><strong>带有 selectAllow 的代码:</strong></p> <p> <pre class="brush:js;toolbar:false;">$(".btn-show").click(function(e) { e.preventDefault(); el = $(this).data('element'); $(el).show(); $("section &gt; div").not(el).hide(); }); $(document).on('click', '.dad-visita', function(){ if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) { initialViews = 'timeGridWeek'; }else{ initialViews = 'timeGridWeek'; } var calendarEl = document.getElementById('calendario'); var today = moment().day(); var calendar = new FullCalendar.Calendar(calendarEl, { headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay' }, locale: "pt-br", buttonText:{ today: 'Hoje', list: 'Lista' }, navLinks: true, firstDay: today, hiddenDays: [ 0 ], initialView: initialViews, editable: true, selectable: true, unselectAuto:true, eventOverlap: false, eventColor: '#f16621', slotDuration: '00:15', allDaySlot : false, eventStartEditable: false, eventDurationEditable:false, longPressDelay: 0, nowIndicator: "true", slotMinTime: '10:30', slotMaxTime: '19:00', contentHeight: 'auto', select: function(start, end) { var start1 = moment((start.startStr)).format('HH:mm:ss'); if(start1 == '14:15:00'){ $('#ModalAddVisit #start').val(moment((start.startStr)).format('YYYY-MM-DD' + " " + '14:30:00')); $('#ModalAddVisit #end').val(moment((start.startStr)).format('YYYY-MM-DD' + " " + '15:15:00')); $("#ModalAddVisit").modal("show"); } }, }); calendar.render(); });</pre> <pre class="brush:html;toolbar:false;">&lt;link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"&gt; &lt;link href="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.css" rel="stylesheet"&gt; &lt;script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/pt-br.js"&gt;&lt;/script&gt; &lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"&gt;&lt;/script&gt; &lt;script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js"&gt;&lt;/script&gt; &lt;a href="s160" data-element="#minhaDiv160" class="btn-show dad-visita"&gt; &lt;i class="metismenu-icon pe-7s-info"&gt;&lt;/i&gt; Consultar Visitas &lt;/a&gt; &lt;section id="s160"&gt; &lt;div style="display:none;" id="minhaDiv160"&gt; &lt;div class="cal-wrapper"&gt;&lt;div id='calendario'&gt;&lt;/div&gt;&lt;/div&gt; &lt;/div&gt; &lt;/section&gt; &lt;div class="modal fade" tabindex="-1" id="ModalAddVisit" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false"&gt; &lt;div class="modal-dialog modal-lg" role="document"&gt; &lt;div class="modal-content"&gt; &lt;div class="modal-header"&gt; &lt;h5 class="modal-title" id="exampleModalLabel"&gt;NOVA VISITA&lt;/h5&gt; &lt;button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"&gt;&lt;/button&gt; &lt;/div&gt; &lt;div class="modal-body"&gt; &lt;form method="POST" class="row g-3 insvisit"&gt; &lt;div class="row"&gt; &lt;div class="col-6"&gt; &lt;label for="start"&gt; &lt;strong&gt;DATA/HORA INICIAL&lt;/strong&gt; &lt;span style="color: red;"&gt;*&lt;/span&gt;&lt;/label&gt; &lt;input type="text" name="start" id="start" required&gt; &lt;/div&gt; &lt;div class="col-6"&gt; &lt;label for="end"&gt; &lt;strong&gt;DATA/HORA FINAL&lt;/strong&gt; &lt;span style="color: red;"&gt;*&lt;/span&gt;&lt;/label&gt; &lt;input type="text" name="end" id="end" required&gt; &lt;/div&gt; &lt;/div&gt; &lt;div class="modal-footer"&gt; &lt;button type="button" class="btn btn-secondary" data-bs-dismiss="modal"&gt;Fechar&lt;/button&gt; &lt;button type="button" class="btn btn-primary validatevisit" id="save-event"&gt;Gravar&lt;/button&gt; &lt;/div&gt; &lt;/form&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;</pre> </p>
P粉617237727
P粉617237727

全部回复(1)
P粉186904731

FullCalendar 不允许您在同一日历上设置两个不同的最小值和最大值。

要解决这个问题,但仍能实现强制执行 45 分钟时段的目标,并在中午休息一段时间(此时无法创建任何活动),您可以

$(".btn-show").click(function(e) {
  e.preventDefault();
  el = $(this).data('element');
  $(el).show();
  $("section > div").not(el).hide();
});

$(document).on('click', '.dad-visita', function() {
  if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
    initialViews = 'timeGridWeek';
  } else {
    initialViews = 'timeGridWeek';
  }

  var calendarEl = document.getElementById('calendario');
  var today = moment().day();

  var calendar = new FullCalendar.Calendar(calendarEl, {
    headerToolbar: {
      left: 'prev,next today',
      center: 'title',
      right: 'dayGridMonth,timeGridWeek,timeGridDay'
    },
    locale: "pt-br",
    buttonText: {
      today: 'Hoje',
      list: 'Lista'
    },
    navLinks: true,
    firstDay: today,
    hiddenDays: [0],
    initialView: initialViews,
    editable: true,
    selectable: true,
    unselectAuto: true,
    eventOverlap: false,
    eventColor: '#f16621',
    slotDuration: '00:15',
    allDaySlot: false,
    eventStartEditable: false,
    eventDurationEditable: false,
    longPressDelay: 0,
    nowIndicator: "true",
    slotMinTime: '10:30',
    slotMaxTime: '19:00',
    contentHeight: 'auto',
    selectConstraint: "businessHours",
    selectAllow: function(info) {
      var start = moment(info.start);
      var end = moment(info.end);
      var diff = end.diff(start, 'minutes');
      return (diff == 45);
    },
    businessHours: [
      {
        daysOfWeek: [0, 1, 2, 3, 4, 5, 6],
        startTime: '10:00',
        endTime: '12:00'
      },
      {
        daysOfWeek: [0, 1, 2, 3, 4, 5, 6],
        startTime: '14:30',
        endTime: '19:00'
      }
    ],
    select: function(info) {
      var start1 = moment((info.startStr)).format('HH:mm:ss');
      $('#ModalAddVisit #start').val(moment((info.startStr)).format('YYYY-MM-DD' + " " + '14:30:00'));
      $('#ModalAddVisit #end').val(moment((info.startStr)).format('YYYY-MM-DD' + " " + '15:15:00'));
      $("#ModalAddVisit").modal("show");
    }
  });

  calendar.render();
});
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css">
<link href="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/fullcalendar@5.9.0/main.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/locale/pt-br.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js"></script>

<a href="s160" data-element="#minhaDiv160" class="btn-show dad-visita">
  <i class="metismenu-icon pe-7s-info"></i> Consultar Visitas
</a>

<section id="s160">
  <div style="display:none;" id="minhaDiv160">
    <div class="cal-wrapper">
      <div id='calendario'></div>
    </div>
  </div>
</section>


<div class="modal fade" tabindex="-1" id="ModalAddVisit" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
  <div class="modal-dialog modal-lg" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="exampleModalLabel">NOVA VISITA</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
      </div>
      <div class="modal-body">
        <form method="POST" class="row g-3 insvisit">
          <div class="row">
            <div class="col-6">
              <label for="start"> <strong>DATA/HORA INICIAL</strong> <span style="color: red;">*</span></label>
              <input type="text" name="start" id="start" required>
            </div>
            <div class="col-6">
              <label for="end"> <strong>DATA/HORA FINAL</strong> <span style="color: red;">*</span></label>
              <input type="text" name="end" id="end" required>
            </div>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Fechar</button>
            <button type="button" class="btn btn-primary validatevisit" id="save-event">Gravar</button>
          </div>
        </form>
      </div>
    </div>
  </div>
</div>
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号