You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:50:16