【问题标题】:having trouble selecting an element's child with jQuery无法使用 jQuery 选择元素的子元素
【发布时间】:2023-04-09 02:27:01
【问题描述】:

我有一些这样的嵌套元素:

<div id="knownID">
 <div class="knownClass">
   <span>
     <nobr>
       <span class="knownClass2">
         <span> ... </span>       <--- this keeps expanding deeper and deeper
         <span></span>            <--- this is the one I need!!!
       </span>
     </nobr>
   </span>
 </div>
</div>

我正在尝试通过这样做来选择它...

$('#knownID span.knownClass2 span:nth-child(2)').html();

...但它不工作。如何在 &lt;span&gt;class="knownClass2" 中选择 2nd &lt;span&gt;?我也试过...

$('#knownID > span.knownClass2 span:nth-child(2)').html();

... 但它返回 null。我想我对 nth-child() 选择器在 jQuery 中的工作方式不是很熟悉。有人介意解释它的工作原理并为我的问题提供可能的解决方案吗?

谢谢, 赫里斯托

【问题讨论】:

  • span:nth-child(2) 应该是正确的。确保“#equation > span.math span”有效。
  • 我认为当我尝试进行上述选择时,#knownID 可能不在 DOM 上可能是个问题。

标签: jquery jquery-selectors selection css-selectors


【解决方案1】:

你可能想试试:

$("#knownID span.knownClass2 > span:nth-child(2)").html();

内容如下:直接在类为“knownClass2”的跨度下查找类型为 span 的第二个子级,该跨度嵌套在 id 为“knownId”的元素内的某处。

文档可以在这里找到:

http://api.jquery.com/category/selectors/

PS:这也是一个基于上下文的解决方案:

$(" > span:eq(1)", "span.knownClass2", "div#knownID").html();

【讨论】:

  • 绝对!如果您最终无法依赖 #knownID div,那么您始终可以将其从表达式中删除,并且代码仍然可以工作 - 它只是不会那么安全,因为可能还有其他具有 knownClass2 类的跨度在 DOM 中。
  • 所以这很有趣......你的解决方案有效,我可以完成我想要的。但是,Ramblingwood 的解决方案在选择方面也有效,但即使选择有效并且我正在更改相同的属性,我想要发生的事情也不起作用。
  • 如果元素内部没有任何数据,您可能会得到 null 作为响应。例如 $("span.knownClass2").html() 应该返回 span.knowClass2 内部的 HTML。如果 span.knownClass2 中没有 HTML,则结果将为 null。
【解决方案2】:

这对我来说很好用:

$("#knownID .knownClass .knownClass2 span:nth-child(2)")

在此处查看 JSBin:http://jsbin.com/opoji3/edit

也许你在其他地方有错误?

【讨论】:

  • 我认为当我尝试进行上述选择时,#knownID 可能不在 DOM 上,这可能是个问题。
【解决方案3】:

使用:eq() selector 获取jQuery 对象中的第n 个项目。该列表的索引为零。

$("div#knownID span.knownclass2 span:eq(1)").html()

这是demohttp://www.jsfiddle.net/96RyH/1/

【讨论】:

    【解决方案4】:

    你可以试试这个:

    $('#knownID')
        .children('div.knownClass')
        .children('span')
        .children('nobr')
        .children('span.knownClass2')
        .children('span:first')
        .next()
        .html();
    

    使用像这样的显式函数比将它们集中在一个字符串中要快,就像你所做的那样。这是因为 jQuery 的选择器引擎从右到左工作。使用这样的函数将首先在 ID 元素上归零,然后向下移动到您想要的位置。

    为什么函数更快
    jQuery 使用Sizzle Selector Engine。这个引擎很棒,但需要注意的一点是,它在选择器查询中从右到左工作。那是什么意思?以这个 jQuery sn-p 为例:

    $('#foo a.bar');
    

    Sizzle 将首先查找页面上每个具有类bar 的锚点,然后检查每个锚点以查看它是否是id 为foo 的元素的祖先。这没有优化,特别是如果页面上有很多锚标记。 Sizzle 必须这样做,因为它不明确知道您要查找的内容。

    但是:

    $('#foo').children('a.bar');
    

    将首先找到 id 为 foo 的元素,然后下一级到类为 bar 的锚点。它要快得多。你可以告诉 jQuery 这样做,因为你对你的 DOM 结构有预知。

    【讨论】:

    • 它有趣的 jQuery 口号是“少写多做”......这段代码似乎显示了相反的情况。 OP 还要求获得第二个跨度而不是第一个。
    • 这种方式也非常依赖于div.knownClass的未命名元素,IDed div#knownID元素和span.knownClass2之间的span和nobr。如果 DOM 发生变化,这会使代码更容易出现错误。
    • 对不起。对于我的网络应用程序,Speed is King。在什么情况下你会改变 DOM 而不是更新访问它的 JavaScript?
    • 争论毫无意义......但我希望能解释一下为什么你的方法比另一种更快?是不是解析字符串的原因?
    • 提供了解释。如果需要进一步澄清,请告诉我。
    【解决方案5】:

    你可以这样做:

    $("span.KnownClass2").children(":last").html();

    【讨论】:

    • 虽然这样是有效的,但是如果页面上有很多span元素会很慢。尤其是在 IE 中。
    • 如果你想要第二个元素而不是最后一个元素,这也行不通。
    【解决方案6】:

    您需要在knownClass2nth-child 之间有一个&gt;,如下所示:

    $('#knownID  span.knownClass2 > span:nth-child(2)').html();
    

    【讨论】:

    • 我相信这不会返回任何内容,因为父级 #knownID 没有 span.knownclass2 的直接后代
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    • 2019-05-15
    • 2014-01-20
    • 2011-05-04
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多