Bootstrap Turbo Frames无法从标头识别Javascript

drnojrws  于 2022-12-07  发布在  Bootstrap
关注(0)|答案(1)|浏览(108)

我正在构建我的模板,并有了初步的步骤。我在Rails上7.0.2.4,turbo-rails 1.1.1,Bootstrap 5。
在我的布局模板中,我有以下内容:

= javascript_include_tag "application", data:{turbo:{track: "reload"}}, defer: true

哪些链接到我的app/javascript/application.js,这里的相关部分是:

import * as bootstrap from "bootstrap"

var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
    return new bootstrap.Tooltip(tooltipTriggerEl)
})

上面的第二部分启用了Bootstrap工具提示。
回到我的模板,我将其分解为三个Turbo帧:

%turbo-frame{id: "main_frame", data:{turbo:{action: "advance"}}}
    .container-fluid
        .row.flex-nowrap
            .col-auto.col-md-3.col-xl-2.px-sm-2.px-0.bg-dark
                %turbo-frame{id: "sidebar", data:{turbo:{action: "advance"}}}
            .col
                %turbo-frame{id: "content", data:{turbo:{action: "advance"}}}
                    = yield

首先是main_frame,它被分为边栏和内容框架。点击边栏中的链接,其中包含日期-turbo-frame:“content”属性,将内容框架与所需内容交换。
现在,在大多数完整内容框架上,该框架的顶部都有一个导航标题,该标题的左右两侧各有一个按钮,中间有文本:

%turbo-frame{id: "content", data:{turbo:{action: "advance"}}}
    .row
        .d-flex
            .p-2
                %a{href: path, data:{turbo:{frame: "content"}, 
                  bs:{toggle: "tooltip", placement: "bottom", 
                    title: "Back"}}, 
                  aria:{label: "Back"}}
                    %i.bi.bi-arrow-left-circle-fill{aria:{hidden: "true"}}
            .flex-grow-1
                // Some Text
            .p-2
                %a{href: new_path, data:{turbo:{frame: "new"}, 
                  bs:{toggle: "tooltip", placement: "bottom", 
                    title: "New"}}, 
                  aria:{label: "New"}}
                    %i.bi.bi-plus{aria:{hidden: "true"}}

当您导航到这个被替换的内容时,工具提示不起作用。但是,当您通过浏览器重新加载整个页面时,工具提示突然起作用了,因为代码在头部。
有没有办法让框架加载必要的Javascript?

mnemlml8

mnemlml81#

基本上与涡轮增压你的JS是添加到头部,而不是修改跨页面加载。
所以当你叫:

var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))

基本上,它会在你的JS被添加到应用程序的时候,在DOM中搜索所请求的DOM节点。如果你的应用程序刷新了一个turbo帧,那么它就不会被播放。请看我最近回复的这个帖子:如何加载页面特定的自定义Javascript函数在Rails 7应用程序与Turbo,ImportMaps和刺激?
如果您希望在加载新内容时刷新工具提示,则必须使用Stimulus,将代码放入Stimulus控制器的connect()方法中,并将该控制器附加到可能包含工具提示的应用程序的每个部分。
您还可以将控制器附加到<html>标签并添加一个突变观察器(https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver),如果您不想在应用中的多个位置连接Stimulus控制器。(如果你愿意的话,你也可以在javascript/application.js中添加突变观察者。刺激的目的实际上是为了防止垃圾邮件突变观察者,但如果你有很多工具提示,它仍然是可行的解决方案)

相关问题