坚持官方的jQuery API,有没有更简洁,但不是低效率,发现比其他指定选择相匹配的元素的下一个兄弟的方式nextAll与:first伪类?
当我说官方API时,我的意思是不是黑客攻击内部,直接进入Sizzle,在混合中添加一个插件等等(如果我最终必须这样做,那就这样吧,但这不是这个问题的答案. )
例如,鉴于此结构:
<div>One</div>
<div class='foo'>Two</div>
<div>Three</div>
<div class='foo'>Four</div>
<div>Five</div>
<div>Six</div>
<div>Seven</div>
<div class='foo'>Eight</div>
Run Code Online (Sandbox Code Playgroud)
如果我有一个divin this(也许在一个click处理程序中,无论如何)并且想要找到与选择器"div.foo"匹配的下一个兄弟div,我可以这样做:
var nextFoo = $(this).nextAll("div.foo:first");
Run Code Online (Sandbox Code Playgroud)
...它有效(例如,如果我从"五"开始,它跳过"六"和"七"并为我找到"八"),但它很笨重,如果我想匹配任何一个的第一个几个选择器,它变得更加笨拙.(当然,这是一个很多更简洁比原始DOM循环将是...)
我基本上想要:
var nextFoo = $(this).nextMatching("div.foo");
Run Code Online (Sandbox Code Playgroud)
......哪里nextMatching可以接受全系列的选择器.我总是感到惊讶,next(selector)不这样做,但事实并非如此,并且文档清楚它的作用,所以......
我可以随时编写并添加它,但如果我这样做并坚持使用已发布的API,事情会变得非常低效.例如,一个天真的next循环:
jQuery.fn.nextMatching = function(selector) {
var match;
match = this.next();
while (match.length > 0 && !match.is(selector)) {
match = match.next();
}
return match;
};
Run Code Online (Sandbox Code Playgroud)
...... 明显慢于nextAll("selector:first").这并不奇怪,nextAll可以把整个事情交给Sizzle,而Sizzle已经彻底优化了.上面的天真循环创建并丢弃各种临时对象,并且每次都必须重新解析选择器,没有什么大惊喜它很慢.
当然,我不能只是抛出一个:first …
我有一个DOM的形式
<input class="parent"></div>
<input class="child"></div>
<input class="child"></div>
<input class="parent"></div>
<input class="child"></div>
...
Run Code Online (Sandbox Code Playgroud)
我知道这不是正确的,正确的方法是改革HTML,但我们说这是不可能的.
我怎样才能让jquery选择一个父母的所有孩子(即选择所有.children直到.parent)