创建 htmx 扩展

要定义扩展,请调用 htmx.defineExtension() 函数。

创建 HTMX 扩展的基本结构:

htmx.defineExtension("my-extension", {
  onEvent: function (name, evt) {
    // 监听事件(可选)
  },
  transformRequest: function (xhr, config, elt) {
    // 修改请求(可选)
  },
  handleSwap: function (swapStyle, target, fragment, settleInfo) {
    // 自定义响应插入逻辑(可选)
  },
  isInlineSwap: function (swapStyle) {
    // 用于扩展 swap 行为(可选)
  },
  encodeParameters: function (xhr, parameters, elt) {
    // 自定义参数编码方式(可选)
  }
});

通常,这是在独立的 javascript 文件中完成的,而不是在内联脚本标记中完成的。

扩展的名称应以破折号分隔,并且相当简短且具有描述性。

扩展可以覆盖以下默认扩展点以添加或更改功能:

{
    init: function(api) {return null;},
    getSelectors: function() {return null;},
    onEvent : function(name, evt) {return true;},
    transformResponse : function(text, xhr, elt) {return text;},
    isInlineSwap : function(swapStyle) {return false;},
    handleSwap : function(swapStyle, target, fragment, settleInfo) {return false;},
    encodeParameters : function(xhr, parameters, elt) {return null;}
}

一个简单的扩展示例:添加默认请求头

htmx.defineExtension("default-headers", {
  transformRequest: function (xhr, config, elt) {
    xhr.setRequestHeader("X-Custom-Header", "HelloFromExtension");
  }
});

配合 HTML 使用:

<body hx-ext="default-headers">
  <button hx-get="/some-endpoint" hx-target="#result">点我</button>
  <div id="result"></div>
</body>