标签: htmx

使用 htmx 发送两个输入值的组合

我正在编写一个简单的网站Django,我决定尝试在客户端使用htmx库来加载 html 片段。现在我想按不同字段对列表进行升序和降序排序。我有这样的事情:

<div class="col-auto">
  <div class="input-group input-group-sm">
    <select id="np-sort-key" name="key" class="form-select">
      <option value="publish_date" selected>Publish date</option>
      <option value="title">Title</option>
    </select>
    <button class="btn btn-outline-dark" type="button">
      <span class="bi bi-sort-down"></span> <!-- bi-sort-up for Asc icon -->
    </button>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我想将order_by=<order><key>查询参数添加/替换到当前网址(例如 /articles?page=2&order_by=-publish_date。),并在“选择”更改和“按钮”单击时将其发送回 Django 视图。端点返回一个 Html,我想用 Htmx 将它与另一个 Html 节点交换。(请注意,单击按钮时应更改跨度类以显示排序是 Asc 或 Dsc)

可以使用吗htmx?如果没有,欢迎使用简单的 Javascript 解决方案。

javascript htmx

5
推荐指数
1
解决办法
7455
查看次数

在 div 中插入元素后,如何保持 div 的 x 滚动位置?

我尝试使用 HTMX 实现无限 x 滚动,但请求被无限触发,因为触发元素被插入到 div 的左侧,并触发一个新的请求来加载 div 内的项目。

如何避免这种情况:追加新元素,但保留 x 滚动位置?我不确定这可能是 CSS 或 HTMX 问题。

<div class="flex h-full space-x-2">
  <div class="bg-amber-600 flex-initial w-1/4"></div>
  <div class="flex space-x-2 w-full overflow-x-auto">
    <div class="flex-none w-16 ml-auto" 
      hx-get="/scroll" 
      hx-trigger="intersect once" 
      hx-swap="outerHTML">
    </div>
    <div class="bg-amber-400 flex-none w-16">0</div>
    <div class="bg-amber-400 flex-none w-16">1</div>
    <div class="bg-amber-400 flex-none w-16">2</div>
    <div class="bg-amber-400 flex-none w-16">3</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我也尝试过beforebegin,它的行为是一样的:

<div class="bg-amber-400 flex-none w-16 ml-auto"
  hx-get="/scroll"
  hx-trigger="intersect once"
  hx-swap="beforebegin">x</div>
Run Code Online (Sandbox Code Playgroud)

这是一个代码笔来解释我的意思:https ://codepen.io/viggiesmalls/pen/RwQPROJ

html javascript css htmx

5
推荐指数
0
解决办法
433
查看次数

如何测试 HTMX Get 请求?

我正在使用 Django 和 HTMX。我的一个视图收到 GET 请求并返回整个页面。但是,如果该 GET 请求来自 HTMX 元素,则视图将返回一个片段:

from django.shortcuts import render

def view_example(request):
    if request.htmx:
        return render(request, 'fragment.html')
    else:
        return render(request, 'page.html')
Run Code Online (Sandbox Code Playgroud)

page.htmlHTMX 元素中触发需要此片段的 GET 请求。它有效 - 我的功能测试看到 HTMX 请求的结果。当我在浏览器中查看它时,它也有效。但它在我的单元测试中不起作用!

我正在尝试测试两种不同类型的响应:

from django.test import TestCase

class TestRequests(TestCase):
    def test_page(self):
        response = self.client.get('/')
        self.assertTemplateUsed(response, 'page.html')

    def test_fragment(self):
        headers = {'Hx-Request': 'true'}
        response = self.client.get('/', **headers)
        self.assertTemplateUsed(response, 'fragment.html')
Run Code Online (Sandbox Code Playgroud)

test_page按预期通过,但test_fragment失败:

AssertionError:False 不是 true:模板“fragment.html”不是用于呈现响应的模板。实际使用的模板:page.html

如何模拟 HTMX 请求以便测试我的片段逻辑?

testing django tdd http htmx

5
推荐指数
1
解决办法
1221
查看次数

HTMX:从 JavaScript 函数动态添加 hx 属性时,请求不会触发

我有一个包含多个select元素的表单,其中某些元素的可用选择取决于其他元素的所选值。我正在使用 HTMX 来实现这一点。对于一个元素,我还想根据前一个元素中选择的值动态设置hx-post和属性。hx-target

我可以使用 JavaScript 成功设置属性,但是当元素更改时,请求实际上不会触发。

超文本标记语言

<form>
    <select id="dropdown_A" onchange="dropdownAChanged(this.value);" hx-post="/choices/dropdown_B/" hx-target="#dropdown_B" required>
        <option value="">--</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
    </select>

    <select id="dropdown_B" required>
        <option value="">--</option>
    </select>

    <select id="dropdown_C" class="inactive">
        <option value="">--</option>
    </select>

    <select id="dropdown_D" class="inactive">
        <option value="">--</option>
    </select>
</form>
Run Code Online (Sandbox Code Playgroud)

JavaScript

