主頁 > 前端設計 > Thymeleaf基本使用

Thymeleaf基本使用

2021-04-02 11:18:36 前端設計

Thymeleaf簡介

Spring官方支持的服務的渲染模板中,并不包含jsp,但是支持一些模板引擎技術,目前官方比較流行的有:Thymeleaf,Freemarker,Mustache…

Thymeleaf官方網站:https://www.thymeleaf.org/index.html
在這里插入圖片描述

Thymeleaf是用來開發Web和獨立環境專案的現代服務器端Java模板引擎,既適用于 web 環境,也適用于獨立環境,比較適合當前的人員分工問題,其能夠處理HTML、XML、JavaScript、CSS 甚至純文本,提供了一種優雅且高度可維護的模板創建方法,可以直接在瀏覽器中正確顯示,也可以作為靜態原型方便開發團隊協作,

Thymeleaf特點:

  • 動靜結合: Thymeleaf 在有網路和無網路的環境下皆可運行,即它可以讓美工在瀏覽器查看頁面的靜態效果,也可以讓程式員在服務器查看帶資料的動態頁面效果,
    Thymeleaf支持 html 原型,然后在 html 標簽里增加額外的屬性來達到模板+資料的展示方式,瀏覽器解釋 html 時會忽略未定義的標簽屬性,所以 thymeleaf 的模板可以靜態地運行;當有資料回傳到頁面時,Thymeleaf 標簽會動態地替換掉靜態內容,使頁面動態顯示,
  • 開箱即用: Thymeleaf提供標準和spring標準兩種方言,可以直接套用模板實作JSTL、 OGNL運算式效果,避免每天套模板、改jstl、改標簽的困擾,同時開發人員也可以擴展和創建自定義的方言,
  • 多方言支持: Thymeleaf 提供spring標準方言和一個與 SpringMVC 完美集成的可選模塊,可以快速的實作表單系結、屬性編輯器、國際化等功能,
  • 與SpringBoot完美整合,SpringBoot提供了Thymeleaf的默認配置,并且為Thymeleaf設定了視圖決議器,我們可以像操作jsp一樣來操作Thymeleaf,代碼幾乎沒有任何區別,就是在模板語法上有區別,

環境準備

使用Spring Initializr快速創建一個工程:
在這里插入圖片描述
在這里插入圖片描述

勾選web和Thymeleaf的依賴:
在這里插入圖片描述

專案結構:

在這里插入圖片描述

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ly</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>thymeleaf</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Thymeleaf默認會開啟頁面快取,提高頁面并發能力,但會導致我們修改頁面不會立即被展現,因此我們關閉快取,

# 關閉Thymeleaf的快取
spring:
  thymeleaf:
    cache:
      false

另外,修改完畢頁面,需要使用快捷鍵:Ctrl + Shift + F9來重繪工程,
在這里插入圖片描述

快速入門

我們準備一個controller,控制視圖跳轉:

@Controller
public class HelloController {

    @GetMapping("hello")
    public String show1(Model model){
        model.addAttribute("msg", "Hello, Thymeleaf!");
        return "index";
    }
}

新建一個html模板:

語法說明:

Thymeleaf通過${}來獲取model中的變數,注意這不是el運算式,而是ognl運算式,但是語法非常像,不過區別在于,我們的運算式寫在一個名為:th:text的標簽屬性中,這個叫做指令

<!DOCTYPE html>
<!--把html 的名稱空間,改成:xmlns:th="http://www.thymeleaf.org" 會有語法提示-->
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
</head>
<body>
	<h1 th:text="${msg}">大家好</h1>
</body>
</html>

啟動專案,訪問頁面:

在這里插入圖片描述
動靜結合:

Thymeleaf崇尚自然模板,意思就是模板是純正的html代碼,脫離模板引擎,在純靜態環境也可以直接運行,現在如果我們直接在html中撰寫 ${}這樣的運算式,顯然在靜態環境下就會出錯,這不符合Thymeleaf的理念,

