2012-06-14 71 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