Как изменить цвет фона выбранной даты в FullCalendar

#javascript #css #fullcalendar #fullcalendar-3

#javascript #css #полный календарь #полный календарь-3

Вопрос:

Я пытаюсь изменить цвет фона выбранной даты в моем календаре. В моем приведенном ниже коде выделяются все выбранные даты, как я могу выделить только дату последнего нажатия?

 dayClick: function (day){
  var mydate = new Date(this[0].getAttribute("data-date"));
  var dateArray = mydate.toDateString().split(" ");
  document.querySelectorAll(".calendar-mobile p")[0].innerHTML = j_monthNames[mydate.getMonth()]   " "   mydate.getDate()   "日"   "("   j_dayNames[dateArray[0].toLocaleLowerCase()]   ")";
  document.body.classList.remove("calendar-open");

  $month = ''   (mydate.getMonth()   1);
  $day = ''   mydate.getDate();
  $year = mydate.getFullYear();

  if ($month.length < 2) $month = '0'   $month;
  if ($day.length < 2) $day = '0'   $day;
  $dates = [$year, $month, $day].join('-');
  $('[data-date=' $dates ']').css({"color": "red", "backgroundColor": "yellow",});
},
  

Ответ №1:

Я, наконец, решил это таким образом:

 $(document).ready(function() {
  $('#calendars').fullCalendar({
    header: {
      left: 'prev',
      center: 'title',
      right: 'next'
    },
    selectable: true,
  });
});  
 .fc-highlight {
  background: green !important;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.0.1/fullcalendar.min.css" defer/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.16.0/moment.min.js" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/fullcalendar/3.0.1/fullcalendar.min.js" defer></script>
<div id="calendars"></div>  

Просто запустил .fc-highlight класс, и это делает свое дело.

Ответ №2:

Вы сделали этот способ более сложным, чем это должно быть.

Просто определите класс CSS, который установит цвета так, как вы хотите, чтобы они были при добавлении к HTML-элементу дня.

Затем в функции dayClick сначала найдите все элементы, у которых есть этот класс, и удалите из них класс. Это остановит ее отображение в ранее выбранные дни.

Затем добавьте класс к текущему элементу (представленному this ). Просто!

JS:

 dayClick: function (day){
  $(".day-highlight").removeClass("day-highlight");
  $(this).addClass("day-highlight");
}
  

CSS:

 .day-highlight {
  background-color: yellow !important;
  color: red !important;
}
  

( !important необходимо переопределить цветовое выделение текущей даты, которое устанавливается FullCalendar автоматически.)

Живая демонстрация:http://jsfiddle.net/zs9g5a8k /

Комментарии:

1. Спасибо за это. Но выбор текущей даты не меняет цвет фона.

2. @EemJee это хороший момент, спасибо. Вы можете переопределить это, добавив !important в правила. Смотрите отредактированный ответ и обновленную демонстрацию выше.

Ответ №3:

Если кому-то интересно, как это сделать в Angular2 :

 <full-calendar #calendar
               id="calendar"
               (dateClick)="handleDateClick($event)"
               deepChangeDetection="true"
               defaultView="dayGridMonth"
               [locales]="[itLocale]"
               locale="it"
               [selectable]="true"
               [header]="options.header"
               [plugins]="calendarPlugins">
</full-calendar>
  

В файле typescript:

 import { Component, OnInit, ViewChild } from '@angular/core';
import dayGridPlugin from '@fullcalendar/daygrid';
import { FullCalendarComponent } from '@fullcalendar/angular';
import itLocale from '@fullcalendar/core/locales/it';
import interactionPlugin from '@fullcalendar/interaction';

interface iDay {
  dayLabel: string,
  dayMs: number
}
@Component({
  selector: 'app-calendar',
  templateUrl: './calendar.component.html',
  styleUrls: ['./calendar.component.scss']
})
export class CalendarComponent implements OnInit {

  @ViewChild('calendar') calendarComponent: FullCalendarComponent;

  public itLocale = itLocale;
  public calendarPlugins = [interactionPlugin, dayGridPlugin];
  public calendarEvents = [];
  public options = {
    header: {
      left: 'prev title',
      right: 'next'
    }
  }

  constructor() { }

  ngOnInit(): void {

  }

  handleDateClick(event) {
    document.querySelectorAll("td[data-date='"   event.dateStr   "']").forEach((nodeElement: HTMLElement) => {
      if(nodeElement.classList.value.includes('fc-day-top')){
        nodeElement.classList.add('selected-day');
      }
    })
  }

}