2012-06-14 42 views
3

虽然黑客攻击我的空闲时间项目,但我偶然发现了令人费解的jQuery行为。jQuery .closest()在自定义jQuery插件中返回多个结果

我有一个自定义验证插件编写和工作。在插件中,我想用.closest()方法实现一些功能。奇怪的是,这个方法返回多个元素。

下面是一个示例代码:

this.closest(".control-group") 
$(this).closest(".control-group"); 

上述两个行代码选择与类“控制组”所有四个元件。这段代码放在我的插件的作品中:

var element_ID = this.attr("id"); 
$("#" + element_ID).closest(".control-group") 

上面选择正确且只有一个元素为“control-group”类。

我不能使用这个“黑客”,因为并非所有我想要验证的元素都有“id”属性集,所以它在任何情况下都不起作用。

使用jQuery 1.7.2(似乎是最新的稳定版)。任何想法,为什么它是这样的?

+0

尝试的console.log(this.length),看看它指向一个以上的元素 –

回答

2

您可能没有对所有元素的ID,但你确实有this

,而不是

var element_ID = this.attr("id"); 
$("#" + element_ID).closest(".control-group") 

尝试

$(this).closest(".control-group") 

更新

jQuery的网站说, :

如果提供的jQuery代表了一组DOM元素,通过这些元件和它们的祖先 在DOM树中的 .closest()方法检索和构建从匹配 元素的新jQuery对象。 .parents()和.closest()方法在 中都相似,它们都在DOM树上遍历。 之间的差异虽然很细微,但都很显着:

最接近():返回的jQuery对象包含零个或一个元素

父母():返回的jQuery对象包含零个,一个或 多个元素

这里是链接:http://api.jquery.com/closest/

所以你原来的问题是也许没有回答

+0

对不起,忘记提及我已经尝试过,并且不起作用。我会在这个问题上加上这个。 – koniczynek

+0

在一个jQuery插件中,'this'已经是一个jQuery对象。不需要再次将它传递给jQuery。 '$(this)'与'$($('some selector'))''相同。 –

+1

由于descritipion说*从匹配的**元素构造了一个新的jQuery对象,所以文档看起来可能相互矛盾。如果目标jQuery对象拥有多个元素,它确实可以返回一个拥有多个元素的jQuery对象。 http://jsfiddle.net/BQLs6/ – Esailija

5

this是包含至少4个DOM元素的jQuery对象,并调用其上的.closest将为所有这些元素检索最接近的.control-group元素。

this.attr("id")将检索jQuery对象中的第一个DOM元素的ID,所以你可能只是做$(this[0]).closest...

+0

在上面的上下文中,**这个**是一个被验证的元素。根据.closest()文档,它在DOM树中传播,所以它应该搜索** this **元素上的元素,并返回具有与“this *”最接近的“control-group”类的元素。 *。但它返回DOM树中的所有元素。 – koniczynek

+0

@koniczynek'this'是一个jQuery对象,否则你将无法像这样调用'this.closest()'。 – Esailija

+0

我知道它已经是一个jQuery对象,主要问题是为什么.closest()在调用时返回四个元素** this.closest()**并且只有一个调用像这样** $(“#”+ this.attr (“id”))。closest()**(这是正确的行为)。 – koniczynek