Очевидным решением является изменение вашего документа, например, вместо
<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>
и затем выберите $('.l2[id^=a_]')
. Если это не вариант, вы можете попробовать какую-нибудь схему сита:
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')+'_]'));
}
(я не проверял, поэтому могут быть ошибки, и я не уверен, что not
- это та, которая вычитает из результирующего набора, но вы поняли.)
Это зависит от структуры документа и браузера, будет ли это на самом деле быстрее, чем наивный смысл простого обхода во время установки и пропуска всего с двумя _
в идентификаторе. (Большое количество ветвей на узел помогает, и, вероятно, это будет быстрее в браузерах, которые имеют собственную реализацию префикса CSS3, который может вызывать jQuery.)
обновление: исправлено несколько ошибок. Логика может меняться в зависимости от вашей структуры, например, самый внутренний, если ветвь не нужна, если foo_bar
всегда предшествует foo_bar_baz
.