ndex.html
<html>
<head>
<title>js</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div>
我是顯示內(nèi)容
</div>
<div>
<input type="file" name="myFile" class="file_class"/>
<button class="ajax_btn">原生ajax</button>
</div>
</body>
<script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript" src="./index.js">
</script>
</html>
index.js
$(function(){
$(".ajax_btn").click(function(){
var xhr = new XMLHttpRequest();
xhr.open("post","http://localhost",true);
xhr.onreadystatechange = function(e)
{
if(xhr.readyState == 4 && xhr.status == 200)
{
console.log(JSON.parse(xhr.responseText));
}
}
var file = $(".file_class")[0].files[0];
var fd = new FormData();
fd.append("info","zlx");
fd.append("fileInfo",file);
xhr.send(fd);
});
})
index.php
<?php
if($_FILES['fileInfo'])
{
move_uploaded_file($_FILES['fileInfo']['tmp_name'],"./".$_FILES['fileInfo']['name']);
}
$result = array("code"=>200,"msg"=>$_POST["info"]."上傳了圖片");
print_r(json_encode($result));
?>
注:
ajax使用FormData對(duì)象時(shí),不用再去設(shè)置表頭Content-type,FormData可以用js來(lái)實(shí)現(xiàn)form表單上傳的對(duì)象,通過(guò)append來(lái)添加傳遞給后臺(tái)的值,如,我們這里傳了info,值為 zlx,fileInfo,值為一個(gè)文件對(duì)象,$(".file_class")[0].files[0]用來(lái)獲取file對(duì)象,就是我們選擇的文件,需要在PHP中使用$_FILES['fileInfo']來(lái)獲取。
通過(guò)瀏覽器調(diào)試模式看到請(qǐng)求頭,
這個(gè)fileInfo是一個(gè)二進(jìn)制的文件。
通過(guò)move_uploaded_file來(lái)把上傳來(lái)的緩存文件放到我們希望保存的地方。
.Net core中,當(dāng)使用ajax提交json數(shù)據(jù)時(shí),因?yàn)樵?net core中是屬于強(qiáng)類(lèi)型數(shù)據(jù),所以在數(shù)據(jù)接受時(shí)可以使用[FromBody]標(biāo)簽采用自定義注冊(cè)的方法,其代碼參考如下(以下代碼原文出處:https://www.cnblogs.com/showmu/p/6264950.html):
public class JObjectModelBinderProvider : IModelBinderProvider
{
public IModelBinder GetBinder(ModelBinderProviderContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
if (context.Metadata.ModelType == (typeof(JObject)))
{
return new JObjectModelBinder(context.Metadata.ModelType);
}
return null;
}
}
public class JObjectModelBinder : IModelBinder
{
public JObjectModelBinder(Type type)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
}
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null) throw new ArgumentNullException("bindingContext");
ValueProviderResult result = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
try
{
JObject obj = new JObject();
if (bindingContext.ModelType == typeof(JObject))
{
foreach (var item in bindingContext.ActionContext.HttpContext.Request.Form)
{
obj.Add(new JProperty(item.Key.ToString(), item.Value.ToString()));
}
if ((obj.Count == 0))
{
bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, bindingContext.ModelMetadata.ModelBindingMessageProvider.ValueMustNotBeNullAccessor(result.ToString()));
return Task.CompletedTask;
}
bindingContext.Result = (ModelBindingResult.Success(obj));
return Task.CompletedTask;
}
return Task.CompletedTask;
}
catch (Exception exception)
{
if (!(exception is FormatException) && (exception.InnerException != null))
{
exception = ExceptionDispatchInfo.Capture(exception.InnerException).SourceException;
}
bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, exception, bindingContext.ModelMetadata);
return Task.CompletedTask;
}
}
}
在start.cs中configure添加注冊(cè)
services.AddMvc(options =>
{
options.ModelBinderProviders.Insert(0, new JObjectModelBinderProvider());//加入JobjectModelBinderProvider綁定
});
在后臺(tái)接受是如下
[HttpPost]
public stringLogin([FromBody]JObject data)
{
return "";
}
前端傳輸數(shù)據(jù)如下:
$.post({
data: {
username: username, password: pwd
},
dataType: "text",
url: "/Home/LogOn",
success: function (result) {}});
今,Web 用戶期望得到單頁(yè)應(yīng)用(SPA)提供的流暢、動(dòng)態(tài)的體驗(yàn)。然而,創(chuàng)建 SPA 往往需要使用復(fù)雜的框架,如 React 和 Vue,學(xué)習(xí)和使用起來(lái)可能比較困難。這就是htmx的用武之地:一種通過(guò)直接在HTML中利用Ajax和CSS過(guò)渡效果等功能,為構(gòu)建動(dòng)態(tài) Web 體驗(yàn)帶來(lái)新思路的工具。下面就來(lái)看看 htmx 是什么,它有什么強(qiáng)大之處!
HTMX 允許在不使用 JavaScript 的情況下添加現(xiàn)代瀏覽器功能。可以直接在 HTML 中使用屬性來(lái)訪問(wèn) AJAX、CSS 過(guò)渡效果、WebSockets 和服務(wù)器推送等功能,以便以超文本的簡(jiǎn)單性和強(qiáng)大性構(gòu)建現(xiàn)代用戶界面。
HTMX的設(shè)計(jì)理念是通過(guò)解除HTML在前端開(kāi)發(fā)中的一些限制,使其成為一個(gè)更加完整和強(qiáng)大的超文本工具。通常情況下,在傳統(tǒng)的Web開(kāi)發(fā)中,只有<a>和<form>標(biāo)簽可以發(fā)起HTTP請(qǐng)求,只有點(diǎn)擊和提交事件可以觸發(fā)這些請(qǐng)求,只有GET和POST方法可用,并且只能替換整個(gè)屏幕內(nèi)容。而HTMX打破了這些限制,允許使用額外的HTML屬性來(lái)實(shí)現(xiàn)更多的功能,而不需要編寫(xiě)大量的JavaScript代碼。例如,在HTML中使用特定的屬性即可實(shí)現(xiàn)進(jìn)度條、懶加載、無(wú)限滾動(dòng)、內(nèi)聯(lián)驗(yàn)證等特性。
與其他前端框架(如Vue.js和React)不同,HTMX的工作方式是:當(dāng)向服務(wù)器發(fā)送請(qǐng)求時(shí),服務(wù)器返回完整的HTML響應(yīng),并更新頁(yè)面中的相應(yīng)部分,而不是以JSON格式返回?cái)?shù)據(jù)。這使得HTMX可以與任何服務(wù)器端技術(shù)進(jìn)行集成,因?yàn)閼?yīng)用的邏輯和處理都發(fā)生在后端。這種方式簡(jiǎn)化了前端開(kāi)發(fā)并減少了對(duì)JavaScript的依賴(lài)。
可以通過(guò)如下方式使用npm安裝HTMX:
npm install htmx.org
HTMX提供了一組屬性,可以直接從 HTM L中進(jìn)行AJAX請(qǐng)求:
這些屬性都接受一個(gè) URL 作為參數(shù),用于發(fā)送AJAX請(qǐng)求。因此,每當(dāng)觸發(fā)元素時(shí),它會(huì)向指定的URL發(fā)送指定類(lèi)型的請(qǐng)求。來(lái)看下面的例子:
<button hx-get="/api/resource">加載數(shù)據(jù)</button>
在上面的例子中,按鈕元素被賦予了hx-get屬性。一旦點(diǎn)擊該按鈕,就會(huì)向/api/resource URL發(fā)送一個(gè)GET請(qǐng)求。
那當(dāng)從服務(wù)器返回?cái)?shù)據(jù)時(shí)會(huì)發(fā)生什么呢?默認(rèn)情況下,htmx 會(huì)將這個(gè)響應(yīng)直接注入到發(fā)起請(qǐng)求的元素中,也就是示例中的按鈕元素。然而,htmx 并不局限于這種行為,它提供了將響應(yīng)數(shù)據(jù)指定為不同元素的目標(biāo)的能力,接下來(lái)將深入探討這個(gè)功能。
htmx根據(jù)特定元素上發(fā)生的特定事件來(lái)觸發(fā)Ajax請(qǐng)求:
下面來(lái)看一個(gè)例子:
<label>關(guān)鍵詞:
<input
type="text"
placeholder="輸入關(guān)鍵詞"
hx-get="https://v2.jokeapi.dev/joke/Any?format=txt&safe-mode"
hx-target="#joke-container"
name="contains"
/>
</label>
<p id="joke-container">笑話內(nèi)容</p>
為了觸發(fā)搜索,需要激活change事件。對(duì)于<input>元素而言,當(dāng)元素失去焦點(diǎn)且其值已被改變時(shí)就會(huì)觸發(fā)change事件。因此,當(dāng)在文本框中輸入一些內(nèi)容,然后點(diǎn)擊頁(yè)面上其他地方,一個(gè)笑話就會(huì)出現(xiàn)在<p>元素中。簡(jiǎn)而言之,在輸入關(guān)鍵詞后,光標(biāo)離開(kāi)輸入框,笑話就會(huì)自動(dòng)顯示出來(lái)。
這很不錯(cuò),但通常用戶希望在輸入時(shí)就看到搜索結(jié)果更新,也就是說(shuō),當(dāng)用戶在輸入框中輸入內(nèi)容時(shí),將自動(dòng)觸發(fā)Ajax請(qǐng)求,并在后臺(tái)獲取最新的搜索結(jié)果,并將其更新到頁(yè)面上相應(yīng)的位置。因此,用戶不需要手動(dòng)點(diǎn)擊其他地方以觸發(fā)搜索,而是實(shí)時(shí)地在輸入的同時(shí)獲得更新的搜索結(jié)果。為了實(shí)現(xiàn)這一點(diǎn),可以給<input>元素添加一個(gè)htmx trigger屬性:
<input
...
hx-trigger="keyup"
/>
現(xiàn)在結(jié)果會(huì)立即更新。但同時(shí)引入了一個(gè)新的問(wèn)題:現(xiàn)在會(huì)在每次輸入時(shí)都進(jìn)行一次API調(diào)用。為了避免這個(gè)問(wèn)題,可以使用修飾符來(lái)改變觸發(fā)器的行為。htmx 提供了以下修飾符選項(xiàng):
在這種情況下,delay是我們想要的修飾符:
<input
...
hx-trigger="keyup delay:500ms"
/>
現(xiàn)在,當(dāng)在輸入框中輸入內(nèi)容時(shí)(嘗試輸入一個(gè)較長(zhǎng)的詞,比如"developer"),只有在暫停或完成輸入時(shí)才會(huì)觸發(fā)請(qǐng)求。
<label>關(guān)鍵字:
<input
type="text"
placeholder="E輸入關(guān)鍵字d"
hx-get="https://v2.jokeapi.dev/joke/Any?format=txt&safe-mode"
hx-target="#joke-container"
name="contains"
hx-trigger="keyup delay:500ms"
/>
</label>
<p id="joke-container">笑話內(nèi)容</p>
正如你所見(jiàn),這種做法只需要幾行客戶端代碼就可以實(shí)現(xiàn)一個(gè)搜索框模式。
在Web開(kāi)發(fā)中,當(dāng)用戶執(zhí)行某個(gè)操作并且該操作可能需要一段時(shí)間才能完成(如進(jìn)行網(wǎng)絡(luò)請(qǐng)求),我們通常需要給用戶提供反饋。其中一種常見(jiàn)的反饋方式是使用請(qǐng)求指示器,以可視化的方式提示用戶該操作正在進(jìn)行中。
htmx集成了對(duì)請(qǐng)求指示器的支持,讓我們能夠向用戶提供這種反饋。它使用hx-indicator類(lèi)來(lái)指定一個(gè)元素作為請(qǐng)求指示器。具有此類(lèi)的任何元素的默認(rèn)不透明度為 0,使其在DOM中不可見(jiàn)但存在。
當(dāng)htmx發(fā)起一個(gè)Ajax請(qǐng)求時(shí),它會(huì)在觸發(fā)元素上應(yīng)用htmx-request類(lèi)。htmx-request類(lèi)會(huì)導(dǎo)致該元素或任何具有htmx-indicator類(lèi)的子元素的不透明度變?yōu)?1。
例如,下面是一個(gè)具有加載旋轉(zhuǎn)圖標(biāo)作為其請(qǐng)求指示器的元素:
<button hx-get="/api/data">
加載數(shù)據(jù)
<img class="htmx-indicator" src="/spinner.gif" alt="Loading">
</button>
當(dāng)具有hx-get屬性的按鈕被點(diǎn)擊并且請(qǐng)求開(kāi)始時(shí),按鈕會(huì)自動(dòng)添加一個(gè)htmx-request類(lèi)。這個(gè)類(lèi)可以讓請(qǐng)求指示器(例如加載旋轉(zhuǎn)圖標(biāo))在按鈕上顯示,當(dāng)請(qǐng)求完成后,這個(gè)類(lèi)會(huì)被移除,請(qǐng)求指示器也會(huì)停止顯示。還可以使用htmx-indicator屬性來(lái)指示接收htmx-request類(lèi)的元素(顯示請(qǐng)求指示器的元素)。
<label>關(guān)鍵字:
<input
type="text"
placeholder="輸入關(guān)鍵字"
hx-get="https://v2.jokeapi.dev/joke/Any?format=txt&safe-mode"
hx-target="#joke-container"
name="contains"
hx-trigger="keyup delay:500ms"
hx-indicator=".loader"
/>
</label>
<span class="loader htmx-indicator"></span>
<p id="joke-container">笑話內(nèi)容</p>
在某些情況下,我們可能需要在發(fā)送請(qǐng)求的元素之外更新其他元素。htmx 允許我們hx-target屬性來(lái)指定Ajax響應(yīng)應(yīng)該更新的特定元素。可以通過(guò)在hx-target屬性中設(shè)置一個(gè)CSS選擇器來(lái)指定要更新的元素。例如有一個(gè)用于發(fā)布新評(píng)論的表單,希望將新評(píng)論添加到評(píng)論列表中,而不是更新表單本身。
<button
hx-get="https://v2.jokeapi.dev/joke/Any?format=txt&safe-mode&type=single"
hx-target="#joke-container"
>
Hello htmx!
</button>
當(dāng)用戶點(diǎn)擊按鈕并發(fā)起請(qǐng)求時(shí),獲取到的響應(yīng)數(shù)據(jù)將會(huì)更新顯示在頁(yè)面上具有"joke-container"這個(gè)ID的元素內(nèi)部,而不是替換按鈕本身的內(nèi)容。這樣可以實(shí)現(xiàn)在特定位置更新內(nèi)容,而不影響其他部分的效果。
htmx提供了一些擴(kuò)展的CSS選擇器,用于更高級(jí)的元素選擇和內(nèi)容加載:
通過(guò)使用這些關(guān)鍵字,我們可以更靈活地選擇要更新的元素。例如,在之前的例子中,我們可以使用 hx-target="next p" 來(lái)指定更新目標(biāo)元素,而不是使用具體的 ID。這樣可以簡(jiǎn)化代碼,并且使得更新更加動(dòng)態(tài)和通用。
默認(rèn)情況下,htmx會(huì)用Ajax響應(yīng)替換目標(biāo)元素的內(nèi)容。但是,如果希望追加新內(nèi)容而不是替換它,那就可以使用hx-swap屬性。該屬性允許指定新內(nèi)容應(yīng)該如何插入目標(biāo)元素中。可能的取值包括outerHTML、innerHTML、beforebegin、afterbegin、beforeend和afterend。例如,使用hx-swap="beforeend"會(huì)將新內(nèi)容追加到目標(biāo)元素的末尾,這對(duì)于新評(píng)論的場(chǎng)景非常合適。
可以使用CSS過(guò)渡效果來(lái)使元素在不使用JavaScript的情況下平滑地改變樣式。要實(shí)現(xiàn)這一點(diǎn),需要在多個(gè)HTTP請(qǐng)求之間保持相同的元素 ID。這樣,當(dāng) htmx 接收到新的內(nèi)容并更新元素時(shí),它將能夠應(yīng)用CSS過(guò)渡效果,使樣式的改變過(guò)渡得更加平滑。
<button hx-get="/new-content" hx-target="#content">
請(qǐng)求數(shù)據(jù)
</button>
<div id="content">
初始內(nèi)容
</div>
在htmx發(fā)起到/new-content的Ajax請(qǐng)求后,服務(wù)器返回以下內(nèi)容:
<div id="content" class="fadeIn">
新內(nèi)容
</div>
盡管內(nèi)容發(fā)生了變化,但是<div>元素保持了相同的ID。然而,新增的內(nèi)容中添加了一個(gè)fadeIn類(lèi)。通過(guò)為新內(nèi)容添加fadeIn類(lèi),我們可以定義相應(yīng)的CSS規(guī)則,例如opacity和transition屬性,來(lái)實(shí)現(xiàn)淡入效果。這樣,當(dāng)htmx接收到新的內(nèi)容并更新元素時(shí),CSS過(guò)渡效果將被觸發(fā),使元素的變化過(guò)渡得更加平滑。
下面來(lái)創(chuàng)建一個(gè) CSS 過(guò)渡效果,使元素從初始狀態(tài)平滑過(guò)渡到新?tīng)顟B(tài):
.fadeIn {
animation: fadeIn 2.5s;
}
@keyframes fadeIn {
0% {opacity: 0;}
100% {opacity: 1;}
}
當(dāng)htmx加載新內(nèi)容時(shí),它會(huì)觸發(fā)CSS過(guò)渡效果,從而創(chuàng)建一個(gè)流暢的視覺(jué)過(guò)渡到更新后的狀態(tài)。
全新的View Transitions API提供了一種在DOM元素的不同狀態(tài)之間進(jìn)行動(dòng)畫(huà)轉(zhuǎn)換的方式。與涉及元素CSS屬性變化的CSS過(guò)渡不同,視圖過(guò)渡是用于動(dòng)畫(huà)元素內(nèi)容的變化。
View Transitions API 是一個(gè)正在積極開(kāi)發(fā)中的全新實(shí)驗(yàn)性功能。該API已經(jīng)在Chrome 111+中實(shí)現(xiàn),并預(yù)計(jì)將來(lái)會(huì)有更多的瀏覽器支持它。htmx提供了與View Transitions API一起使用的接口,并在不支持該API的瀏覽器中回退到非過(guò)渡機(jī)制。
在 htmx 中,View Transitions API 的使用方法如下:
下面是一個(gè)“彈跳”過(guò)渡效果的示例,其中舊內(nèi)容彈出,新內(nèi)容彈入:
@keyframes bounce-in {
0% { transform: scale(0.1); opacity: 0; }
60% { transform: scale(1.2); opacity: 1; }
100% { transform: scale(1); }
}
@keyframes bounce-out {
0% { transform: scale(1); }
45% { transform: scale(1.3); opacity: 1; }
100% { transform: scale(0); opacity: 0; }
}
.bounce-it {
view-transition-name: bounce-it;
}
::view-transition-old(bounce-it) {
animation: 600ms cubic-bezier(0.4, 0, 0.2, 1) both bounce-out;
}
::view-transition-new(bounce-it) {
animation: 600ms cubic-bezier(0.4, 0, 0.2, 1) both bounce-in;
}
在使用htmx時(shí),可以在hx-swap屬性中添加transition:true選項(xiàng)來(lái)啟用過(guò)渡效果。然后,可以將bounce-it類(lèi)添加到想要進(jìn)行動(dòng)畫(huà)處理的內(nèi)容上。
<button
hx-get="https://v2.jokeapi.dev/joke/Any?format=txt&safe-mode"
hx-swap="innerHTML transition:true"
hx-target="#joke-container"
>
加載新動(dòng)畫(huà)
</button>
<div id="joke-container" class="bounce-it">
<p>初始動(dòng)畫(huà)內(nèi)容</p>
</div>
在這個(gè)例子中,當(dāng)<div>的內(nèi)容被更新時(shí),舊內(nèi)容會(huì)以彈跳的方式退出視圖,而新內(nèi)容會(huì)以彈跳的方式進(jìn)入視圖,從而產(chǎn)生一種生動(dòng)的視覺(jué)效果。
htmx 與 HTML5 Validation API 可以良好的集成,在表單提交時(shí),htmx會(huì)利用瀏覽器原生的驗(yàn)證功能進(jìn)行表單驗(yàn)證。
例如,當(dāng)用戶點(diǎn)擊提交按鈕時(shí),只有當(dāng)輸入字段包含有效的電子郵件地址時(shí),才會(huì)向/contact發(fā)送POST請(qǐng)求。
<form hx-post="/contact">
<label>Email:
<input type="email" name="email" required>
</label>
<button>提交</button>
</form>
值得注意的是,htmx在驗(yàn)證過(guò)程中會(huì)觸發(fā)一系列事件,可以利用這些事件來(lái)添加自己的驗(yàn)證邏輯和錯(cuò)誤處理方法。例如,如果想要在JavaScript代碼中實(shí)現(xiàn)郵箱檢查,可以這樣做:
form hx-post="/contact">
<label>Email:
<input type="email" name="email" required>
</label>
<button>提交</button>
</form>
<script>
const emailInput = document.querySelector('input[type="email"]');
emailInput.addEventListener('htmx:validation:validate', function() {
const pattern = /@gmail\.com$/i;
if (!pattern.test(this.value)) {
this.setCustomValidity('只接受谷歌郵箱!');
this.reportValidity();
}
});
</script>
這里使用了htmx的htmx:validation:validate事件,該事件在調(diào)用元素的checkValidity()方法之前被觸發(fā)。
現(xiàn)在,當(dāng)嘗試提交帶有非gmail.com地址的表單時(shí),將會(huì)看到一樣的錯(cuò)誤提示。
除了上述提到的功能外,htmx 還具有很多其他功能,旨在增強(qiáng)HTML的能力,并為處理Web應(yīng)用中的動(dòng)態(tài)內(nèi)容更新提供簡(jiǎn)單而強(qiáng)大的方式。它的功能不僅限于已經(jīng)介紹的內(nèi)容,還包括一些設(shè)計(jì)用于創(chuàng)建更具交互性和響應(yīng)性的網(wǎng)站的功能,而無(wú)需使用復(fù)雜的JavaScript框架。
擴(kuò)展是htmx工具中功能強(qiáng)大的工具。這些可定制的JavaScript組件使我們能夠根據(jù)我們的特定需求進(jìn)一步增強(qiáng)和定制庫(kù)的行為。擴(kuò)展包括在請(qǐng)求中啟用JSON編碼、操作HTML元素上類(lèi)的添加和刪除、調(diào)試元素、支持客戶端模板處理等。有了這些,我們就可以將htmx自定義為更精細(xì)的粒度。
htmx的“Boosting”功能允許我們將標(biāo)準(zhǔn)的HTML錨點(diǎn)(即鏈接)和表單轉(zhuǎn)換為Ajax請(qǐng)求。在傳統(tǒng)的Web開(kāi)發(fā)中,點(diǎn)擊鏈接或提交表單通常會(huì)導(dǎo)致整個(gè)頁(yè)面刷新。而通過(guò)使用htmx的"boosting"功能,這些鏈接和表單將通過(guò)Ajax請(qǐng)求來(lái)處理,只更新需要更新的部分內(nèi)容,而不需要刷新整個(gè)頁(yè)面。這使得網(wǎng)站的加載速度更快,并提供了更流暢的用戶體驗(yàn)。類(lèi)似的技術(shù)在過(guò)去被稱(chēng)為pjax,現(xiàn)在在htmx中也可以實(shí)現(xiàn)類(lèi)似的效果。
<div hx-boost="true">
<a href="/blog">Blog</a>
</div>
這個(gè) div 中的錨點(diǎn)標(biāo)簽會(huì)發(fā)出一個(gè) Ajax GET 請(qǐng)求到 /blog,并將 HTML 響應(yīng)替換到 <body> 標(biāo)簽中。
通過(guò)利用這個(gè)功能,可以為用戶創(chuàng)建更流暢的導(dǎo)航和表單提交體驗(yàn),使我們的 Web 應(yīng)用更像單頁(yè)面應(yīng)用(SPA)。
htmx 內(nèi)置了對(duì)瀏覽器歷史記錄的支持,可以與標(biāo)準(zhǔn)的瀏覽器歷史API對(duì)接。這樣,可以將URL添加到瀏覽器導(dǎo)航欄,并將頁(yè)面當(dāng)前狀態(tài)存儲(chǔ)在瀏覽器的歷史記錄中,確保"返回"按鈕按照用戶的期望進(jìn)行操作。這樣一來(lái),我們就可以創(chuàng)建出類(lèi)似于SPA的網(wǎng)頁(yè),能夠在不重新加載整個(gè)頁(yè)面的情況下維護(hù)狀態(tài)和處理導(dǎo)航。
htmx 可以很容易的與其他庫(kù)進(jìn)行集成。它可以無(wú)縫地與許多第三方庫(kù)進(jìn)行整合,利用它們的事件來(lái)觸發(fā)請(qǐng)求。
htmx是一個(gè)多功能、輕量級(jí)且易于使用的工具。它成功地將HTML的簡(jiǎn)潔性與通常與復(fù)雜JavaScript庫(kù)相關(guān)的動(dòng)態(tài)功能相結(jié)合,為創(chuàng)建交互式網(wǎng)絡(luò)應(yīng)用程序提供了一個(gè)全新的選擇。
然而,它并不是適用于所有情況的解決方案。對(duì)于更復(fù)雜的應(yīng)用,我們可能仍然需要使用JavaScript框架。但是,如果目標(biāo)是創(chuàng)建一個(gè)快速、交互性強(qiáng)且用戶友好的Web應(yīng)用,而又不增加太多復(fù)雜性,那么 htmx 絕對(duì)是值得考慮的。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。