我在我的Rails应用中使用Turbo Frames,在每个页面上
<turbo-frame id="messagesFrame" src="/chats">
</turbo-frame>
网页可以正常加载,当链接被点击时,框架被替换。我已经在这个框架中设置了overflow-y: scroll
,在页面上创建了一个可滚动的框架。每次加载新页面到框架中,我希望它能滚动到底部。如何实现?最好使用纯JavaScript。
我在我的Rails应用中使用Turbo Frames,在每个页面上
<turbo-frame id="messagesFrame" src="/chats">
</turbo-frame>
网页可以正常加载,当链接被点击时,框架被替换。我已经在这个框架中设置了overflow-y: scroll
,在页面上创建了一个可滚动的框架。每次加载新页面到框架中,我希望它能滚动到底部。如何实现?最好使用纯JavaScript。
有几种方法可以做到这一点。
当惰性加载框架或触发框架重新加载的链接时,Turbo 应该在 document
上触发 turbo:before-fetch-request
和 turbo:before-fetch-response
事件。
你可以尝试类似于以下的操作:
document.addEventListener("turbo:before-fetch-response", function (e) {
let frame = document.getElementById("messagesFrame");
if (frame.complete) {
frame.scrollTo(0, frame.scrollHeight)
} else {
frame.loaded.then(() => frame.scrollTo(0, frame.scrollHeight))
}
})
来源: Turbo 事件 => https://turbo.hotwired.dev/reference/events
Frame.complete 和 Frame.loaded => https://turbo.hotwired.dev/reference/frames
我建议使用上述方法,因为您指定了普通的JavaScript。对于大多数与Turbo相关的事情,建议使用StimulusJS。
您可以编写一个Stimulus (https://stimulus.hotwired.dev/) 控制器,将其附加到显示在TurboFrame内部的body元素上,并在connect
方法中执行相同的操作。
这样,无论帧内的内容何时刷新,Stimulus控制器都将运行,您不必担心事件被触发的顺序。
if
语句,因为控制器仅在帧完成加载时运行 :) - SubXaero