5

在破解我的业余项目时,我偶然发现了一个令人费解的 jQuery 行为。

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

这是一个示例代码:

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

上面两行代码都选择了类“control-group”的所有四个元素。放在我的插件中的这段代码有效:

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

上面选择了正确且只有一个具有“控制组”类的元素。

我不能使用这个“hack”,因为并非我想要验证的所有元素都设置了“id”属性,所以它不会在所有情况下都有效。

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

4

2 回答 2

6

this是一个包含至少 4 个 DOM 元素的 jQuery 对象,调用.closest它会检索所有这些元素中最接近的.control-group元素。

this.attr("id")将检索 jQuery 对象中第一个 dom 元素的 id,因此您可以完成$(this[0]).closest...

于 2012-06-14T09:27:17.400 回答
2

你可能没有所有元素的 id,但你确实有this

代替

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

尝试

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

更新

jQuery 网站说:

给定一个表示一组 DOM 元素的 jQuery 对象,.closest() 方法在 DOM 树中搜索这些元素及其祖先,并从匹配的元素构造一个新的 jQuery 对象。.parents() 和 .closest() 方法的相似之处在于它们都向上遍历 DOM 树。两者之间的差异虽然微妙,但意义重大:

. close() : 返回的 jQuery 对象包含零个或一个元素

. parents():返回的 jQuery 对象包含零个、一个或多个元素

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

所以你原来的问题可能没有回答

于 2012-06-14T09:26:49.460 回答