В HTMX Javascript API отсутствует обмен OOB?

Я использую JS API библиотеки HTMX для добавления содержимого. например:

htmx.ajax('GET', url, {
    target: '#js-product-list',
    swap: 'beforeend', // Adding new stuff to already existing content
})
.then(() => {
...

Теперь предположим, что я хотел бы также обновить компонент фильтра на странице. Возможно ли использовать JS API (без атрибутов hx-*)?

Я пытался

htmx.ajax('GET', url, {
    target: '#js-product-list',
    swap: 'beforeend',
    swapOptions: {
        swapOOB: '#js-filter-wrapper'
    }
})
.then(() => {
...

Детали разметки:

htmx.ajax('GET', url, {
        target: '#js-product-list',
        swap: 'beforeend',
        swapOptions: {
            swapOOB: '#js-filter-wrapper'
        }
    })
<div class = "container position-relative" id = "js-main-content">
    <header>
        <div class = "d-flex justify-content-between mx-1 my-3" id = "js-filter-wrapper">
            Filter content
        </div>
        <div class = "mt-3 ms-1" id = "js-main-title-wrapper">
            <h1>Heading</h1>
        </div>
    </header>
    <main class = "row" id = "js-product-list">
        Product list content
    </main>
</div>

Вот что будет возвращено в ответ:

<div id = "js-filter-wrapper" hx-swap-oob = "#js-filter-wrapper">
    Updated filter that will replace current filter
</div>

<div>
   New products that will be appended to current ones using beforeend selector
</div>

почему вы не хотите использовать (без атрибутов hx-*)?

Derek Roberts 04.08.2024 10:37

Я слышал, что это плохо для SEO из-за неизвестных атрибутов. Кроме того, мне обычно нужно запускать анимацию с использованием библиотеки gsap.com после запроса ajax, который, вероятно, будет работать с использованием событий htmx, но я считаю, что проще использовать JS API.

Askalot 04.08.2024 10:41

вы можете использовать функцию htmx.on для прослушивания события htmx:afterSwap, вызов htmx.ajax обновляет компонент #js-product-list, и после завершения обновления запускается событие htmx:afterSwap. или используйте внеполосные замены (OOB), которые сразу работают с несколькими обновлениями в одном запросе. затем используйте функцию, которая у вас есть

Derek Roberts 04.08.2024 10:42

В свой HTML-код вы можете добавить этот фрагмент кода: <div id = "js-product-list"> <!-- Содержимое списка продуктов здесь --> </div> <hx-swap-oob target = "#js-filter -wrapper"> <!-- Фильтровать содержимое компонента здесь --> </hx-swap-oob>

Derek Roberts 04.08.2024 10:49

Итак, вы предлагаете использовать атрибуты? Боюсь, это не пойдет на пользу SEO.

Askalot 04.08.2024 10:49

Пробовали ли вы использовать js для выполнения запроса ajax, а затем обновить обе части страницы, используя селекторы запросов

Derek Roberts 04.08.2024 10:54

Не могли бы вы привести пример? Своп AFAIK не может иметь более одной цели.

Askalot 04.08.2024 10:59

Я обнаружил, что можно использовать selectOOB с использованием JS API htmx.org/api > - swapOptions - дополнительные необязательные параметры для подкачки > selectOOB - селектор содержимого для внеполосной замены (эквивалент hx- select-oob) Знаете ли вы, как и можно ли с его помощью поменять фильтр OOB способом?

Askalot 04.08.2024 11:11

возможно, но вы не предоставили дополнительную информацию о своем формате HTML, это усложняет задачу. но я приведу вам пример.

Derek Roberts 04.08.2024 11:12

Я предоставил вам обновленную функцию на основе вашего HTML. проверь, поможет ли это

Derek Roberts 04.08.2024 11:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
10
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете отправлять отдельные запросы HTMX для обновления разных компонентов. Зачастую это самый простой подход, если компоненты, которые вы хотите обновить, различны и их обновления не зависят друг от друга.

htmx.ajax('GET', productUrl, {
    target: '#js-product-list',
    swap: 'beforeend'
})
.then(() => {

});

htmx.ajax('GET', filterUrl, {
    target: '#js-filter-wrapper',
    swap: 'innerHTML' 
})
.then(() => {

});

В моем случае обновлять одно без обновления другого не имеет смысла. Кроме того, мне нужна одна и та же конечная точка на сервере как для ajax, так и для полностраничных запросов в целях SEO, а для этого потребуется ненужная конечная точка, которая не будет работать для полностраничных запросов.

Askalot 04.08.2024 10:26
Ответ принят как подходящий

Чтобы заменить фильтр внештатным способом, вам потребуется обновить нужные вам компоненты. Я привел пример.

<div id = "js-product-list">
    <!-- Product list content here -->
</div>
<div id = "js-filter-wrapper" hx-swap-oob = "true">
    <!-- Filter component content here -->
</div>
<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>HTMX Example</title>
    <script src = "https://unpkg.com/[email protected]"></script>
</head>
<body>

<div class = "container position-relative" id = "js-main-content">
    <header>
        <div id = "js-filter-wrapper">
            <!-- Initial filter component content -->
        </div>
        <div class = "mt-3 ms-1" id = "js-main-title-wrapper">
            <h1>Heading</h1>
        </div>
    </header>
    <main class = "row" id = "js-product-list">
        <!-- Initial product list content -->
    </main>
</div>

<script>
function updateComponents(url) {
    htmx.ajax('GET', url, {target: '#js-product-list', swap: 'beforeend'})
        .then((response) => {
            const parser = new DOMParser();
            const doc = parser.parseFromString(response, 'text/html');

            // Extract and update the filter component
            const newFilter = doc.querySelector('#js-filter-wrapper');
            if (newFilter) {
                document.querySelector('#js-filter-wrapper').innerHTML = newFilter.innerHTML;
            }
        })
        .catch((error) => {
            console.error('Error updating components:', error);
        });
}

// Example usage
updateComponents('/your-endpoint');
</script>

</body>
</html>


К сожалению, это не помогло. Содержимое фильтра добавляется к существующему (под фильтром, а не заменяет его), следует добавлять только новое содержимое списка продуктов. Я обновил вопрос, добавив детали разметки и некоторые дополнительные пояснения.

Askalot 04.08.2024 11:36

hx-swap-oob работает, но было бы идеально не использовать теги hx из-за SEO.

Askalot 04.08.2024 11:39

Я только что понял, что могу добавить атрибут hx-swap-oob на серверную часть только в том случае, если это запрос AJAX и поэтому он не будет виден роботам. Это решает мои опасения по поводу SEO. Спасибо за ваши усилия.

Askalot 04.08.2024 11:51

@Аскалот, да, пожалуйста. всегда рад помочь.

Derek Roberts 04.08.2024 22:00

Другие вопросы по теме