返回

使用 JavaScript 和 Twig 根据复选框隐藏/显示项目,解决具体问题

javascript

使用 JavaScript 和 Twig 根据复选框隐藏/显示项目

问题

假设你有一个项目库,其中项目来自不同的文件夹,每个文件夹都有一个 data-id-name 属性,该属性等于文件夹名称。此外,每个文件夹还会在列表中创建一个 input type="checkbox" 项目。

你的目标是使用 JavaScript 实现一个功能,当选中具有 id="markers" 的复选框时,该功能将隐藏所有不等于 data-id-name="markers" 的项目。

解决方法

以下步骤演示了如何实现这个功能:

  1. 选择复选框和项目:

    • 使用 document.getElementsByTagName 选择页面上的所有复选框。
    • 使用 querySelectorAll 选择具有 data-id-name 属性的项目列表。
  2. 循环检查复选框:

    • 遍历复选框,检查哪些复选框已选中。
  3. 根据复选框状态显示/隐藏项目:

    • 对于每个复选框,获取其 data-id-name 属性并将其与项目列表中的 data-id-name 属性进行比较。
    • 如果属性匹配,则显示项目。否则,隐藏项目。

优化 JavaScript 代码

优化后的 JavaScript 代码如下:

function showHideItems() {
  const checkboxes = document.querySelectorAll('input[type="checkbox"]');
  const items = document.querySelectorAll('[data-id-name]');

  for (let i = 0; i < checkboxes.length; i++) {
    const checkbox = checkboxes[i];
    const itemName = checkbox.getAttribute('data-id-name');

    checkbox.addEventListener('change', () => {
      if (checkbox.checked) {
        showItems(itemName);
      } else {
        hideItems(itemName);
      }
    });
  }
}

function showItems(itemName) {
  const items = document.querySelectorAll(`[data-id-name="${itemName}"]`);

  for (let i = 0; i < items.length; i++) {
    items[i].style.display = 'block';
  }
}

function hideItems(itemName) {
  const items = document.querySelectorAll(`[data-id-name="${itemName}"]`);

  for (let i = 0; i < items.length; i++) {
    items[i].style.display = 'none';
  }
}

showHideItems();

更改 Twig 代码

在 Twig 代码中,需要修改按钮 input 元素以包含 data-id-name 属性,该属性对应于其文件夹名称。

完整示例

Twig 代码:

<div class="gallery">

    {% for p in page.collection %}
        {% if p.header.button %}
            <input type="checkbox" id="{{ p.slug }}" data-id-name="{{ p.slug }}" class="gallery-label">{{ p.title }}</input>
        {% endif %}
    {% endfor %}

    <ul>
        {% for p in page.collection|randomize %}
            {% for image in p.media.images|randomize %}
                <li class="gallery-content" data-id-name="{{p.slug}}">
                    {{ image.lightbox.cropResize(360, 200).html()|raw }}
                </li>
            {% endfor %}
        {% endfor %}
    </ul>
</div>

JavaScript 代码:

function showHideItems() {
  const checkboxes = document.querySelectorAll('input[type="checkbox"]');
  const items = document.querySelectorAll('[data-id-name]');

  for (let i = 0; i < checkboxes.length; i++) {
    const checkbox = checkboxes[i];
    const itemName = checkbox.getAttribute('data-id-name');

    checkbox.addEventListener('change', () => {
      if (checkbox.checked) {
        showItems(itemName);
      } else {
        hideItems(itemName);
      }
    });
  }
}

function showItems(itemName) {
  const items = document.querySelectorAll(`[data-id-name="${itemName}"]`);

  for (let i = 0; i < items.length; i++) {
    items[i].style.display = 'block';
  }
}

function hideItems(itemName) {
  const items = document.querySelectorAll(`[data-id-name="${itemName}"]`);

  for (let i = 0; i < items.length; i++) {
    items[i].style.display = 'none';
  }
}

showHideItems();

通过遵循这些步骤,你就可以使用 JavaScript 和 Twig 根据复选框隐藏/显示项目了。

常见问题解答

1. 为什么需要 data-id-name 属性?

data-id-name 属性是标识项目的文件夹名称的自定义属性,因此可以根据复选框的状态动态地显示/隐藏项目。

2. 为什么使用 querySelectorAllgetAttribute 来选择项目?

querySelectorAll 是选择具有特定属性的元素的最有效方法,而 getAttribute 可以获取元素的属性值。

3. 是否可以在不使用 JavaScript 的情况下实现这个功能?

否,JavaScript 是必不可少的,因为它允许动态更改项目的显示状态。

4. 如何优化代码的性能?

可以将复选框的事件监听器绑定到其父容器,而不是每个复选框,以提高性能。

5. 如何处理复选框组?

如果有多个复选框控制同一组项目的显示/隐藏,则可以在 JavaScript 中使用事件委托来简化代码。