function dropdownAChanged(value) {
    const b = document.querySelector('#dropdown_B');
    const c = document.querySelector('#dropdown_C');
    const d = document.querySelector('#dropdown_D');

    switch (value) {
        case '1':
            makeInactive([c, d]);
            break;

        case '2':
            makeActive(c);
            makeInactive(d);
            b.setAttribute('hx-post', '/choices/dropdown_C/');
            b.setAttribute('hx-target', '#dropdown_C');
            break; …
Run Code Online (Sandbox Code Playgroud)

javascript htmx

5
推荐指数
1
解决办法
3149
查看次数

使用 HTMX 更换整个身体

我有以下内容index.html

<head>
<meta charset="UTF-8">
<script src="https://unpkg.com/htmx.org@1.9.5"></script>
</head>
<body id="bomb-main" class="main-page">
<div class="bomb"
     hx-trigger="click"
     hx-swap="outerHTML"
     hx-target="#bomb-main"
     hx-get="/boom"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

/boom返回以下响应

<body id="bomb-main" class="bomb-animation">
<h1>ka-boom</h1>
</body>
Run Code Online (Sandbox Code Playgroud)

单击 时,主体将被替换,但类保持不变。

<body id="bomb-main" class="main-page">
<h1>ka-boom</h1>
</body>
Run Code Online (Sandbox Code Playgroud)

如何更改 的类body

html javascript htmx

5
推荐指数
1
解决办法
1422
查看次数

如何使用 htmx 礼貌地关闭 SSE 事件流?

我正在尝试使用 htmx 设置一个短暂的事件流处理程序。想象一下,例如,流式传输 chatgpt 响应或类似内容。该流将持续 10-30 秒,然后我预计它会耗尽。

有没有办法让 htmx 监听 SSE 事件类型并关闭 SSE 源作为响应?

我有一个笨重的解决方法,我有一个用于流终止事件类型的 htmx 侦听器,然后该侦听器向仅返回一个空 div 的端点发出请求,并将该 div 交换为原始侦听器,以防止它无休止地尝试重新连接到 SSE 源。

但我觉得我一定错过了一些东西,因为这看起来不太优雅。

这就是我现在拥有的,如下。它有效(大部分),但是有更好的吗?谢谢!

<div
  id="chat-sse-listener"
  hx-ext="sse"
  sse-connect="{% url 'stream_test' %}"
>

  {# This listens for the next token in the stream and appends it to the chat. #}
  <div
    sse-swap="message"
    hx-target="#chat-message"
    hx-swap="beforeend"
  ></div>

  {# This listens for my custom EndOfStream SSE event and awkwardly replaces the entirely SSE listener with an empty div. #}
  <div
    hx-trigger="sse:EndOfStream"
    hx-target="#chat-sse-listener"
    hx-swap="outerHTML" …
Run Code Online (Sandbox Code Playgroud)

htmx

5
推荐指数
0
解决办法
310
查看次数

在页面加载时加载 div,然后每隔 n 秒使用 htmx 加载?

使用HTMX,我知道我可以每 2 秒轮询一次“/news”,如下所示:

<div hx-get="/news" hx-trigger="every 2s">div>
Run Code Online (Sandbox Code Playgroud)

但页面加载后第一次触发需要2s时间。我想做的是在页面加载后立即触发对“/news”的调用,然后每 2 秒轮询一次。

我尝试过诸如以下的事情:

<div hx-get="/news" hx-trigger="on load or every 2s">div>
Run Code Online (Sandbox Code Playgroud)

<div hx-get="/news" hx-trigger="on htmx:afterOnLoad or every 2s">div>
Run Code Online (Sandbox Code Playgroud)

但这些都不起作用。我怎样才能用 HTMX 做到这一点?

(我知道这对于 HTMX 通常是一种不好的做法,因为您可以在响应中包含来自服务器的数据,但出于好奇我想知道:))

htmx

4
推荐指数
1
解决办法
2287
查看次数

htmx 和 django:显示成功/失败请求的反馈

因此,当使用 HTMX 将表单提交到我的 Django 后端时,我尝试显示一条反馈消息,指出“已添加”或“失败”。

基本上我现在拥有的是一个执行 hx-post 的表单,回复是div包含更新的信息,该信息与 .hx-post 的当前内容交换div

<div id="list">
    <!-- The stuff in here is loaded through another template, which is
         the result of a successful myApp:add operation. -->
</div>
<form hx-post="{% url 'myApp:add' eid=e.id %}" hx-swap="outerHTML" hx-target="#list">
    <!-- Some stuff in here -->
</form>
<div id="result">
    <!-- Here I should print a message saying correct or incorrect
         depending on the HTMX result (if the entry was added or there was
         any kind …
Run Code Online (Sandbox Code Playgroud)

django python-3.x alpine.js htmx

4
推荐指数
1
解决办法
2170
查看次数

如何用htmx更新2个目标?

我有以下 html 代码

<button
        hx-get="/views/users/byId/someId"
        hx-target=".details">Details</button>
<div class="details">first</div>
<div class="details">second</div>

Run Code Online (Sandbox Code Playgroud)

这只会改变第一个 div,第二个 div 不会改变我想用相同的类名更新底部的两个 div 如何做到这一点?

我也尝试了多个 div,但因为我们不能有多个 div 导致错误

htmx

4
推荐指数
1
解决办法
2127
查看次数

如何导入 HTMX 变量?

我在一些动态生成的 DOM 元素上使用 HTMX 属性。如文档中所述,除非您致电 ,否则HTMX 无法工作htmx.process()

当我尝试调用它时,我正确地得到了错误:

未捕获的引用错误:htmx 未定义

知道如何导入这个 htmx 变量吗?不知道文档中的示例如何工作。

谢谢!

htmx

3
推荐指数
1
解决办法
2624
查看次数

标签 统计

htmx ×10

javascript ×4

django ×2

html ×2

alpine.js ×1

css ×1

http ×1

python-3.x ×1

tdd ×1

testing ×1