更新元素hx-trigger属性后行为未变,如何重新解析htmx触发器?
问题:动态修改htmx的hx-trigger属性后不生效,如何强制重新解析触发器?
我使用hyperscript更新#refreshToggle元素的hx-trigger属性,希望根据#timeDropdown的选中值改变请求alert端点的频率。虽然属性已成功修改,但#refreshToggle仍使用初始的5s触发规则。htmx仅在页面加载时解析并设置所有触发器,即使删除hx-trigger属性,该元素仍会按原规则(点击[选中时]、每5秒[选中时])运行。请问是否有办法强制重新加载/解析触发器?
代码示例
<div class="container"> <label for="timeDropdown" class="has-text-white-ter">Refresh every:</label> <select name="timeDropdown" id="timeDropdown" _="on change set #refreshToggle[@hx-trigger] to `click[this.checked], every ${my value}s[this.checked]`"> <option value="5">5s</option> <option value="10">10s</option> <option value="15">15s</option> <option value="30">30s</option> <option value="60">60s</option> <option value="120">2m</option> <option value="300">5m</option> </select> </div> <div class="container"> <label class="has-text-white-ter" for="refreshToggle">Toggle automatic polling</label> <input class="is-rounded" id="refreshToggle" type="checkbox" hx-get="{{ url_for("alerts") }}" hx-trigger="click[this.checked], every 5s[this.checked]" hx-target="#alert-list"/> </div> <div id="alert-list" class="container"></div>
解决方案
htmx在页面加载时会将hx-trigger属性解析为内部事件监听器和定时器,直接修改属性不会自动更新这些运行时逻辑。要让新的触发规则生效,需手动让htmx重新处理目标元素:
修改hyperscript逻辑
在更新hx-trigger属性后,先销毁原有的htmx处理逻辑,再重新初始化元素:
<select name="timeDropdown" id="timeDropdown" _="on change set #refreshToggle[@hx-trigger] to `click[this.checked], every ${my value}s[this.checked]` then call htmx.unprocess(#refreshToggle) then call htmx.process(#refreshToggle) ">
原理说明
htmx.unprocess(#refreshToggle):移除该元素上所有由htmx添加的事件监听器、定时器,彻底清除原有触发器的运行逻辑。htmx.process(#refreshToggle):重新解析元素上的所有htmx属性,包括新的hx-trigger,生成对应的事件监听器和定时器,使新的触发规则立即生效。
额外注意
若checkbox当前处于选中状态,重新处理后新的定时器会按照设置的间隔立即开始运行,符合预期的自动刷新逻辑。
内容的提问来源于stack exchange,提问作者HighestPie
相关产品推荐
相关产品推荐

