Исправлена прокрутка к якорю во встроенном содержимом - #625
Open
villanella wants to merge 1 commit into
Open
villanella wants to merge 1 commit into
villanella wants to merge 1 commit into
Conversation
scrollBehavior always scrolled to the top and ignored to.hash, so a URL with an anchor opened at the top of the page. The content loads after the route is resolved, so the element often does not exist yet. Now the element is looked up by id every 200 ms, for up to 30 s. It is scrolled into view again while its position keeps changing, because content above it can still grow. The promise resolves with the current scroll position, not with false. With false, vue-router scrolls back to the position saved before the navigation, and the page moved away from the anchor. A newer navigation to an anchor stops the previous polling.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Проблема
Переход по прямой ссылке с якорем, например
.../entities/<сущность>/blank?<параметры>#some.anchor.idи клик по ссылке на якорь на этой же странице, открывают страницу с начала, а не нужный раздел, если якорь находится во встроенном содержимом. Только после нескольких обновлений страницы переход срабатывает. Встроенное содержимое - это вложенные документы (@document/...) и презентации сущностей (@entity/...) - например, сущности-требования, подключенные в ADR. Якорь может быть написан вручную в тексте или создан mustache-шаблоном, это не важно.Причина
scrollBehaviorвсегда вызывалwindow.scrollTo(0, 0)и не учитывалto.hash.scrollBehaviorвернуть сfalse, vue-router 3 прокручивает страницу к позиции, сохранённой при старте навигации. При загрузке страница навигируется несколько раз, и устаревшие позиции затирают правильную прокрутку.Шаги воспроизведения
#some.anchor.id.#some.anchor.id.Что изменено
Изменён только
src/frontend/router/index.js:document.getElementById. Это безопасно для id с точками, в отличие от CSS-селектора.MutationObserverне использован: при частой перерисовке DOM он подвешивал страницу.false.Тест
anchor-demo.zip - в данном тестовом архиве корневой манифест
root.yamlлокально подключаетdocs.yaml. В проекте три документа: главный документ встраивает два вложенных, в каждом есть якорь. Якорь второго документа находится ниже первого экрана.Запуск: скопировать папку
anchor-demoвpublic/workspace/репозитория DocHub и выполнитьДля режима с backend заменить
serveнаbackend. Подробности вREADME.mdархива.Проверка:
/docs/demo.main#demo.part2.anchorв новой вкладке./docs/demo.mainи кликнуть по ссылкеpart 2вверху страницы.Результат (Chrome, окно 1280x800,
npm run serve):scrollY0, якорь на 2116)scrollY2116scrollY2116С правкой в режиме
npm run backendрезультат тот же. Ссылка на первый якорь ведёт себя так же (якорь на 306). Числа зависят от размера окна.Дополнительно проверен переход с другой страницы: клик по ссылке
/docs/demo.main#demo.part2.anchorили/entities/docs/blank?dh-doc-id=demo.main#demo.part2.anchorс другой страницы. До правки страница оставалась в начале, после правки прокручивается к якорю.Также проверено на большом проекте с реальными данными (закрытый репозиторий) в режимах
npm run serveиnpm run backend:scrollYсовпадает с положением якоря при холодной загрузке (переход по URL с якорем) и при переходе с одного якоря на другой, а открытие без якоря показывает начало страницы.Связанное
Коммит 6184a83 из v3.15.1, связанный с issue #539, сохраняет якорь в адресе ссылки при клике, но не обеспечивает прокрутку к якорю во встроенном содержимом. Эта правка добавляет такую прокрутку, в том числе при переходе с другой страницы.