Проблема в том, что location.reload
пытается полностью заменить страницу перезагруженной версией, но если браузер не может подключиться к серверу, страница не будет загружена, и любые пользовательские скрипты для этой страницы не будут работать,потому что нет страницы, на которой они могли бы работать.
Обходной путь - использовать сетевой запрос Javascript для извлечения текста новой страницы, а затем заменить существующее содержимое новым содержимым на Javascript - еслиОтвет - ошибка 503 (или какая-либо другая ошибка), вы можете просто проигнорировать ее и повторить попытку.Это гарантирует, что вы всегда будете оставаться на одной и той же (загруженной) странице, поэтому сценарий пользователя будет продолжать работать неопределенно долго, даже если ответы иногда не получаются.
Вот пример сценария пользователя, который обновляет домашнюю страницу StackOverflow каждые 10 секундс новым HTML.Вы можете использовать DOMParser
для преобразования текста ответа в документ, по которому можно перемещаться с помощью querySelector
, среди прочего:
// ==UserScript==
// @name Update SO
// @namespace CertainPerformance
// @version 1
// @match https://stackoverflow.com/
// @grant none
// ==/UserScript==
const container = document.querySelector('.container');
function getNewData() {
console.log('getting new data');
fetch('https://stackoverflow.com',
{
// The following is needed to include your existing cookies with the request, which may be needed:
credentials: "same-origin"
})
.then((resp) => {
// If there are errors, such as a 503 error, proceed directly to the `finally` to try again:
if (!resp.ok) return;
return resp.text();
})
.then((text) => {
const doc = new DOMParser().parseFromString(text, 'text/html');
container.innerHTML = doc.querySelector('.container').innerHTML;
})
.finally(() => {
// Whether there was an error or not, try to refresh again in a few seconds:
setTimeout(getNewData, 10000);
});
}
setTimeout(getNewData, 10000);