【问题标题】:jQuery selector context questionjQuery 选择器上下文问题
【发布时间】:2009-02-16 15:54:52
【问题描述】:

我正在尝试进行以下选择:

$(".program", row)

其中“row”是一个包含两个表格行的 jQuery 对象。其中一个 tr 具有类“程序”。这个选择器似乎没有找到它。但是以下工作:

$(".title", row)

其中 div.title 是 tr.program 的后代。

如果我使用 jQuery 对象作为选择器上下文,我是否无法匹配该 jQuery 对象的顶级元素?

谢谢,

-摩根

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    您似乎正在尝试从您已经选择的元素中选择元素(驻留在 jQuery 对象中)。

    就 jQuery 而言,上下文就像指定一个父级 - 上下文是您在 DOM 树中寻找的某个节点之上的某个节点。上下文是 jQuery 将在其中查找您指定的选择器的位置。

    如果我对您尝试做的事情是正确的,那么这应该可以:

    row.filter('.program');
    
    // And then:
    row.filter('.program').find('.title');
    

    【讨论】:

      【解决方案2】:

      我的理解是上下文需要是根级别,即您要在其中进行选择的父级。

      编辑: 现在完成了一些阅读,您应该能够匹配上下文的顶级元素 (默认上下文是document)。

      Beardscratchers 有一篇关于在 jQuery 选择器中使用上下文的好文章。通常,您应该尝试将元素 id 作为 jQuery 包装集的上下文传递,因为它是定位元素的最高效方式。

      在内部,选择器上下文是用.find方法实现的,所以$(selector, context)等价于$(context).find(selector)

      【讨论】:

      • 如果等价于$(context).find(selector)那么需要注意的是,如果是元素,选择器不会匹配上下文本身,因为find()只匹配后代。
      • @Jason 没错,上下文就是搜索的范围,不包括自己
      【解决方案3】:

      您与后代走在正确的道路上。将上下文传递给选择器会搜索在该上下文中找到的所有后代。

      在您的情况下,由于对象不是“包含两行的父对象”,而是“行的集合”,因此 .program 是不可选择的。由于 .title 您收藏中的实际后代,因此它是可选的。

      【讨论】:

      • 酷。感谢您确认我的观察。我的对象是 $(someHTML).appendTo(aTable) 的结果。关于按类选择其中一行的最佳方法有什么建议吗?我可以遍历 jquery 对象,但我希望它更漂亮一些。
      • 如果你想保留现有的选择器代码,使用 jQuery 的 $.each 函数进行迭代并不是那么难看。
      【解决方案4】:

      您肯定能够匹配顶级元素。我们可以看看你正在使用的来源吗?您的代码应该可以运行,因此 HTML 本身可能存在问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-04
        • 2011-10-31
        • 2010-12-01
        • 2010-11-25
        相关资源
        最近更新 更多