在攻击我的空闲时间项目时,我偶然发现了一个令人费解的jQuery行为。
我有一个自定义验证插件编写和工作。在插件中,我想使用.closest()方法实现一些功能。奇怪的是,这个方法返回了多个元素。
以下是示例代码:
this.closest(".control-group")
$(this).closest(".control-group");
以上代码行都选择了“control-group”类的所有四个元素。这个代码放在我的插件中:
var element_ID = this.attr("id");
$("#" + element_ID).closest(".control-group")
Above选择正确且只有一个带有“control-group”类的元素。
我无法使用此“hack”,因为并非我要验证的所有元素都设置了“id”属性,因此它不会在所有情况下都有效。
使用jQuery 1.7.2(似乎是最新的稳定版)。任何想法为什么会这样?
答案 0 :(得分:6)
this
是一个包含至少4个DOM元素的jQuery对象,在其上调用.closest
将为所有这些元素检索最接近的.control-group
元素。
this.attr("id")
将检索jQuery对象中第一个dom元素的id,因此您可以刚刚完成$(this[0]).closest...
答案 1 :(得分: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树。两者之间的差异, 虽然微妙,但意义重大:
。 nearest():返回的jQuery对象包含零个或一个元素
。 parents():返回的jQuery对象包含零,一或 多元素
这是链接:http://api.jquery.com/closest/
所以你原来的问题可能没有回答