为什么jQuery的.not()方法会删除文本节点?

时间:2012-12-04 14:36:47

标签: jquery

.not()方法需要使用selector or an object进行过滤。

元素的.contents()方法returns a jQuery object containing the children 和文本节点

当选择器用作.not()的参数时,它会删除所选元素,但所有文本节点

当一个对象被用作.not()的争论时,它会删除该对象但文本节点。

示例:

<p>This is a <span id="aSpan">paragraph</span> tag</p>

$("p").contents().not("span");
> []

但是!

var $sp = $("p span");
$("p").contents().not($sp);
> ["This is a ", " tag"]

var sp = document.getElementById("aSpan");
$("p").contents().not(sp);
> ["This is a ", " tag"]

为什么文本节点由“span”选择器(或任何其他选择器)选择,而不是由对象实例选择?

1 个答案:

答案 0 :(得分:3)

这种情况发生的原因可以追溯到3年前制作的this particular edit。它统一了.filter().not()方法,大大简化了两者,因为它们实际上是彼此的对立面。

在上述编辑之前,如果选择器只是一个字符串,那么.not()会在内部调用.filter(),因此它会在过滤后的集合(即.nodeType === 1)上运行this revision 4年前制作的。

这意味着 - 基于您的代码示例 - 在编辑.not(object)之前也会返回一个空集合,这似乎比其当前行为更合乎逻辑。

现在,.not(object).filter(object)都对未经过滤的集合进行操作,但只有前一种方法会表现出行为差异。