非htmx发起的PUT请求,如何让hx-trigger响应HX-Trigger头?
解决手动XHR请求的HX-Trigger响应头不生效问题
htmx默认只会解析它自身发起的请求返回的HX-Trigger响应头,你手动创建的XMLHttpRequest请求不在htmx的处理范围内,所以响应头里的触发指令无法被识别执行。下面给两种可行的解决思路:
方法一:手动解析响应头,触发htmx事件
在你的XHR请求中添加onload回调,主动读取响应头中的HX-Trigger值,然后调用htmx的API手动触发目标事件。修改后的saveFile函数中XHR部分代码如下:
var xhr = new XMLHttpRequest(); xhr.open('PUT', '/dataset/', true); xhr.setRequestHeader('Content-Type', 'application/x-zip-compressed'); // 新增响应处理逻辑 xhr.onload = function() { if (xhr.status === 200) { const hxTrigger = xhr.getResponseHeader('HX-Trigger'); if (hxTrigger === 'refreshDatasets') { // 向body元素触发refreshDatasets事件,匹配你的hx-trigger配置 htmx.trigger('body', 'refreshDatasets'); } } }; xhr.send(atob(reader.result.split(',')[1]));
方法二:用htmx API发起请求,自动处理响应头
直接使用htmx提供的htmx.ajax方法发起PUT请求,这样htmx会自动处理响应中的HX-Trigger头,无需手动干预。调整后的代码示例:
修改按钮绑定
button(type="button" onclick="saveFileWithHtmx()") Upload
编写上传函数
async function saveFileWithHtmx() { const fileInput = document.getElementById('rfile').files[0]; if (!fileInput) { console.log('Please select a file.'); return; } // 直接读取文件为ArrayBuffer(比DataURL更高效) const arrayBuffer = await fileInput.arrayBuffer(); // 用htmx发起PUT请求 htmx.ajax('PUT', '/dataset/', { body: arrayBuffer, headers: { 'Content-Type': 'application/x-zip-compressed' } }); }
这样请求发送后,htmx会自动解析响应头中的HX-Trigger,触发refreshDatasets事件,你的datasetList元素就能正常发起GET请求了。
内容的提问来源于stack exchange,提问作者TheRedTopHat
相关产品推荐
相关产品推荐