Thymeleaf中所有的運算式都需要寫在指令中,指令是HTML5中的自定義屬性,在Thymeleaf中所有指令都是以th:開頭,因為運算式${user.name}是寫在自定義屬性中,因此在靜態環境下,運算式的內容會被當做是普通字串,瀏覽器會自動忽略這些指令,這樣就不會報錯了!

th常用標簽

標簽作用樣例
th:id替換id<input th:id="${user.id}"/>
th:text文本替換<p text:="${user.name}">name</p>
th:utext支持html的文本替換<p utext:="${htmlcontent}">content</p>
th:object替換物件<div th:object="${user}"></div>
th:value屬性賦值<input th:value="${user.name}" >
th:with變數賦值運算<div th:with="isEven=${user.age}%2==0"></div>
th:style設定樣式th:style="'display:' + @{(${sitrue} ? 'none' : 'inline-block')} + ''"
th:src替換資源<script type="text/javascript" th:src="@{index.js}"></script>
th:onclick點擊事件th:onclick="'getCollect()'"
th:href替換超鏈接<a th:href="@{index.html}">url</a>
th:each迭代<tr th:each="student:${user}" >
th:if判斷條件<a th:if="${userId == collect.userId}" >
th:unless和th:if判斷相反<a th:href="@{/login}" th:unless=${session.user != null}>Login</a>
th:switch多路選擇,配合th:case 使用<div th:switch="${user.role}">
th:caseth:switch的一個分支<p th:case="'admin'">User is an administrator</p>
th:fragment布局標簽,定義一個代碼片段,方便其它地方參考<div th:fragment="alert">
th:include布局標簽,替換內容到引入的檔案<head th:include="layout :: htmlhead" th:with="title='xx'"></head> />
th:replace布局標簽,替換整個標簽到引入的檔案<div th:replace="fragments/header :: title"></div>
th:selectedselected選擇框 選中th:selected="(${xxx.id} == ${configObj.dd})"
th:inline定義js腳本可以使用變數<script type="text/javascript" th:inline="javascript">
th:action表單提交的地址<form action="subscribe.html" th:action="@{/subscribe}">
th:remove洗掉某個屬性<tr th:remove="all"> all:洗掉所有的孩子、body:洗掉其所有的孩子,不包含標簽、tag:洗掉標簽、all-but-first:洗掉除第一個以外的所有、none:什么也不做

變數

新建一個物體類:User

public class User {
    
    private String name;
    private int age;
	private boolean sex;
    private String role;
    //Get、Set
}

然后在模型中添加資料

@GetMapping("add")
public String addUser(Model model){
    User user = new User();
    user.setAge(21);
    user.setName("<font color='red'>小明</font>");
    
    model.addAttribute("user", user);
    return "user";
}

th:text指令出于安全考慮,會把運算式讀取到的值進行處理,防止html的注入,例如,<p>你好</p>將會被格式化輸出為$lt;p$gt;你好$lt;/p$lt;如果想要不進行格式化輸出,而是要輸出原始內容,則使用th:utext來代替.

示例:我們在頁面獲取user資料:

<h1>
    歡迎您:<span th:utext="${user.name}">---</span>
</h1>

效果:
在這里插入圖片描述

ognl運算式的語法糖:

剛才獲取變數值,我們使用的是經典的物件.屬性名方式,但有些情況下,我們的屬性名可能本身也是變數,怎么辦?ognl提供了類似js的語法方式:

例如:${user.name} 可以寫作${user['name']}

自定義變數

看下面的案例:

<h2>
    <p>Name: <span th:text="${user.name}">Jack</span>.</p>
    <p>Age: <span th:text="${user.age}">21</span>.</p>
</h2>

我們獲取用戶的所有資訊,分別展示,當資料量比較多的時候,頻繁的寫user.就會非常麻煩,因此,Thymeleaf提供了自定義變數來解決:

<h2 th:object="${user}">
    <p>Name: <span th:text="*{name}">Jack</span>.</p>
    <p>Age: <span th:text="*{age}">21</span>.</p>
