【问题标题】:JQuery get child all data attributesjQuery获取子所有数据属性
【发布时间】:2020-06-28 12:49:26
【问题描述】:

我有以下列表:

<ul>
    <li>
        <div class="click">
            <span>click here</span>
        </div>
        <ul>
            <li data-dataAttribute="1"></li>
            <li data-dataAttribute="3"></li>
            <li data-dataAttribute="7"></li>
        </ul>
    </li>
</ul>

在这种情况下,我想获取单个 li 元素中 ul 下方的所有数据元素并将它们添加到列表中。

我尝试了以下方法:

$("#fileSystem").on('click', '.click', function () {
    var attributes = $(this > 'ul').children().data('dataAttribute');
    debugger;
});

但这不起作用,我似乎无法解决。我怀疑它可能与选择器有关。

【问题讨论】:

  • $(this &gt; 'ul') - 你希望它做什么? HTMLDivElement 永远不会大于字符串 o.O
  • 断开链接并一次执行一个步骤。在调试器中评估结果。
  • 哇,你是对的。这太愚蠢了。
  • 你能说出你想要什么吗?你的陈述不清楚
  • $(this &gt; 'ul') 不起作用。这是一个元素,而不是选择器。 $(this).children('ul') 是您所需要的。

标签: jquery jquery-selectors


【解决方案1】:

要查找子元素,您可以使用以下之一:

$("> ul", this)
$(this).find("ul")

在您的点击处理程序中,this 将是“点击此处”的 div。使用 &gt; 的选择器意味着找到子元素,但在您的 HTML 中,ul 不是 this 的子元素(单击此处),因此不起作用。

所以你需要找到下一个 ul,而不是一个孩子ul&gt; 不用于那个。

如果ul 是下一个元素,那么您可以使用简单的.next(),否则您需要使用其他方法来定位它。

然后您可以使用.map 提取数据

注意data-xyz必须小写,否则$("li").data("xyz")找不到。

把这些放在一起给你:

$(document).on("click", ".click", function() {
    var data = $(this).next().find("li").map(function() { 
        return $(this).data("dataattribute")}
    ).toArray()
    console.log(data)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
    <li>
        <div class="click">
            <span>click here</span>
        </div>
        <ul>
            <li data-dataattribute="1"></li>
            <li data-dataattribute="3"></li>
            <li data-dataattribute="7"></li>
        </ul>
    </li>
</ul>

【讨论】:

  • "...必须小写,否则 $("li").data("xyz") 将找不到它。" - 所以任何其他库(或 vanilla JS)都可以使用 data-xYzAbC ?
  • 我刚刚尝试了另一个答案,.attr("data-xYz") 可以工作,但不会使用 jquery 的缓存和强制 - .data() 会给你一个匹配的类型(上面的 int),而 @987654341 @ 始终是一个字符串。但是要回答这个问题 - 任何其他库都会执行该库所做的任何事情,而 vanilla js 不使用 .data() 它使用 .dataset- 转换为大写,例如 data-x-yz 变为 .dataset.xYz
  • 如果这是 jQuery 或 lodash 或其他任何东西,这完全无关紧要...data-* 属性必须是,per definition,全部小写。
  • @Andreas 那么你的问题是什么?或者更确切地说,您问题的要点是什么?说 .data() 不会找到混合大小写 没有暗示 任何其他库都可以工作。为什么不添加评论以澄清超出问题和答案的范围,即它们在所有情况下都必须是小写。
【解决方案2】:

试试地图:

请注意您的数据属性必须全部小写

$(function() {
  $("#fileSystem").on('click', '.click', function() {
    const list = $(this)
        .closest("li") // or .next()
        .find("ul>li[data-dataattribute]")
        .map((i,li) => $(li).attr("data-dataattribute")).get()
    console.log(list)
  })
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="fileSystem">
  <ul>
    <li>
      <div class="click">
        <span>click here</span>
      </div>
      <ul>
        <li data-dataattribute="1"></li>
        <li data-dataattribute="3"></li>
        <li data-dataattribute="7"></li>
      </ul>
    </li>
  </ul>
</div>

【讨论】:

  • 只是一个观察:如果你使用.attr("data-xyz"),你总是会得到一个字符串,如果你使用.data("xyz"),那么jquery会尝试给你正确的数据类型。这可能并不总是有效,因此您可以决定使用哪种方法;了解这两个选项是关键。
  • 有趣的是,与.data() 不同,.attr() 区分大小写in,因此它们可以混合大小写,甚至可以在不同元素上使用不同的大小写。
猜你喜欢
  • 1970-01-01
  • 2015-08-12
  • 2014-06-28
  • 1970-01-01
  • 2019-09-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-30
  • 1970-01-01
相关资源
最近更新 更多