如何使用 HTMX 打开和关闭标题中的下拉菜单?

Posted

技术标签:

【中文标题】如何使用 HTMX 打开和关闭标题中的下拉菜单?【英文标题】:How to use HTMX to open and close a dropdown menu in a header? 【发布时间】:2021-08-15 01:02:35 【问题描述】:

我正在玩 HTMX,在阅读了文档后,我对如何从我的标题中创建 <button> 激活下拉列表 <div> 有点困惑。

这是我目前所拥有的,此按钮应包含 HMTX 属性以打开 <div> aka 下拉菜单,其 ID 和名称为 response(命名仅用于测试目的)。

              <button
                type="button"
                aria-expanded="false"
                hx-get="#response"
                hx-target="#response"
                hx-indicator=".htmx-indicator"
              >

如此处所示,此 div 将下拉列表包装在一起。

              <div
                id="response"
                name="response"
              >

这里是所有东西,我使用的模型取自 TailwindCSS(除了 HTMX 属性):

          <nav class="hidden md:flex space-x-10">
            <div class="relative">
              <!-- Item active: "text-gray-900", Item inactive: "text-gray-500" -->
              <button
                type="button"
                class="
                  text-gray-500
                  group
                  bg-white
                  rounded-md
                  inline-flex
                  items-center
                  text-base
                  font-medium
                  hover:text-gray-900
                  focus:outline-none
                  focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500
                "
                aria-expanded="false"
                hx-get="#response"
                hx-target="#response"
                hx-indicator=".htmx-indicator"
              >
                <span>Articles</span>
                <!--
                Heroicon name: solid/chevron-down

                Item active: "text-gray-600", Item inactive: "text-gray-400"
                -->
                <svg
                  class="text-gray-400 ml-2 h-5 w-5 group-hover:text-gray-500"
                  xmlns="http://www.w3.org/2000/svg"
                  viewBox="0 0 20 20"
                  fill="currentColor"
                  aria-hidden="true"
                >
                  <path
                    fill-rule="evenodd"
                    d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z"
                    clip-rule="evenodd"
                  />
                </svg>
              </button>

              <!--
                'Solutions' flyout menu, show/hide based on flyout menu state.

                Entering: "transition ease-out duration-200"
                From: "opacity-0 translate-y-1"
                To: "opacity-100 translate-y-0"
                Leaving: "transition ease-in duration-150"
                From: "opacity-100 translate-y-0"
                To: "opacity-0 translate-y-1"
            -->
              <div
                id="response"
                name="response"
                class="
                  absolute
                  z-10
                  -ml-4
                  mt-3
                  transform
                  px-2
                  w-screen
                  max-w-md
                  sm:px-0
                  lg:ml-0
                  lg:left-1/2
                  lg:-translate-x-1/2
                "
              >
                <div
                  class="
                    rounded-lg
                    shadow-lg
                    ring-1 ring-black ring-opacity-5
                    overflow-hidden
                  "
                >
                  <div
                    class="
                      relative
                      grid
                      gap-6
                      bg-white
                      px-5
                      py-6
                      sm:gap-8
                      sm:p-8
                    "
                  >
                    <a
                      href="#"
                      class="
                        -m-3
                        p-3
                        flex
                        items-start
                        rounded-lg
                        hover:bg-gray-50
                      "
                    >
                      <!-- Heroicon name: outline/chart-bar -->
                      <svg
                        class="flex-shrink-0 h-6 w-6 text-indigo-600"
                        xmlns="http://www.w3.org/2000/svg"
                        fill="none"
                        viewBox="0 0 24 24"
                        stroke="currentColor"
                        aria-hidden="true"
                      >
                        <path
                          stroke-linecap="round"
                          stroke-linejoin="round"
                          stroke-
                          d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"
                        />
                      </svg>
                      <div class="ml-4">
                        <p class="text-base font-medium text-gray-900">
                          Analytics
                        </p>
                        <p class="mt-1 text-sm text-gray-500">
                          Get a better understanding of where your traffic is
                          coming from.
                        </p>
                      </div>
                    </a>
                  </div>
                 </div>
                </nav>

到目前为止,在开发测试中,我的 NAV 栏中的每个下拉菜单都会在页面加载后立即打开。单击 NAV 标题后,没有适当的事件来声明下拉菜单的出现时间。

如何修复和使用 HTMX 来解决此问题?

HTMX docs can be found here

编辑:请注意,我已经为 HTMX 添加了 CDN 脚本,并且使用属性确认脚本正在运行,我只是不明白如何解决上述问题。

【问题讨论】:

什么是hx-get="#..." AFAIK,您需要使用返回片段的 URL。是否可以在hx-get 中处理 html 元素?这对我来说是新的。 【参考方案1】:

HTMX 使用这种模式:

    事件(例如按钮点击) 对服务器的http请求 来自服务器的http响应(包含一个html片段) 片段被应用到 DOM。

点击按钮后,您需要收到 http 响应。也许我是盲人,但我认为您的代码中缺少这一点。

【讨论】:

以上是关于如何使用 HTMX 打开和关闭标题中的下拉菜单?的主要内容,如果未能解决你的问题,请参考以下文章

如何在替代单击c#上打开和关闭工具条菜单下拉菜单

如何让下拉菜单在点击时打开/关闭而不是悬停?

如何检查 Select2 中的下拉菜单是不是打开?

在内部单击时保持 Bootstrap 下拉菜单打开

当打开一个下拉菜单时关闭另一个

导航栏中的引导下拉菜单未打开