javascript - 加载新的 Turbo Frame 时如何执行 JavaScript

标签 javascript ruby-on-rails hotwire-rails turbo turbo-frames

我在我的 Rails 应用程序中使用 Turbo Frames,并且在每个页面上都有

<turbo-frame id="messagesFrame" src="/chats">
</turbo-frame>
这可以很好地加载,并且当单击链接时会按预期替换框架。在这个框架中,我设置了 overflow-y: scroll ,在页面上创建一个可滚动的框架。每次在框架中加载新页面时,我都希望它滚动到底部。我怎样才能做到这一点?理想情况下使用原生 JavaScript。

最佳答案

您可以通过多种方式做到这一点。
Turbo 应该触发 turbo:before-fetch-requestturbo:before-fetch-responsedocument当延迟加载帧或触发帧重新加载的链接时。
您可以执行以下操作:

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))
  }
})
资料来源:
涡轮事件 => https://turbo.hotwired.dev/reference/events
Frame.complete 和 Frame.loaded => https://turbo.hotwired.dev/reference/frames

我建议使用上述方法,因为您指定了 vanilla Javascript。大多数与 Turbo 相关的事情的推荐方法是使用 StimulusJS。
您可以编写一个 Stimulus ( https://stimulus.hotwired.dev/ ) Controller ,将其附加到显示在 TurboFrame 内的正文中的一个元素上,以及在 connect 中。方法,同理。
这样,每当刷新框架内的内容时,Stimulus Controller 就会运行,您不必担心触发事件的顺序。

关于javascript - 加载新的 Turbo Frame 时如何执行 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67315225/

相关文章:

ruby-on-rails - 通过创建和更新操作将 Single Rails 表单管理到其他 Controller

turbolinks - 使用热线广播到多个涡轮流

javascript - 不想提交预填充值文本区域;我对文本区域进行了必需的验证,但也没有被捕获

javascript - 如何使用 Perl 和 Javascript 创建和访问 json 文件

javascript - Webpack 生成具有相同 contenthash 的不同 block

ruby-on-rails - 使用 nginx 通过子域服务路由

javascript - 在 Rails 中创建一个在后端重置的倒数计时器

stimulusjs - 具有具有相同 Controller 的嵌套元素

ruby-on-rails - rails 7 : Loading all Stimulus controllers

javascript - 是否可以重置通话历史记录,但保留行为?