2011-08-26 62 views
38

其它元素之后让我们假设我有这个标记检查元素之前或jQuery的

<h3 id="first">First</h3> 
<p>Hi</p> 
<p>Hello</p> 
<h3 id="second">Second</h3> 
<p>Bye</p> 
<p>Goodbye</p> 

我如何以编程方式检查的元素,如p S的一个,是第一h3后在第二个h3之前,用jQuery?

我试图做这样的事情:

$(p).each(function(){ 
    if($(this).isAfter("#first") && $(this).isBefore("#second")) { 
    // do stuff 
    } 
}); 
+2

您是否问过它是直接在兄弟姐妹线之后或之前? –

+0

@Amin兄弟行 –

回答

43

如要查看一个元素是层出不穷,你可以使用prev()prevAll()获得前一个元素(一个或多个),看看它是否匹配。

要查看元素是否在另一个之前,可以使用next()nextAll()获取下一个元素,并查看它是否匹配。

$.fn.isAfter = function(sel){ 
    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    return this.nextAll(sel).length !== 0; 
} 

DEMO:http://jsfiddle.net/bk4k7/

+4

Boo,不好回答!导致误报/不支持jQuery结果数组。请参阅http://jsfiddle.net/qw7s8bgn/请使用Marco的回答。 – nothingisnecessary

+1

也有看看球员在使用.index()元素来比较他们的位置的方法。在我看来更可读:) –

2

这里是一个fiddle

$('p').each(function() { 
    previousH3 = $(this).prevAll('h3'); 
    nextH3 = $(this).nextAll('h3'); 

    if (previousH3.length > 0 && nextH3.length > 0) { 
     $(this).css('color', 'red') 
    } 

}); 
21

可以使用index()功能:

$('p').each(function(){ 
    var index = $(this).index(); 
    if(index > $("#first").index() && index < $("#second").index()) { 
    // do stuff 
    } 
}); 
1

答案:

$.fn.isAfter = function(sel){ 
    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    return this.nextAll(sel).length !== 0; 
} 

当时选择所有以前的元素或下一个元素,无论选择(SEL),所以我提出基于类选择要素如下修改:

$.fn.isAfter = function(sel){ 
    sel = "." + sel.attr("class").replace(/ /g, "."); 

    return this.prevAll(sel).length !== 0; 
} 
$.fn.isBefore= function(sel){ 
    sel = "." + sel.attr("class").replace(/ /g, "."); 

    return this.nextAll(sel).length !== 0; 
} 
43

火箭的解决方案工作正常,如果sel是一个真正的选择,如果你传递一个jquery对象,它将不起作用。

如果你想与这两个选择和jQuery对象工作的插件,就用我的稍作修改的版本,而不是:

(function($) { 
    $.fn.isAfter = function(sel){ 
     return this.prevAll().filter(sel).length !== 0; 
    }; 

    $.fn.isBefore= function(sel){ 
     return this.nextAll().filter(sel).length !== 0; 
    }; 
})(jQuery); 

荣誉给火箭为原来的解决方案。

+0

耶!正确答案。通过测试,包括将选择器与自身进行比较:http://jsfiddle.net/k4g0339m/ – nothingisnecessary

+1

这是最好的方法+1 – jherax

+4

只在同一级别的元素工作http://jsfiddle.net/k4g0339m/19/ – forX

0

牢记火箭的答案,我更喜欢使用.index()方法类似以下内容:

$.fn.isAfter = function(sel){ 
    return $(this).index() > $(sel).index(); 
}; 
$.fn.isBefore= function(sel){ 
    return $(this).index() < $(sel).index(); 
}; 

似乎读/理解更加清晰,行选择完美的作品。