This is a viewer only at the moment see the article on how this works.
To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk
This is a preview from the server running through my markdig pipeline
На попередньому дописі я показав вам, як створити download down з використанням альпійських.js і HTMX Потім я показав, як ми можемо увімкнути попит на Cross-Site Forgery, використовуючи AntiforgeryRequestToken
у ядрі ASP. NET з JavaScript використання HTMX для реалізації кешу лунки Donut. Одним з визначних номерів було те, як він завантажував сторінки.
Проблема в тому, що я використовував HTMX AJAX для завантаження сторінки, як тільки ви вибрали результат зі спадної сторінки. Это только KINDA работала.
selectResult(result) {
htmx.ajax('get', result.url, {
target: '#contentcontainer', // The container to update
swap: 'innerHTML', // Replace the content inside the target
}).then(function() {
history.pushState(null, '', result.url);
window.scrollTo({
top: 0,
behavior: 'smooth'
});
});
Проблема полягала в тому, що, тоді як ця дія завантажить праву сторінку і оновить показану адресу URL новою, вона зіпсувала задню кнопку. Так як сторінка не була правильно завантажена в історію.
Як і з моїм Остання стаття на зворотній кнопці Шенаніганс. Это было то, что я хотел исправить.
Як і раніше, розв'язанням було дозволити HTMX працювати з цим безпосередньо. Для цього я оновив свій шаблон для результатів пошуку.
_typeahead.cshtml
<div x-data="window.mostlylucid.typeahead()" class="relative" id="searchelement" x-on:click.outside="results = []">
@Html.AntiForgeryToken()
<label class="input input-sm bg-neutral-500 bg-opacity-10 input-bordered flex items-center gap-2">
<input
type="text"
x-model="query"
x-on:input.debounce.200ms="search"
x-on:keydown.down.prevent="moveDown"
x-on:keydown.up.prevent="moveUp"
x-on:keydown.enter.prevent="selectHighlighted"
placeholder="Search..."
class="border-0 grow input-sm text-black dark:text-white bg-transparent w-full"/>
<i class="bx bx-search"></i>
</label>
<!-- Dropdown -->
<ul x-show="results.length > 0"
id="searchresults"
class="absolute z-100 my-2 w-full bg-white dark:bg-custom-dark-bg border border-1 text-black dark:text-white border-neutral-600 rounded-lg shadow-lg">
<template x-for="(result, index) in results" :key="result.slug">
<li :class="{
'dark:bg-blue-dark bg-blue-light': index === highlightedIndex,
'dark:hover:bg-blue-dark hover:bg-blue-light': true
}"
class="cursor-pointer text-sm p-2 m-2">
<!-- These are the key changes.-->
<a
x-on:click="selectResult(index)"
@* :href="result.url" *@
:hx-get="result.url"
hx-target="#contentcontainer"
hx-swap="innerHTML"
hx-push-url="true"
x-text="result.title"
>
</a>
<-- End of changes -->
</li>
</template>
</ul>
</div>
Тепер ви побачите, що я генерую правильне HTMX посилається в цьому блокі коду. Дозвольте нам використати правильну поведінку HTMX.
typeahead.js
Щоб увімкнути цей параметр у коді JavaScript мого сервера, я додала такі рядки до мого способу пошуку (показано нижче). The this.$nextTick
є альпійською конструкцією.js, яка затримує це, поки Альпи не завершать обробку шаблону, який я показував вище.
Потім я використовую htmx.process()
у елементі пошуку, який забезпечить роботу атрибутів HTMX, як і очікувалося.
.then(data => {
this.results = data;
this.highlightedIndex = -1; // Reset index on new search
this.$nextTick(() => {
htmx.process(document.getElementById('searchresults'));
});
})
search() {
if (this.query.length < 2) {
this.results = [];
this.highlightedIndex = -1;
return;
}
let token = document.querySelector('#searchelement input[name="__RequestVerificationToken"]').value;
console.log(token);
fetch(`/api/search/${encodeURIComponent(this.query)}`, { // Fixed the backtick and closing bracket
method: 'GET', // or 'POST' depending on your needs
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': token // Attach the AntiForgery token in the headers
}
})
.then(response => {
if(response.ok){
return response.json();
}
return Promise.reject(response);
})
.then(data => {
this.results = data;
this.highlightedIndex = -1; // Reset index on new search
this.$nextTick(() => {
htmx.process(document.getElementById('searchresults'));
});
})
.catch((response) => {
console.log(response.status, response.statusText);
if(response.status === 400)
{
console.log('Bad request, reloading page to try to fix it.');
window.location.reload();
}
response.json().then((json) => {
console.log(json);
})
console.log("Error fetching search results");
});
}
selectHighlighted() {
if (this.highlightedIndex >= 0 && this.highlightedIndex < this.results.length) {
this.selectResult(this.highlightedIndex);
}
},
selectResult(selectedIndex) {
let links = document.querySelectorAll('#searchresults a');
links[selectedIndex].click();
this.$nextTick(() => {
this.results = []; // Clear the results
this.highlightedIndex = -1; // Reset the highlighted index
this.query = ''; // Clear the query
});
}
Цей пункт можна обрати за допомогою наведення вказівника миші на посилання у результатах пошуку з наступним клацанням лівою кнопкою миші.
<a
x-on:click="selectResult(index)"
:hx-get="result.url"
hx-target="#contentcontainer"
hx-swap="innerHTML"
hx-push-url="true"
x-text="result.title"
>
</a>
Після цього програма завантажить сторінку і оновить адресу URL належним чином.
У мене також є код у батьківській скриньці, який надає вам змогу використовувати клавіші зі стрілочками і вводити їх.
<label class="input input-sm bg-neutral-500 bg-opacity-10 input-bordered flex items-center gap-2">
<input
type="text"
x-model="query"
x-on:input.debounce.200ms="search"
x-on:keydown.down.prevent="moveDown"
x-on:keydown.up.prevent="moveUp"
x-on:keydown.enter.prevent="selectHighlighted"
placeholder="Search..."
class="border-0 grow input-sm text-black dark:text-white bg-transparent w-full"/>
<i class="bx bx-search"></i>
</label>
Ви побачите, що в цьому коді є всі необхідні коди для того, щоб ви могли просто натиснути Enter і перейти до вибраної сторінки.
Просте оновлення статті до існуючого спадного списку пошуку, щоб збільшити досвід користувача під час пошуку. Знову ж таки, це MINIMAL користувач, перед яким постають зміни, але просто покращує досвід користувача. Як веб- розробником, це ваш головний проект (beyoon recursed :).