HTMX技术问题:如何将hx-swap过渡与轮询hx-get同步
解决HTMX轮询打断删除过渡的问题
核心思路
通过暂停轮询直到删除过渡动画完成,再恢复轮询,避免更新请求打断淡出效果。
步骤1:给网格元素添加唯一ID
先给轮询的网格容器添加ID,方便后续精准控制轮询状态:
<body> <div class="grid" id="item-grid" hx-get="/boxes" hx-trigger="every 3s"> <div class="itemcontainer"></div> </div> </body>
步骤2:修改删除按钮,触发轮询暂停
在删除按钮上绑定htmx:before-request事件,在删除请求发起时暂停网格的轮询:
<div class="itemcontainer"> <div class="buttoncontainer"> <div class="rejectbuttoncontainer"> <a class="rejectbutton" hx-target="closest .itemcontainer" hx-swap="outerHTML swap:1s" hx-delete="/delete/{{ id }}" hx-on::before-request="htmx.trigger('#item-grid', 'htmx:pausePolling')"> DELETE </a> </div> </div> </div>
步骤3:监听过渡完成,恢复轮询
添加JavaScript代码,监听HTMX的htmx:afterSwap事件(该事件会在swap:1s指定的过渡完成后触发),恢复网格的轮询:
document.getElementById('item-grid').addEventListener('htmx:afterSwap', function(e) { // 确认触发事件的是删除操作的目标元素 if (e.detail.target.classList.contains('itemcontainer')) { htmx.trigger('#item-grid', 'htmx:resumePolling'); } });
备选方案:使用HTMX内置同步机制
若倾向于用HTMX原生同步能力,可给轮询请求和删除请求设置同一同步组,让轮询请求排队等待删除操作完成:
<!-- 网格容器 --> <div class="grid" id="item-grid" hx-get="/boxes" hx-trigger="every 3s" hx-sync="deleteGroup:queue"> ... </div> <!-- 删除按钮 --> <a class="rejectbutton" hx-target="closest .itemcontainer" hx-swap="outerHTML swap:1s" hx-delete="/delete/{{ id }}" hx-sync="deleteGroup:queue"> DELETE </a>
注:此方案需确保使用的HTMX版本支持
hx-sync的队列模式,之前尝试失败可能是版本兼容或语法问题。
内容的提问来源于stack exchange,提问作者Jayson Okhman
相关产品推荐
相关产品推荐

