如何在加载新的 Turbo Frame 时执行 JavaScript
How can I execute JavaScript when a new Turbo Frame is loaded
我在我的 Rails 应用程序中使用 Turbo Frames,并且在每个页面上都有
<turbo-frame id="messagesFrame" src="/chats">
</turbo-frame>
这可以正常加载,单击 link 时会按预期替换框架。在此框架中,我设置了 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 内部的主体中的元素,并在 connect
方法中执行相同的操作。
这样,无论何时刷新框架内的内容,Stimulus 控制器都会 运行,您不必担心触发事件的顺序。
我在我的 Rails 应用程序中使用 Turbo Frames,并且在每个页面上都有
<turbo-frame id="messagesFrame" src="/chats">
</turbo-frame>
这可以正常加载,单击 link 时会按预期替换框架。在此框架中,我设置了 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 内部的主体中的元素,并在 connect
方法中执行相同的操作。
这样,无论何时刷新框架内的内容,Stimulus 控制器都会 运行,您不必担心触发事件的顺序。