Предыдущие ответы работают нормально, ЕСЛИ рассматриваемые элементы - это братья и сестры (что они и есть в исходном вопросе), но более общее решение будет учитывать следующий сценарий:
<div id="top">
<div>
<div>
<h3 id="first">First</h3>
<p>Hi</p>
<p>Hello</p>
</div>
</div>
<div>
<h3 id="second">Second</h3>
<p>Bye</p>
<p>Goodbye</p>
</div>
</div>
Более общее решение будет:
$.extend($.fn, {
isBefore: function(sel, context) {
// Get all element within the context.
var all = $(context || document).find("*");
return all.index(this[0]) < all.index($(sel));
},
isAfter: function(sel, context) {
return !this.isBefore(sel, context);
}
});
Где «контекст» - это необязательный параметр, который просто ограничивает область поиска для jQuery для повышения производительности.Я не проводил никаких тестов, но «контекст», вероятно, не нужен, поскольку $ («*»), кажется, выполняется качественно быстро.Также обратите внимание, что index () вернет -1, если любой элемент находится вне контекста.
$("#first").isBefore("#second");
// Gives the same result as
$("#first").isBefore("#second", "#top");
Конечно, все это предполагает, что под «до» и «после» вы подразумеваете их порядок в модели документа,Если вас беспокоят их относительные позиции на дисплее, вы можете захотеть проверить координаты отображения элементов относительно документа, так как «относительные», «фиксированные» и «абсолютные» позиции CSS делают все возможное.