怎么来.filter可以找到一个标签而.find不能?

xzh*_*zhu 3 jquery

在Chrome控制台中尝试这两行(当然使用jQuery上下文):

$('<head><title>FooBar</title></head>').find('title')
Run Code Online (Sandbox Code Playgroud)

会屈服[],但是

$('<head><title>FooBar</title></head>').filter('title')
Run Code Online (Sandbox Code Playgroud)

[<title>?FooBar?</title>?].但在这个例子中,<title> 后代<head>,所以不应该发现使用find

有人可以解释为什么不呢?

dop*_*ner 6

因为$('<head><title>FooBar</title></head>')没有做你认为它正在做的事情.

jQuery文档解释了当你让jQuery以这种方式创建一些HTML对象时会发生什么:

如果HTML比没有属性的单个标记更复杂,就像在上面的示例中那样,元素的实际创建由浏览器的innerHTML机制处理.在大多数情况下,jQuery的创建一个新的<div>元素,并将该元素添加到HTML片段中传递当参数有一个标签的innerHTML属性(带有可选的结束标记或快速关闭) - $( "<img />" )或者$( "<img>" ),$( "<a></a>" )或者$( "<a>" )- jQuery的创建使用本机JavaScript createElement()函数的元素.

传递复杂的HTML时,某些浏览器可能无法生成完全复制所提供的HTML源的DOM.如所提到的,jQuery使用浏览器"S .innerHTML属性来解析通过HTML并将其插入到当前文档中.在此过程中,一些浏览器过滤掉某些内容,如<html>,<title><head>元素,其结果是,元件可插入不能代表传递的原始字符串.

强调补充说.

尝试$('<head><title>FooBar</title></head>')在JavaScript控制台中运行,您将看到它只返回一个<title>元素.该<head>被你的浏览器剥离出来.我在Firebug中的结果是:

Firebug中结果的屏幕截图

Filter()在元素集中搜索与选择器匹配的元素.你有一个由一个<title>元素组成的集合,因此它返回该元素.同时,Find()在<title>元素中<title>查找子元素并找不到任何返回的元素!