Я использую Fullcalendar v4 и пытаюсь подключить кнопки браузера вперед / назад к навигации по FC.У меня возникла проблема при попытке использования кнопок браузера после нажатия кнопки prev
FC на дисплее месяца.
Я попытался создать скрипку и использовать codepen, но я думаю, что оболочки, используемые этими сайтами, мешают некоторым аспектамсобытий кнопки браузера.Я установил сокращенный образец в ЗДЕСЬ
Пример ожидаемого поведения:
Посетите ссылку выше;нажмите на ссылку Go to calendar
(для тестирования мне нужна стартовая страница, чтобы проверить работу кнопки «Назад» с «домашней» страницы реального календаря).
Посмотрите на верхнюю часть справа отпанель инструментов календаря и нажмите месяц, а затем по очереди кнопки дня.
Используйте кнопки браузера назад / вперед для перемещения между представлениями.
Anпример некорректного поведения:
Перейти к представлению месяца.Посмотрите вверху слева от панели инструментов календаря и нажмите кнопку «<» <code>prev.Это вернет дисплей на один месяц назад.
Попробуйте использовать кнопку «Назад» браузера, чтобы вернуться к начальному виду месяца, и ничего не происходит.
Я управляю состоянием календаря через window.history.state
.Мне кажется, что при первом посещении страницы значение window.history.state
равно нулю.Одна из самых первых вещей, которая происходит после инициализации и рендеринга Fullcalendar, заключается в том, что отображается исходное представление и вызывается datesRender
.
Я проверяю, является ли window.history.state
нулевым, и если да, я используюwindow.history.replaceState
для установки состояния просмотра по умолчанию.Затем я использую replaceState
или pushState
для добавления или обновления информации о состоянии.
'datesRender': function (info) {
if (window.history.state === null) {
//
// seems like when a page is first visited the history
// for that page has a null state. Add a default state.
const tempState = {
'view': info.view.type,
'range': {
'start': moment(info.view.activeStart)
.local().format(dateFormatHuman),
'end': moment(info.view.activeEnd)
.local().format(dateFormatHuman)
},
'url': window.location.href,
'comment': "INIT"
};
window.history.replaceState(
tempState,
"INIT",
window.location.href
);
} else {
//
// if state.comment = POP then we are here after a
// BACK button press. Change the comment to "dateRender".
if (window.history.state.comment === "POP") {
const tempState = window.history.state;
tempState.comment = "datesRender";
window.history.replaceState(
tempState,
"From pop",
window.location.href
);
} else {
//
// there is current state and we need to change views.
// add new state for the new view
const state = {
'view': info.view.type,
'range': {
'start': moment(info.view.activeStart)
.local().format(dateFormatHuman),
'end': moment(info.view.activeEnd)
.local().format(dateFormatHuman)
},
'url': window.location.href,
'comment': "datesRender"
};
window.history.pushState(
state,
"datesRender",
window.location.href
);
}
}
},
При нажатии кнопок вперед / назад в браузере запускается событие window.onpopstate
.Когда обработчик запущен, «current» window.history.state
- это состояние после кнопки браузера POP.Я обновляю комментарий состояния, чтобы пометить его как событие кнопки браузера, затем вызываю метод Fullcalendar changeView
, чтобы обновить представление.
function handleStatePopEvent(event) {
try {
const tempState = window.history.state;
tempState.comment = "POP";
window.history.replaceState(
tempState,
tempState.comment,
tempState.url
);
calendar.changeView(
window.history.state.view,
window.history.state.range
);
} catch (e) {
throw `handleStatePopEvent: ${e.message}`;
}
}
Проблема заключается в том, что после нажатия кнопки Fullcalendar prev
что-то щелкаетизменения во внутреннем состоянии ФК - хотя я не могу этого доказатьwindow.history.state
правильно изменяется в datesRender
.При нажатии кнопки «Назад» в браузере срабатывает событие window.onpopstate
, и диапазоны просмотра и даты верны, чтобы вернуться к просмотру предыдущего месяца, но вызов changeView
ничего не отображает.
Я использовал свой браузерСредства разработки отладчика и прошли весь путь через changeView
в этом случае.Ничто драматическое не выскакивает на меня, кроме как в какой-то момент появляется флаг, который, кажется, говорит: «Нужно ли что-нибудь визуализировать?»установлено на false
.
Я что-то не так делаю?