Javascript 函数在动态加载后未被调用
Javascript Function Not Being Called after dynamic loading
我有一个奇怪的问题,希望有人能帮助解决。
问题
当我通过 .load() 函数动态加载 html 时,如果加载片段中 html 的任何方面试图访问原始 [=52] 中的 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 控制器方法
@RequestMapping("/api/checkvalue")
public String getFragment(Model model) {
return "fragment :: check_value";
}
因此 运行 下行动:
-Main.html 页面加载
-用户点击加载片段超链接
-Javascript 将相关片段动态加载到 div
-用户点击检查此超链接,没有任何反应
有什么我遗漏的或需要注意的吗?
就好像 Thymeleaf 已经预先注册了所有可能的事件场景,不允许任何其他场景。
我能够让它工作的唯一方法是在片段中注入 "checkvalue" javascript,你可以同意这是一种糟糕的做事方式。
感谢帮助。
您正在将点击事件侦听器应用于具有 checkvalue
class 的所有现有对象。
$(".checkvalue").click(function ()
您更愿意做的(使点击事件动态地应用于所有现有的和任何新添加的)是在 dom 树中的父级上设置一个事件(父级都是现有的以及将添加的所有内容)。
在您的情况下,body
标签可能是安全的选择。
以下应该足够了:
$('body').on('click', '.checkvalue', function() { ...
简化后,代码将在 body
元素而不是 .checkvalue
对象上应用侦听器,每当单击具有 .checkvalue
class 的对象时(无论是动态加载还是静态加载),该事件都会触发。
编辑
我还建议您,在您的 javascript 中,在您确定它已加载之前不要使用 jquery。
jquery 库有一种方法可以通过使用 $( document ).ready()
函数为您修复此问题:
$( document ).ready(function() {
// All jquery dependant code here.
});
我有一个奇怪的问题,希望有人能帮助解决。
问题
当我通过 .load() 函数动态加载 html 时,如果加载片段中 html 的任何方面试图访问原始 [=52] 中的 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 控制器方法
@RequestMapping("/api/checkvalue")
public String getFragment(Model model) {
return "fragment :: check_value";
}
因此 运行 下行动:
-Main.html 页面加载
-用户点击加载片段超链接
-Javascript 将相关片段动态加载到 div
-用户点击检查此超链接,没有任何反应
有什么我遗漏的或需要注意的吗?
就好像 Thymeleaf 已经预先注册了所有可能的事件场景,不允许任何其他场景。 我能够让它工作的唯一方法是在片段中注入 "checkvalue" javascript,你可以同意这是一种糟糕的做事方式。
感谢帮助。
您正在将点击事件侦听器应用于具有 checkvalue
class 的所有现有对象。
$(".checkvalue").click(function ()
您更愿意做的(使点击事件动态地应用于所有现有的和任何新添加的)是在 dom 树中的父级上设置一个事件(父级都是现有的以及将添加的所有内容)。
在您的情况下,body
标签可能是安全的选择。
以下应该足够了:
$('body').on('click', '.checkvalue', function() { ...
简化后,代码将在 body
元素而不是 .checkvalue
对象上应用侦听器,每当单击具有 .checkvalue
class 的对象时(无论是动态加载还是静态加载),该事件都会触发。
编辑
我还建议您,在您的 javascript 中,在您确定它已加载之前不要使用 jquery。
jquery 库有一种方法可以通过使用 $( document ).ready()
函数为您修复此问题:
$( document ).ready(function() {
// All jquery dependant code here.
});