Отвечая на Ваш вопрос
Given any element with a next sibling is it possible to know if the next sibling is strict or loose?
, а не следуя ваш пример от скрипки, да, это возможно.
function isMyNextSiblingStrict(element)
{
return ("nodeType" in element && element.nodeType === 1 && element.nextSibling !== null && element.nextSibling.nodeType === 1);
}
Это вернет true
, когда следующий родственный такой элемент является еще одним элементом. Однако будьте осторожны с вашим примером, поскольку он неверен по вашему собственному определению, у двух пространств есть текстовый узел между ними, состоящий из белого пространства, поэтому # 1 и # 2 не являются «строгими братьями и сестрами».
<div id="container">
<span id="p1">Paragraph 1</span><!-- WHITESPACE
--><span id="p2">Paragraph 2</span>
This is just loose text.
<p id="p3">Paragraph 3</p>
</div>
Это были бы «строгие братья и сестры».
<div id="container">
<span id="p1">Paragraph 1</span><span id="p2">Paragraph 2</span>
This is just loose text.
<p id="p3">Paragraph 3</p>
</div>
редактировать - просто для удовольствия я создал расширение JQuery, который должен делать то, что вы хотите - вы можете увидеть его в вашем обновленном jsFiddle, я не проверял много, но это, кажется, работает как вы описали
$.fn.extend({
siblingsStrict: function(until, selector) {
var ret = jQuery.map(this, function(elem) {
var n = (elem.parentNode || {}).firstChild,
r = [],
contig = false;
for (; n; n = n.nextSibling) {
if (n === elem) {
contig = true;
}
else if (n.nodeType === 1 && n !== elem) {
r.push(n);
}
else if (n.nodeType === 3 && n.textContent.replace(/\s/g, "") === "") {
continue;
}
else if (n.nodeType === 3 && contig === true) {
break;
}
else if (n.nodeType === 3 && contig === false) {
r = [];
}
}
return r;
}, until);
if (name.slice(-5) !== "Until") {
selector = until;
}
if (selector && typeof selector === "string") {
ret = jQuery.filter(selector, ret);
}
if (this.length > 1) {
// Remove duplicates
if (!guaranteedUnique[ name ]) {
ret = jQuery.unique(ret);
}
// Reverse order for parents* and prev-derivatives
if (rparentsprev.test(name)) {
ret = ret.reverse();
}
}
return this.pushStack(ret);
}
});
Вы хотите сделать что-то с CSS2 селекторы '~' и '+' http://www.quirksmode.org/css/selectors/#t11 –
Я бы сказал, что лучше терминология была бы «соседние элементы «или« смежные элементы », поскольку все они являются строго родственными братьями, один - это только текстовый узел, а не узел элемента. – Klors