我无法理解$("")
和$.find("")
之间的区别。当没有匹配但是你尝试对结果做某事时(例如调用toggle()
),它们的行为会有所不同。
$("").toggle(); // No error
$.find("").toggle(); // An error
$("body").find("").toggle(); // No error!
$($.find("")).toggle(); // No error
为什么呢? : - )
在我的上下文中,我有一个使用$
来全局搜索元素的函数,当没有匹配时没有问题。现在我想允许函数只搜索指定的元素(包装在jQuery对象中)。但是如果我自己通过$
,它仍然可以工作。
答案 0 :(得分:6)
$.find("")
返回一个空数组,因此在使用[].toggle()
时会因为数组没有切换方法而抛出错误。
将其包装在jQuery中,即$ like $($.find(""))
返回一个空对象Object[]
,并在jQuery对象中使用toggle()不会抛出错误。
$ .find是内部CSS选择器引擎(Sizzle),该函数只返回已找到元素的数组。它不是jQuery实例,因此没有像切换这样的jQuery原型方法。 (谢谢@dfsq)
答案 1 :(得分:1)
这是官方jQuery文档关于.find方法的说法:
获取当前匹配组中每个元素的后代 元素,由选择器,jQuery对象或元素过滤。
$ .find("")和$("")之间的区别.find("")是: $ .find开始从DOM树的最顶层遍历DOM,而$("")。find从指定的DOM元素开始遍历DOM并尝试找到它的子元素。
答案 2 :(得分:1)
实际上,toggle
是一个jQuery函数,只能在jQuery对象中使用但是$.find()
不返回jQuery对象而是返回vanilla JavaScript对象。因此错误。
然而,任何jQuery选择器都将返回一个jQuery对象,因此,如果将此$.find
转换为jQuery对象,则它可以正常工作。
您可以尝试以下代码来检查对象是否是jQuery对象。
$("#mainbar") instanceof jQuery
//Output: true
$.find("#mainbar") instanceof jQuery
//Output: false
$($.find("#mainbar")) instanceof jQuery
//Output: true
答案 3 :(得分:0)
请参阅官方jQuery文档,其中说明:
给定一个表示一组DOM元素的jQuery对象,.find()方法允许我们搜索这些元素的后代(...)
换句话说,.find()
只有在想要在已选定元素中找到的内容时才能正常工作。