回答你的问题:
对于任何具有下一个兄弟元素的元素,是否可以知道下一个兄弟元素是严格的还是松散的?
与其跟随你在fiddle中的做法,是的,这是可能的。
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><!
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 ) {
if ( !guaranteedUnique[ name ] ) {
ret = jQuery.unique( ret );
}
if ( rparentsprev.test( name ) ) {
ret = ret.reverse();
}
}
return this.pushStack( ret );
}
});
~
和+
做一些事情 http://www.quirksmode.org/css/selectors/#t11 - Adam Merrifield