Так как time.js является частью всплывающего окна, код в этом файле (а также интервал, который вы установили с помощью setInterval
) остановится, как только всплывающее окноокно закрыто.
Для того, чтобы эта работа работала, вам нужно переместить интервал на фоновую страницу, контекст фоновой страницы можно настроить на сохранение до тех пор, пока открыт браузер.
Кстати, код, который в настоящее время находится в background.js , ничего не делает, и вам нужно что-то подобное, только если вы хотите использовать действия страницы
Вот мой подход для этого:
background.js
let timerID;
let timerTime;
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
if (request.cmd === 'START_TIMER') {
timerTime = new Date(request.when);
timerID = setTimeout(() => {
// the time is app, alert the user.
}, timerTime.getTime() - Date.now());
} else if (request.cmd === 'GET_TIME') {
sendResponse({ time: timerTime });
}
});
timer.js
// Call this when the pop-up is shown
chrome.runtime.sendMessage({ cmd: 'GET_TIME' }, response => {
if (response.time) {
const time = new Date(response.time);
startTimer(time)
}
});
functions startTimer(time) {
if (time.getTime() > Date.now()) {
setInterval(() => {
// display the remaining time
}, 1000)
}
}
function startTime(time) {
chrome.runtime.sendMessage({ cmd: 'START_TIMER', when: time });
startTimer(time);
}
По сути, когда пользователь запускает таймер, вы отправляете фоновый скрипт с будущей датой завершения таймера.Затем в фоновом скрипте вы устанавливаете тайм-аут, который будет запускаться на эту дату, чтобы вы могли что-то делать (воспроизводить звук), даже если всплывающее окно закрыто.Затем, когда всплывающее окно снова открывается, вы отправляете сообщение фоновому сценарию, и оно отправляет обратно дату для таймера, который был ранее установлен.
Это можно улучшить, сейчас это будетработать правильно, пока браузер открыт на всю длину таймера, чтобы он работал, даже если браузер закрыт и открыт заново, вы можете сохранить и восстановить дату таймера из хранилища.