【问题标题】:jQuery: Variables to Compare text in various list itemsjQuery:用于比较各种列表项中的文本的变量
【发布时间】:2020-04-26 21:28:07
【问题描述】:

如果我有以下有序列表:

<ol class="breadcrumbs">
    <li title="Sbox">
        <a href="myURL">SANDBOX</a>
    </li>
    <li title="API Ref">
        <a href="myURL">API Reference</a>
    </li>
    <li title="Schemas">
        <a href="myURL">Schema Files</a>
    </li>
</ol>

我可以通过使用这个 jQuery 代码“收获”第二个子列表项的文本(“API 参考”):

var bcrumbtext = $("ol.breadcrumbs li:nth-child(2)").text();

如果我有 多个 具有以下结构的无序列表(确切地说是 6 个):

<ul class="category">
    <li class="cat" catid="360002246652"><a>Getting Started</a></li>
    <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do X</a></li>
    <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do Y</a></li>
    <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do Z</a></li>
</ul>

<ul class="category">
        <li class="cat" catid="360002246652"><a>API Reference</a></li>
        <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do X</a></li>
        <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do Y</a></li>
        <li class="sec" secid="360007910471" categoryid="360002246652" parentsecid="null"><a href="myURL">How to do Z</a></li>
</ul>

如何设置一个变量,使我能够为每个无序列表成功“收集”第一个列表项(“猫”类)中的文本?

我的最终目标是能够将一个“bcrumbtext”值(在这种特殊情况下:“API 参考”)与每个具有“cat”类的列表项的文本值进行比较。 (这个 .cat 列表项始终是“类别”UL 中的第一个后代。)一旦建立匹配,我将需要更改 CSS 值,但这是下一步,我会及时处理该步骤。目前,我只是纠结于如何设置第二个变量并执行值比较。

提前感谢您提供的任何意见。


这是一个更新的代码块。我希望显示所有 li.sec 列表项属于特定 li.cat 与匹配的文本值。请注意,li.sec 的默认 'display' 属性是 'none'(因此我使用了 'show' 方法)。

不知何故,这仍然不起作用。控制台中没有显示任何错误,但没有实现所需的效果:

var bcrumbtext = $("ol.breadcrumbs li:nth-child(2)").text();
    $("ul.category li.cat").each(function() { 
        if ($(this).text() == bcrumbtext) { 
        $(this).nextUntil('ul').show('li.sec');
     } 
 });

【问题讨论】:

  • $("ul.category li.cat").each(function() { if ($(this).text() == bcrumtext) { ...change CSS value... } }) 这将遍历ul.category 中的每个li.cat 项目,并使用bcrumtext 检查每个li.cat 项目的文本。
  • 非常感谢@lurker。我想我快到了。代码不会抛出错误,这是一个很好的开始。我仍然没有达到我需要的最终效果——即显示所有 'li.sec' 列表项直接落在具有匹配文本值的特定 'li.cat' 下。 (“li.sec”的默认显示为“none”。)我在原始问题中附加了一些代码。或许您能够确定问题所在?

标签: jquery list variables compare


【解决方案1】:

您尝试的问题是.show() 方法没有将元素选择器作为参数。 documentation for .show() 描述了可能的参数。

此外,现在知道你想要实现什么,而不是使用nextUntil,我会使用.siblings()nextUntil 依赖于在感兴趣的元素周围放置其他 HTML 元素,这是一种不必要的依赖,.siblings() 非常适合此目的。

请注意,从“ol.breadcrumbs li:nth-child(2)”中检索文本将包括存在于 &lt;li title="..."&gt; 之间的任何前导/尾随空格(例如、换行符)和&lt;/li&gt;。里面有一些新行,所以在比较之前需要用.trim()删除这些行。

考虑到这些事情重构您的尝试:

var bcrumbtext = $("ol.breadcrumbs li:nth-child(2)").text().trim();

$("ul.category li.cat").each(function() {
  if ($(this).text().trim() == bcrumbtext) {
    $(this).siblings(".sec").show()
  } 
});

这里有一个fiddle 来证明它可以工作(单击“尝试”按钮)。

【讨论】:

  • 再次 - 非常感谢您的帮助。关于.show() 方法的好消息,我同意你关于取消nextUntil 的建议。不幸的是,新代码仍然不起作用。控制台中没有显示任何错误,但目标 li.sec 项目仍然不显示。基于我孜孜不倦的调试尝试,我的直觉是 if 语句有问题。语法可能很好,但不知何故,bcrumbtext 和 'li.cat' 之间的匹配并没有被所有处理识别,所以.show() 永远不会被触发。啊!
  • @Marconi 您可以轻松地为要检查的变量添加console.log(...)
  • @Marconi 我稍微更新了我的答案,并在bcrumbtext 上添加了.trim()。原因是.text() 将包含文本中需要在比较时删除的任何前导或尾随换行符或其他空白字符。 &lt;li ...&gt;&lt;/li&gt; 之间的任何换行符都将成为 .text() 的一部分。我添加了一个小提琴链接来演示。
  • 宾果游戏!有用。非常感谢! trim() 是诀窍。 (请注意,您确实在以show() 结尾的行之后省略了一个结束分号,但我将它放在了我的代码中。我试图将它添加到您的响应中,但收到一条警告说编辑队列已满。)现在 -如果您不介意最后一件事:如果我想要第二个变量来保存 li.cat 文本,我将如何正确使用 each() 函数?这是我设想的变量:var cattext = $("ul.category li.cat").text().trim();
  • @Marconi Javascript 中的分号是可选的。您可以从工作小提琴中看到这一点。 :)。很高兴它奏效了。您对cattext 的建议看起来不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多