</h2>
  • 首先在 h2上 用 th:object="${user}"獲取user的值,并且保存
  • 然后,在h2內部的任意元素上,可以通過 *{屬性名}的方式,來獲取user中的屬性,這樣就省去了大量的user.前綴了

方法呼叫

ognl運算式本身就支持方法呼叫,例如:

<h2 th:object="${user}">
    <p>FirstName: <span th:text="*{name.split(' ')[0]}">first</span>.</p>
    <p>LastName: <span th:text="*{name.split(' ')[1]}">last</span>.</p>
</h2>

這里我們呼叫了name(是一個字串)的split方法,

Thymeleaf內置物件

Thymeleaf中提供了一些內置物件,并且在這些物件中提供了一些方法,方便我們來呼叫,獲取這些物件,需要使用#物件名來參考,

環境相關物件:

物件作用
#ctx獲取Thymeleaf自己的Context物件
#requset如果是web程式,可以獲取HttpServletRequest物件
#response如果是web程式,可以獲取HttpServletReponse物件
#session如果是web程式,可以獲取HttpSession物件
#servletContext如果是web程式,可以獲取HttpServletContext物件

Thymeleaf提供的全域物件:

物件作用
#dates處理java.util.date的工具物件
#calendars處理java.util.calendar的工具物件
#numbers用來對數字格式化的方法
#strings用來處理字串的方法
#bools用來判斷布林值的方法
#arrays用來護理陣列的方法
#lists用來處理List集合的方法
#sets用來處理set集合的方法
#maps用來處理map集合的方法
  • 舉例

我們在環境變數中添加日期型別物件

@GetMapping("date")
public String date(Model model){
    model.addAttribute("today", new Date());
    return "date";
}

在頁面中處理

<p>
    今天是: <span th:text="${#dates.format(today,'yyyy-MM-dd')}">2020-03-30</span>
</p>

效果:
在這里插入圖片描述

字面值

有的時候,我們需要在指令中填寫基本型別如:字串、數值、布爾等,并不希望被Thymeleaf決議為變數,這個時候稱為字面值,

字串字面值:

使用一對'參考的內容就是字串字面值了:

<h1 th:text="'${msg}'">大家好</h1>

th:text中的${msg}并不會被認為是變數,而是一個字串:

在這里插入圖片描述

數字字面值:

數字不需要任何特殊語法, 寫的什么就是什么,而且可以直接進行算術運算

<p>今年是 <span th:text="2021">1999</span>.</p>
<p>兩年后將會是 <span th:text="2021 + 2">2001</span>.</p>

在這里插入圖片描述

布爾字面值:

布爾型別的字面值是true或false:

<div th:if="true">
    你填的是true
</div>

這里參考了一個th:if指令,跟vue中的v-if類似

拼接

我們經常會用到普通字串與運算式拼接的情況:

<span th:text="'歡迎您:' + ${user.name} + '!'"></span>

字串字面值需要用'',拼接起來非常麻煩,Thymeleaf對此進行了簡化,使用一對|即可:

<span th:utext="|歡迎您:${user.name}!|"></span>

與上面是完全等效的,這樣就省去了字串字面值的書寫,

在這里插入圖片描述

運算

需要注意:${}內部的是通過OGNL運算式引擎決議的,外部的才是通過Thymeleaf的引擎決議,因此運算子盡量放在${}外進行,例如: <span th:text="${user.age}+2"></span>

算術運算:

支持的算術運算子:+ - * / %

比較運算:

支持的比較運算:>, <, >= , <= ,但是>, <不能直接使用,因為xml會決議為標簽,要使用別名,

注意 == and !=不僅可以比較數值,類似于equals的功能,

可以使用的別名:gt (>), lt (<), ge (>=), le (<=), not (!). Also eq (==), neq/ne (!=).

三元運算:

<span th:text="${user.sex} ? '':''"></span>

三元運算子的三個部分:conditon ? then : else

  • condition:條件
  • then:條件成立的結果
  • else:不成立的結果

