jQuery选择器上下文与最外层元素不匹配

时间:2012-01-27 09:09:16

标签: javascript jquery

在下面的代码片段中,为什么长度为0时应为1?

var jQueryObj = $("<p>testing</p>");
// Display the length
$('body').html($("p", jQueryObj).length);
<script src="http://code.jquery.com/jquery-2.2.0.js"></script>

4 个答案:

答案 0 :(得分:3)

当您提供上下文时,您告诉jQuery在该上下文中找到p元素,因此您的选择器将查找作为上下文子级的任何p标记。

如果您向上下文添加容器,它将能够找到该元素。

&#13;
&#13;
var jQueryObj = $("<div><p>testing</p></div>");
// Display the length
$('body').html($("p", jQueryObj).length);
&#13;
<script src="http://code.jquery.com/jquery-2.2.0.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

当你将一个上下文传递给jQuery时,它等同于使用find方法,该方法查看了后代元素。来自jQuery docs

  

在内部,选择器上下文是使用.find()方法实现的,   所以$('span',this)相当于$(this).find('span')。

您的p元素不是后代,因此您需要使用filter

jQueryObj.filter("p");

filter方法将匹配的元素集减少到与选择器匹配的元素集(或传递函数定义的测试)。在您的情况下,匹配的元素集包含一个元素(p),它将与选择器匹配。

答案 2 :(得分:0)

<p>中根本没有jQueryObj元素。

使用jQueryObj作为上下文将限制搜索上下文提供的选择器。它与写作相同:

jQueryObj.find('p');

在内部,当您使用语法$(selector, context)时,jquery实际上使用.find(),如文档中所述:

  

在内部,选择器上下文是使用.find()方法实现的,   所以$('span',this)相当于$(this).find('span')。

进一步阅读:

答案 3 :(得分:0)

您正在原始<p> 中搜索<p>jQueryObj已代表<p>代码。)

由于原始<p>元素中没有<p>元素,因此您的搜索不会返回任何结果。