该.contents()方法返回一个包含 元素的子节点和文本节点的jQuery对象.
当选择器用作参数时,.not()它将删除所选元素以及所有文本节点.
当一个对象被用作争论时,.not()它会删除对象而不是文本节点.
例:
<p>This is a <span id="aSpan">paragraph</span> tag</p>
$("p").contents().not("span");
> []
Run Code Online (Sandbox Code Playgroud)
但!
var $sp = $("p span");
$("p").contents().not($sp);
> ["This is a ", " tag"]
Run Code Online (Sandbox Code Playgroud)
也
var sp = document.getElementById("aSpan");
$("p").contents().not(sp);
> ["This is a ", " tag"]
Run Code Online (Sandbox Code Playgroud)
为什么文本节点由"span"选择器(或任何其他选择器)选择,而不是由对象实例选择?
发生这种情况的原因可以追溯到三年前的这个特定编辑。它统一了.filter()和.not()方法,极大地简化了两者,因为它们实际上是彼此对立的。
在进行上述编辑之前,如果选择器不是字符串,.not()则会在内部调用,因此从4 年前的修订版开始,它将对已过滤的集合(即 )进行操作。.filter().nodeType === 1
这意味着 - 根据您的代码示例 - 在编辑之前.not(object)也会返回一个空集合,这似乎比当前的行为更合乎逻辑。
现在, 和.not(object)都.filter(object)对未过滤的集合进行操作,尽管只有前一种方法会表现出行为差异。