其中的每一個部分都可以是Thymeleaf中的任意運算式,有的時候,我們取一個值可能為空,這個時候需要做非空判斷,可以使用 運算式 ?: 默認值簡寫: <span th:text="${user.name} ?: '小紅' "></span>,當前面的運算式值為null時,就會使用后面的默認值, 注意:?:之間沒有空格,

回圈

回圈也是非常頻繁使用的需求,我們使用th:each指令來完成:

假如有用戶的集合:users在Context中,

<tr th:each="user : ${users}"> 
    <td th:text="${user.name}">name</td>
    <td th:text="${user.age}">age</td>
</tr>
  • ${users} 是要遍歷的集合,可以是以下型別:
    • Iterable,實作了Iterable介面的類
    • Enumeration,列舉
    • Interator,迭代器
    • Map,遍歷得到的是Map.Entry
    • Array,陣列及其它一切符合陣列結果的物件

在迭代的同時,我們也可以獲取迭代的狀態物件:

<tr th:each="user,stat : ${users}">
    <td th:text="${user.name}">name</td>
    <td th:text="${user.age}">age</td>
</tr>

stat物件包含以下屬性:

  • index,從0開始的角標
  • count,元素的個數,從1開始
  • size,總元素個數
  • current,當前遍歷到的元素
  • even/odd,回傳是否為奇偶,boolean值
  • first/last,回傳是否為第一或最后,boolean值

邏輯判斷

Thymeleaf中使用th:if 或者 th:unless ,兩者的意思恰好相反,

<span th:if="${user.age} < 24">小鮮肉</span>

如果運算式的值為true,則標簽會渲染到頁面,否則不進行渲染,

以下情況被認定為true:

  • 運算式值為true
  • 運算式值為非0數值
  • 運算式值為非0字符
  • 運算式值為字串,但不是"false","no","off"
  • 運算式不是布爾、字串、數字、字符中的任何一種

其它情況包括null都被認定為false

分支控制switch

這里要使用兩個指令:th:switchth:case

<div th:switch="${user.role}">
  <p th:case="'admin'">用戶是管理員</p>
  <p th:case="'manager'">用戶是經理</p>
  <p th:case="*">用戶是別的玩意</p>
</div>

需要注意的是,一旦有一個th:case成立,其它的則不再判斷,與java中的switch是一樣的,

另外th:case="*"表示默認,放最后,

URL運算式

URL運算式指的是把一個有用的背景關系或回話資訊添加到URL,這個程序經常被叫做URL重寫:@{/user}

URL還可以設定引數: @{/user/find(id=${userId})}
相對路徑: @{../aaa/bbb}

案例:引入css樣式

在static目錄下新建一個app.css檔案
在這里插入圖片描述
設定樣式:

.app{
    height: 200px;
    width: 200px;
    background-color: darkblue;
}

代碼:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>hello</title>
    <link rel="stylesheet" th:href="@{app.css}">
</head>
<body>

    <div class="app"></div>


</body>
</html>

運行結果:
在這里插入圖片描述

JS模板

模板引擎不僅可以渲染html,也可以對JS中的進行預處理,而且為了在純靜態環境下可以運行,其Thymeleaf代碼可以被注釋起來:

<script th:inline="javascript">
    const user = /*[[${user}]]*/ {};
    const age = /*[[${user.age}]]*/ 20;
    console.log(user);
    console.log(age)
</script>

行內文本:[[...]]行內文本的表示方式, 在script標簽中通過th:inline="javascript"來宣告這是要特殊處理的js腳本,th:inline可以在父級標簽內使用,甚至作為body的標簽,

語法結構:

const user = /*[[Thymeleaf運算式]]*/ "靜態環境下的默認值";

因為Thymeleaf被注釋起來,因此即便是靜態環境下, js代碼也不會報錯,而是采用運算式后面跟著的默認值,

看看頁面的原始碼:

在這里插入圖片描述

我們的User物件被直接處理為json格式了,非常方便,

控制臺:

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/271587.html

標籤:其他

上一篇:關于JS中target屬性

下一篇:Vue手動封裝實作一個五星評價得效果

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more