Un Dropdown de búsqueda más inteligente con HTMX (Español (Spanish))

Un Dropdown de búsqueda más inteligente con HTMX

Monday, 16 September 2024

//

7 minute read

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

En un anterior post te he mostrado cómo crear una Descargar la búsqueda usando Alpine.js y HTMX entonces mostró cómo podíamos habilitar Cross-Site Request Forgery protección usando el AntiforgeryRequestToken en ASP.NET Core con JavaScript utilizando HTMX para implementar un cache de Donut HoleEl Comité recomienda al Estado Parte que incluya en su próximo informe periódico datos estadísticos desglosados por sexo, edad y origen étnico.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

El problema era que estaba usando HTMX AJAX para hacer la carga de la página solicitada una vez que tuvieras seleccionado el resultado de la page drop down. Esto solo KINDA funcionaba.

  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'
                });
            });

El problema era que mientras esto cargaba la página correcta y actualizaba el URL mostrado con el nuevo, se confundió el botón trasero. Como la página WASNM SK2T realmente cargada en la historia correctamente .

Como con mi el último artículo sobre los Shennanigans del botón trasero Esto era algo que quería reparar.

El Presidente (habla en inglés): De conformidad con el entendimiento alcanzado en las consultas previas del Consejo, consideraré que la Asamblea General desea concluir su examen de este tema del programa.

Como antes la solución era dejar que HTMX maneje esto directamente. Para hacerlo he actualizado mi plantilla que uso para resultados de búsqueda.

_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>

Usted'verá que ahora genera El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad de oportunidades entre los hombres y las mujeres en materia de empleo, incluida la eliminación del trabajo forzoso. HTMX enlaces en este bloque de código. Permite que utilicemos el comportamiento correcto HT MX.

typeahead.js

Para habilitar esto en mi código JavaScript de fondo he agregado lo siguiente a mi método de búsqueda (ver abajo). El this.$nextTick es una construcción Alpine.js que retrasa esto hasta que Alpine haya terminado de procesar la plantilla que he mostrado anteriormenteM SK1

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer. htmx.process() en el elemento de búsqueda que garantizará que los atributos HTMX funcionen como esperado.


.then(data => {
 this.results = data;
this.highlightedIndex = -1; // Reset index on new search
 this.$nextTick(() => {
    htmx.process(document.getElementById('searchresults'));
 });
})
typeahead.js search
   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");
                });
        }
Después de una vez seleccionada una página mantén el código para seleccionar la página, haga clic en el enlace y elimina los resultados M SK1 para cerrar la casilla de búsqueda).
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
            });
        }

Esto se selecciona mediante el click del enlace en los resultados de búsqueda.

 <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>

Que luego cargará la página y actualizará correctamente el URL.

También tengo el código en la casilla principal que le permite utilizar las teclas de flecha y introducir.

    <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>

Usted' verá que esto tiene todo el código necesario para permitirle hacer clic en entrar y navegar a la página seleccionada.

El Comité recomienda al Estado Parte que adopte todas las medidas necesarias para garantizar la igualdad entre los géneros y el empoderamiento de la mujer.

Simplemente un artículo de actualización rápido a la descarga de búsqueda existente para mejorar la experiencia del usuario al usar la búsqueda. De nuevo, este es un usuario MINIMAL que se enfrenta al cambio pero apenas mejora la experiencia de usuario; quienes como desarrollador web son su principal preocupación M SK2aunque se pagan :)).

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.