1. 概述
在本教程中,我們將調用 JavaScript 函數,並在 Thymeleaf 模板中進行操作。
我們將首先設置我們的依賴項。然後,我們將添加我們的 Spring 控制器和 Thymeleaf 模板。最後,我們將展示根據輸入調用 JavaScript 函數的各種方法。
2. 設置
為了在我們的應用程序中使用 Thymeleaf,讓我們將 Thymeleaf Spring 5 依賴添加到我們的 Maven 配置中:
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>然後,讓我們根據我們的 Student 模型,將其添加到我們的 Spring 控制器中:
@Controller
public class FunctionCallController {
@RequestMapping(value = "/function-call", method = RequestMethod.GET)
public String getExampleHTML(Model model) {
model.addAttribute("totalStudents", StudentUtils.buildStudents().size());
model.addAttribute("student", StudentUtils.buildStudents().get(0));
return "functionCall.html";
}
}最後,我們將在 src/main/webapp/WEB-INF/views 下的 functionCall.html 模板中添加這兩個 JavaScript 函數:
<script th:inline="javascript">
function greetWorld() {
alert("hello world")
}
function salute(name) {
alert("hello: " + name)
}
</script>我們將使用這兩個函數來闡述下一部分中的示例。
如果遇到任何問題,我們始終可以查看如何將 JavaScript 添加到 Thymeleaf。
3. 在 Thymeleaf 中調用 JavaScript 函數
在 Thymeleaf 中,你可以通過 <script> 標籤或通過 JavaScript Interop 機制來調用 JavaScript 函數。
3.1 使用 <script> 標籤
這是最簡單的方法,適用於簡單的 JavaScript 函數調用。
<script type="text/javascript">
function myJavaScriptFunction() {
// JavaScript 代碼
console.log("Hello from JavaScript!");
}
</script>
<div th:unless="${#t:truthy('myJavaScriptFunction')}">
<span th:onclick="myJavaScriptFunction()">Click me!</span>
</div>
在這個例子中,myJavaScriptFunction 是一個 JavaScript 函數,它會在點擊 Click me! 鏈接時被調用。 th:unless 確保只有當 myJavaScriptFunction 存在時,才會顯示鏈接。
3.2 使用 JavaScript Interop (Thymeleaf 3.0+)
對於更復雜的場景,例如需要傳遞參數或在 JavaScript 中訪問 Thymeleaf 變量,可以使用 JavaScript Interop。 這需要配置 JavaScript Interop 才能正常工作。 (此處省略詳細配置步驟,請參考 Thymeleaf 官方文檔)
<script type="text/javascript">
// JavaScript 代碼
function myJavaScriptFunction(name) {
console.log("Hello, " + name + " from JavaScript!");
}
</script>
<div th:unless="${#t:truthy('myJavaScriptFunction')}">
<span th:onclick="myJavaScriptFunction('Thymeleaf')">Click me!</span>
</div>
在這個例子中,myJavaScriptFunction 接受一個參數 name,並在點擊鏈接時被調用,並將 "Thymeleaf" 作為參數傳遞給 JavaScript 函數。
3.1. 使用無輸入參數的函數
以下是如何調用我們上面定義的 greetWorld 函數:
<button th:onclick="greetWorld()">using no variable</button>它適用於任何自定義或內置的 JavaScript 函數。
3.2. 使用具有靜態輸入的函數
如果 JavaScript 函數中不需要任何動態變量,則調用方式如下:
<button th:onclick="'alert(\'static variable used here.\');'">using static variable</button>
這段文本無需轉義單引號,也不需要使用 SpringEL。
3.3. 使用帶有動態輸入的函數
以下是四種使用變量調用 JavaScript 函數的方法。
第一種方法是使用內聯變量:
<button th:onclick="'alert(\'There are exactly ' + ${totalStudents} + ' students\');'">using inline dynamic variable</button>
另一個選項是調用 javascript:function:
<button th:onclick="'javascript:alert(\'There are exactly ' + ${totalStudents} + ' students\');'">using javascript:function</button>第三種方法是使用數據屬性:
<button th:data-name="${student.name}" th:onclick="salute(this.getAttribute('data-name'))">using data attribute</button>
此方法在調用 JavaScript 事件 時非常有用,例如 onClick 和 onLoad。
最後,我們可以使用雙方括號語法調用我們的 salute 函數:
<button th:onclick="salute([[${student.name}]])">using double brackets</button>用雙方括號括起來的表達式被認為是Thymeleaf中的內聯表達式。因此,我們可以使用在th:text屬性中也有效的任何類型的表達式。
3.4. 使用 屬性與 Thymeleaf 3
在使用 Thymeleaf 3 時,一個常見的場景是將 Thymeleaf 變量直接嵌入到 屬性中,以動態地將來自服務器端模型的數據傳遞到 JavaScript 函數。 我們可以使用 Thymeleaf 的 或直接在 屬性中實現這一點。
例如,讓我們將一個動態變量傳遞到 JavaScript 函數 :
<button th:attr="onclick='salute([[${student.name}]])'">Click to greet student</button>
在此示例中, 動態生成了 屬性。表達式 由 Thymeleaf 進行評估,並將結果插入到 函數中。
4. 從 Spring 模型中設置 JavaScript 變量
此外,我們可以通過啓用 JavaScript 內聯模式來使用 Spring 模型初始化 JavaScript 變量。要啓用 JavaScript 內聯模式,可以將 <em th:inline="javascript"></strong> 屬性添加到 <em script></script> 標籤中。
我們已經在項目設置中聲明瞭帶有內聯模式屬性的 <em script></script> 標籤。現在,讓我們將 totalStudent 值分配給一個 JavaScript 變量:
<script th:inline="javascript">
// ....
let total = [[${totalStudents}]]
function totalstudent() {
alert("total students: " + total)
}
</script>在上述代碼中,我們聲明瞭一個 JavaScript 變量 total,並將其賦值為控制器中設置的 totalStudents 的值。我們通過聲明一個 Thymeleaf 表達式,使用控制器類中的模型名稱 [[${totalStudents}]] 來實現這一目的。該表達式被評估,結果被賦值給 total。
我們可以在表達式中使用單個方括號,例如 [${totalStudents}]]。但是,應謹慎使用,因為它可能會導致意外行為,尤其是在 String 類型的情況下。
此外,為了改進靜態加載(在不使用服務器的情況下加載腳本)的效果,我們可以添加註釋並設置默認值:
let total = /*[[${totalStudents}]]*/ '50';此處,表達式位於註釋中,默認值在註釋後設置。直到 Thymeleaf 表達式被評估,默認值將被忽略。評估後,默認值將被替換。這可以防止靜態加載時腳本中的錯誤。
特別地,在 Thymeleaf 版本 3.0 之前,為了防止與內聯表達式解析錯誤,需要將腳本包含在 CDATA 部分中。
/*<![CDATA[*/
let total = /*[[${totalStudents}]]*/ 'default value';
//...
/*]]>*/上述代碼確保與舊版本的 Thymeleaf 兼容 XML 解析器。
5. 結論
在本文中,我們學習瞭如何在 Thymeleaf 模板中調用 JavaScript 函數。我們首先設置了我們的依賴項。然後,我們構建了控制器和模板。最後,我們探索瞭如何在 Thymeleaf 中調用任何 JavaScript 函數。