Thymeleaf - 如何交互和重新加载 Javascript?

Posted

技术标签:

【中文标题】Thymeleaf - 如何交互和重新加载 Javascript?【英文标题】:Thymeleaf - How to interact and reload Javascript? 【发布时间】:2021-02-05 09:21:21 【问题描述】:

在没有页面刷新的情况下,我正在调用一个 ajax 请求,该请求会到达控制器并带来一个 Thymeleaf 片段,

单击按钮时,我请求使用 ajax 的控制器获取片段。每次我点击按钮时,都会调用相同的片段,但使用不同的<p> 标签innerhtml

<div id="express" th:fragment="Display">
<p id="app">Include details about your goals</p>
</div>

js第一次效果很好,拆分成数组并添加span标签,但是动态替换新内容的问题。 当&lt;p&gt; 标记内具有不同innerHTML 的新片段出现在javascript 方面时,问题出在javascript 方面,Javascript 不起作用。我需要刷新页面重新运行我不想刷新的js。

这里是js

let comp = document.getElementById("app").innerHTML; 
let struct = comp.split(" "); 

document.getElementById("app").innerHTML = struct.reduce((acc, word, index) => 
  return `$acc <span class="word">$word</span>`;
, "");

const handleClick = () => 
axios.post(url)
   .then(response => 
       console.log(response.data);
           $("#express").replaceWith($recievedHTML);
   )
   .catch(error => 
       console.log(error);
   );

【问题讨论】:

我不确定为什么这个问题的投票率如此之高,没有什么特别的,与“spring-boot”或“thymeleaf”无关,只是普通的 JS (jQuery) 问题。您需要将 JS 函数与主页一起加载。当 ajax 完成并且你替换了你的内容时,它将在 DOM 中可用,所以只需在 replaceWith 之后调用你需要的函数。 你能举个小例子吗?我想要的是当一个新片段被以前的片段替换时,我的 js 应该重新加载 好的,给我几分钟我会做一些例子,但我需要把它当作答案(评论部分没有足够的空间)。这个答案不会回答您的直接问题“如何重新加载 js?”。正如我所说,您根本不需要这样做,而是应该在主页中提供 jS 函数,您只需要调用它即可。 【参考方案1】:

假设您有您的 HTML 页面,其中包含您的 JS 文件,或者您已将 JS 直接添加到 &lt;script&gt; 标记中。有点像...

<!DOCTYPE HTML>
<html lang="en-US">
<head>
    <script src="/path/lib/jquery/3.5.1/jquery.min-dc5e7f18c8d36ac1d3d4753a87c98d0a.js" type="text/javascript"></script>
    <script src="/path/js/your_file.min-cf4fcae72d4468307341eac1012bb6d8.js" type="text/javascript"></script>
</head>
<body>

    <div id="express" th:fragment="Display">
        <p id="app">Include details about your goals</p>
    </div>

</body>
</html>

此页面的 Javascript 可能看起来像 ...

$(function() 

    function my_load_function() 
        // do your loading procedures here
        // for example I just copied your inline code...
        let comp = document.getElementById("app").innerHTML; 
        let struct = comp.split(" "); 
    
        document.getElementById("app").innerHTML = struct.reduce((acc, word, index) => 
        return `$acc <span class="word">$word</span>`;
        , "");
    
    
    
    function my_do_something_else_function() 
        // dosomething else over here
    
    
    const handleClick = () => 
    axios.post(url)
       .then(response => 
           console.log(response.data);
           // what is '$recievedHTML'? should it be response.data?; 
           // ayway, you said replacement works;
           $("#express").replaceWith($recievedHTML);
           // after this call any function again
           my_load_function();
           my_do_something_else_function();
       )
       .catch(error => 
           console.log(error);
       );
    ;
    
    // call your loading function first time
    my_load_function();

);

我已经在 J​​S 代码的 cmets 中添加了我的补充说明。请注意,我只是直接在SO中写的,甚至没有尝试运行,所以可能有一些错别字。

【讨论】:

好的,非常感谢@Slava Ivanov,让我试试这些步骤

以上是关于Thymeleaf - 如何交互和重新加载 Javascript?的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC:如何在每个 Thymeleaf 页面上重新加载数据库中的登录用户信息?

Netbeans 8 不会重新加载静态 Thymeleaf 文件

thymeleaf 片段渲染后重新加载 javascript

Java 列表项在页面重新加载时重新添加到 thymeleaf 下拉列表中,多次出现

一个 Gradle Thymeleaf 项目在资源更改时重新加载,另一个重新启动

Spring-boot,thymeleaf 加载上传的图片,无需重启应用服务器