动态加载后未调用 JavaScript 函数

标签 javascript spring thymeleaf

我有一个奇怪的问题,希望有人可以帮助解决。

问题

当我通过 .load() 函数动态加载 html 时,如果加载片段中 html 的任何方面尝试访问原始 HTML 页面中的 javascript 查询函数,则它不起作用。示例代码如下:

HTML 主页面 (main.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head lang="en">
<!--javascript load functions etc... standard header stuff -->
</head>
<body>
<div id="dynamic_section_fragment"></div>
<a href="javascript:" onclick="loadFragment()">Load Fragment</a>

    <script type="text/javascript">


        // <![CDATA[
function loadFragment() {
            $("#dynamic_section_fragment").load("/api/fragment/");
        };

$(".checkvalue").click(function () {
            $.getJSON("/api/checkvalue", {term: $(this).attr('value')}, function () {
                console.info("submitted for checking");
            })
        });
        // ]]>
    </script>

</body>
</html>

片段文件(fragment.html)

<!DOCTYPE html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head lang="en">

    </head>
    <body>
<div th:fragment="check_value">
    <br/>
Check the value in the attribute field   
<br/>
<a href="javascript:" th:attr="value='123'" class="checkvalue">Check This<a/> 
</div>
    </body>
    </html>

SPRING MVC Controller 方法

@RequestMapping("/api/checkvalue")
public String getFragment(Model model) {
return "fragment :: check_value";
}

所以行动的概要:

-Main.html 页面加载

-用户单击“加载片段”超链接

-Javascript动态地将相关片段加载到div中

-用户单击“检查此”超链接,没有任何反应

有什么我遗漏的或者我需要注意的吗?

就好像 Thymeleaf 已经预先注册了所有可能的事件场景并且不允许任何其他场景。 我能够让它工作的唯一方法是在片段中注入(inject)“checkvalue”javascript,正如你所同意的,这是一种糟糕的做法。

感谢帮助。

最佳答案

您正在使用 checkvalue 类将单击事件监听器应用于所有现有对象。

$(".checkvalue").click(function () 

您更希望做的(使点击事件动态地应用于所有现有的和任何新添加的)是在 dom 树中的父级上设置一个事件(现有的和所有将要添加的父级)待补充)。
就您而言,body 标记可能是安全的选择。

以下内容就足够了:

$('body').on('click', '.checkvalue', function() { ...

简单来说,代码将在 body 元素而不是 .checkvalue 对象上应用监听器,并且每当对象具有 .checkvalue 时> 单击类(无论是动态加载还是静态加载),都会触发该事件。

<小时/>

编辑
我还建议您在 javascript 中,在确定 jquery 已加载之前不要使用它。
jquery 库有一种方法可以为您解决此问题,方法是使用 $( document ).ready() 功能:

$( document ).ready(function() {
  // All jquery dependant code here.
});

关于动态加载后未调用 JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29673748/

相关文章:

Javascript循环不等待Firebase完成上传多个文件

javascript - 如何检查字符串在JavaScript中的任何点是否包含字符

javascript - 显示加载叠加层,直到加载 $http get 图像

java - 在 Spring 中使用验证将 ZonedDateTime 字段限制为毫秒时间的 3 位数字

spring - Thymeleaf - 单击按钮调用 http 删除方法

html - 如何使用 thymeleaf 在 div 中使用 if 语句?

spring - 结合 :each with templating element using Thymeleaf

javascript - 未使用 .toLocaleString 获取所有货币符号

java - 使用 eureka 和 Ribbon 的测试服务

java - 这个 Spring 教程中的错误做法?