ist meine Antwort basierend auf Dom Christie's answer, mit restaurierten Fokus nach dem Neuladen und die scrollPosition vor dem Rendern abrufen.
Speichern Sie die aktuelle Bildlaufposition und das aktive Feldelement, bevor Sie die neue Seite rendern, und scrollen Sie nach dem Rendern zu dieser gespeicherten Position und stellen Sie den Fokus wieder her. Durch das Zurücksetzen der gespeicherten Bildlaufposition und focusId auf null wird sichergestellt, dass die nachfolgenden Seitenladevorgänge nicht zu einer alten Position/einem alten Fokus verschoben werden.
Beachten Sie, dass den Feldern Ids zugewiesen werden müssen, um den Fokus wiederherzustellen.
var reloadWithTurbolinks = (function() {
var scrollPosition;
var focusId;
function reload() {
Turbolinks.visit(window.location.toString(), {action: 'replace'})
}
document.addEventListener('turbolinks:before-render', function() {
scrollPosition = [window.scrollX, window.scrollY];
focusId = document.activeElement.id;
});
document.addEventListener('turbolinks:load', function() {
if (scrollPosition) {
window.scrollTo.apply(window, scrollPosition);
scrollPosition = null
}
if (focusId) {
document.getElementById(focusId).focus();
focusId = null;
}
});
return reload;
})();
Dann können Sie es so nennen:
setInterval(function() {
reloadWithTurbolinks();
}, 3000);
ich es mit dem auf dem Formular 'Daten-turbolinks-permanenten' Attribute kombiniert. Ich benutze auch <meta name="turbolinks-cache-control" content="no-preview">
.