2011-08-26 67 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(); 
}; 

似乎讀/理解更加清晰,行選擇完美的作品。

相關問題