Dispatch page change events

This commit is contained in:
Server 2026-08-15 13:17:33 +00:00
parent 485e7e4fba
commit 7163d1e4fe
4 changed files with 32 additions and 3 deletions

View file

@ -244,6 +244,18 @@ document.addEventListener("on_update_available", (event) => {
});
```
Непосредственно перед заменой содержимого при переходе между страницами отправляется всплывающее событие `on_page_change`. В `page` находится полная запись целевой страницы из manifest, а в `previousPage` — предыдущая страница или `null` при первом рендере:
```javascript
document.addEventListener("on_page_change", (event) => {
const { page, previousPage, number, title, index } = event.detail;
console.log(`${previousPage?.number ?? "—"} → ${number}: ${title}`, {
page,
index,
});
});
```
Код из `custom_js` считается доверенным и выполняется в контексте страницы. Изменение системного или пользовательского CSS/JS меняет `revision`, поэтому обновлённый runtime сохраняется в IndexedDB и применяется после перезагрузки клиента.
Версия библиотеки, которой был скомпилирован физический `index.html`, доступна пользовательскому JavaScript в глобальной строковой переменной:

View file

@ -1,3 +1,3 @@
"""Single source of truth for the SharedDocsLib package version."""
__version__ = "0.4.3"
__version__ = "0.4.4"

View file

@ -358,6 +358,17 @@
}
function applyPage(page, index) {
const previousPage = manifest.pages.find((candidate) => candidate.number === currentNumber) || null;
document.dispatchEvent(new CustomEvent("on_page_change", {
bubbles: true,
detail: {
page,
previousPage,
number: page.number,
title: page.title,
index,
},
}));
currentNumber = page.number;
if (routeNumber() !== page.number) history.replaceState(null, "", `#/page/${encodeURIComponent(page.number)}`);
document.title = `${page.title} · ${manifest.title}`;

View file

@ -97,7 +97,7 @@ def test_all_endpoints_and_self_contained_build(tmp_path):
assert html_response.status_code == 200
assert "http://127.0.0.1:9000/manifest.json" in html
assert "http://127.0.0.1:9000/version" in html
assert 'globalThis.COMPILED_FROM_VERSION = "0.4.3";' in html
assert 'globalThis.COMPILED_FROM_VERSION = "0.4.4";' in html
assert ".content { --custom-test: yes; }" in html
assert r'document.body.dataset.customTest = \"yes\";' in html
assert 'id="docslib-loading"' in html
@ -116,6 +116,12 @@ def test_all_endpoints_and_self_contained_build(tmp_path):
assert "cached," in system_js
assert "applied: false" in system_js
assert 'new CustomEvent("on_update_available"' in system_js
assert 'new CustomEvent("on_page_change"' in system_js
assert "page," in system_js
assert "previousPage," in system_js
assert "number: page.number" in system_js
assert "title: page.title" in system_js
assert system_js.index('new CustomEvent("on_page_change"') < system_js.index("currentNumber = page.number")
assert "currentRevision: lastSyncedRevision" in system_js
assert 'config.versionUrl || siblingResourceUrl(config.manifestUrl, "version")' in system_js
assert 'target.searchParams.set(' in system_js
@ -242,7 +248,7 @@ def test_all_endpoints_and_self_contained_build(tmp_path):
def test_build_writes_static_bundle(tmp_path):
assert __version__ == "0.4.3"
assert __version__ == "0.4.4"
@Page("1", "Static page")
def static_page():