Javascript 另一个jquery动态选择器

Javascript 另一个jquery动态选择器,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,我刚才问了一个关于选择id.*形式的所有id的问题,其中*是任意字符串,id是元素的id。我得到了一个很好的工作解决方案: $("*[id^=" + id + "_]").each(function() {... // id is the element name 我现在需要更进一步: 我的所有ID都将采用以下形式:a_b_c…其中a b和c是任意性字符串(不包含“”)。因此,现在,我不需要选择表格id.*的所有元素,其中*可能是a\u b\u c…我只需要选择1级深度:即表格id\u a的所

我刚才问了一个关于选择
id.*
形式的所有id的问题,其中*是任意字符串,id是元素的id。我得到了一个很好的工作解决方案:

$("*[id^=" + id + "_]").each(function() {... // id is the element name
我现在需要更进一步: 我的所有ID都将采用以下形式:
a_b_c…
其中a b和c是任意性字符串(不包含“”)。因此,现在,我不需要选择表格
id.*
的所有元素,其中*可能是
a\u b\u c…
我只需要选择1级深度:即表格
id\u a
的所有元素。换句话说,它在下一个“”处停止。这可能吗

例如:

如果我的id是:
first
并且存在id:
第一个第二个
第一个第二个第三个
它将只选择
第一秒

我最终要做的(并且我对更快的实现持开放态度)是:


我对此并不完全满意,因为它仍然遍历所有元素(或者不管each()函数中的过滤器是什么,它都会这样做吗?)

这并没有给出完整的解决方案,但您可以尝试或

这将允许您选择元素的任何子体:

$("[id^='a_b_']").each(....
我会考虑如何删除孙辈等,但这可能会让你开始

编辑


我刚刚发现有人问了一个类似的问题——这看起来好像可以满足您的需要。

看起来您正在严重地过度复杂化这项任务。假设您的结构目前是这样的:

<div id="a">
    <div id="a_b">
        <div id="a_b_c">
        </div>
    </div>
</div>

使它更具语义和可读性。我明白你想做什么吗?可能需要进一步说明您到底在做什么

听起来您在字段的id中存储了太多的值。使用HTML5,我们现在拥有
数据-
属性

也许,您应该使用
数据-
属性之类的东西来链接它们

<div id="a">
</div>

<div id="b0" data-parentId='a'>
</div>

<div id="b1" data-parentId='a'>
</div>

<div id="b2" data-parentId='a'>
</div>

<div id="c" data-parentId='b1'>
</div>

显而易见的解决方案是更改文档,例如,而不是

<div id="a"></div>
<div id="a_b"></div>
<div id="a_b_c"></div>
(我还没有测试,所以可能会有错误,我不确定
not
是否是从结果集中减去的结果,但你知道了。)

这取决于文档结构和浏览器,这是否会比简单地遍历while集合并跳过id中有两个
\uuu
的所有内容的天真实现更快。(每个节点有大量分支是有帮助的,而且在具有jQuery可以调用的CSS3前缀选择器本机实现的浏览器上可能会更快。)


更新:修复了一些错误。根据您的结构,逻辑可能会发生变化,例如,如果
foo\u bar
始终在
foo\u bar\u baz
之前,则最里面的if分支是不必要的元素的值来识别和选择它们。实际上,我使用的是id。它们都是唯一的,那又有什么关系呢?哦,好吧。这看起来还是有点扭曲。也许你可以解释一下你试图表示的基本结构和关系。选择器模式匹配机制与实际的正则表达式匹配器。你总是可以通过一个“过滤器”调用来进行正则表达式匹配,但是如果你发布了你的页面结构,那么可能有人会建议一个更简单的替代方案。我代表的是一个树结构。所以a_b_c意味着元素有一个父a_b,父a。对于元素a(例如)它需要找到所有直接的孩子(a_x,a_y…),而不是孩子的孩子sense@aeq-如果您只想选择直接子级,为什么要正确命名ID来完成所有这些工作。为什么不使用jQuery只遍历您想要的树的一部分?(例如,.children()问题在于你对我的结构的假设(我没有详细说明的过错)。正如我在一篇评论中所说,它只是一个逻辑表。因此它没有遵循一个好的层次结构(就像你用嵌套的div显示的那样)。它相当复杂,因为树在一个表结构中(特别是行标题)因此,虽然我确信它在某种程度上可能是规则的,但使用相对模式将是非常复杂的(比我的问题的解决方案要复杂得多)。
$("#a .b").not("#a .c").show();  
<div id="a">
</div>

<div id="b0" data-parentId='a'>
</div>

<div id="b1" data-parentId='a'>
</div>

<div id="b2" data-parentId='a'>
</div>

<div id="c" data-parentId='b1'>
</div>
var childrenOfA = $("div[data-parentId='a']);
<div id="a"></div>
<div id="a_b"></div>
<div id="a_b_c"></div>
<div id="a" class="l1"></div>
<div id="a_b" class="l2"></div>
<div id="a_b_c" class="l3"></div>
var set = $('[id^='+id+'_]'), i = 0;
while (i < set.length) {
    var e = set.eq(i);
    if (e.attr('id').substr(id.length+1).match('_')) {
        set = set.not(e);
    } else {
        i++;
    }
    set = set.not($('[id^='+e.attr('id')+'_]'));
}