2012-12-05 139 views
0

確定.closest()函數沒有正確抓取元素或AT ALL,所以這個類沒有被添加到div。這裏有什麼問題?jQuery最接近()不抓取元素

HTML:

<div class="half control-group"> 
     <div class="form-status"></div> 
     <?php 
     echo form_label('Username', 'username'); 
     echo form_input(array('name' => 'username', 'maxlength' => 25, 'value' => set_value('username'))); 
     ?> 
    </div> 

JQuery的:

success: function(label) { 
    $(label).text(''); 
    $(label).closest('div[class="form-status"]').addClass('success'); 
    //label.text('OK!').addClass('valid').closest('.control-group').addClass('success'); 
} 

它使文字去空白正確的,但它不會改變最接近的形式狀態的div類......我甚至試過最接近( '.form-status'),它仍然不會抓住它。 我正在使用驗證jQuery插件。 當您開始鍵入它增加了這個HTML的輸入欄下方:

<label for=​"name" generated=​"true" class=​"error valid" style>​​</label>​ 

爲尋找正確的答案,這工作:

label.closest('.control-group').find('div.form-status').addClass('success'); 

回答

3

closest僅上升DOM樹,這不是」 t選擇兄弟姐妹。

你需要

$(label).prev('div.form-status').addClass('success'); 

$('.half.control-group label').prev('div.form-status').addClass('success'); 

根據的,如果標籤VAR你得到的是一個jQuery選擇與否。

請注意,正如我以前所說,jQuery和CSS中都有一個類的直接選擇器,所以您應該更喜歡'div.form-status'而不是'div[class="form-status"]'

+1

您應該刪除您的評論下的答案。另外,可以很好地解釋'div [class =「form-status」]'是容易出錯的,因爲只要向該div添加一個新類,它就會失敗 –

+0

@JuanMendes我刪除了我的評論,但我認爲對於多於一個類的問題,你已經清楚了;) –

+0

This:$(label).prev('div.form-status')。addClass('success');仍然無法正常工作..它不會將該類添加到DIV中。而且Chrome調試器不會像jQuery搞亂一般時那樣拋出任何錯誤消息。 – Peanut

0

我測試了這一個,合作得非常好:

$('label').text(''); 
$('label').prev('div[class="form-status"]').addClass('success'); 
// ---------^---------use this if you want to add class to just previous div at 
//--------------------same level 

使用這個,如果你想在同一級別中添加類的所有div

$('label').siblings('div[class="form-status"]').addClass('success'); 
+0

它不適合我......它甚至不會改變任何具有表格身份的DIV ...... – Peanut

0

一半的問題已經解釋了,你應該使用$.prev(),因爲$.closest()不看兄弟姐妹。

然而,問題的第二部分就在這裏

// What type is label? Is it a string indicating what's in the 
// for="name"? Is it a jQuery object? a DOM object 
success: function(label) { 
    $(label).text(''); 
    $(label).closest('div[class="form-status"]').addClass('success'); 
    //label.text('OK!').addClass('valid').closest('.control-group').addClass('success'); 
} 

如果它傳遞一個jQuery或HTML元素的對象,下面的工作http://jsfiddle.net/Rdpu7/1/

success: function(label) { 
    $(label).prev('div.form-status').addClass('success'); 
    $(label).text('OK!').addClass('valid').closest('.control-group').addClass('success');   
} 

如果它傳遞的name那被傳入form_label,您可以使用以下內容http://jsfiddle.net/Rdpu7/3/

success: function(label) { 
    var label = $("label[for='"+label+"']"); 
    label.prev('div.form-status').addClass('success'); 
    label.text('OK!').addClass('valid').closest('.control-group').addClass('success'); 
} 

如果是別的東西,你應該改進你的文檔,我特別不能在沒有記錄參數的地方使用函數,我相信這是你混淆的原因。

至於爲什麼以下行工作

$('label').prev('div.form-status').addClass('success') 

這將做您的網頁,這是不太可能你想要的所有的標籤。它只適用於帶有單個標籤的示例。您的主要問題是,您不知道什麼類型的對象label是在您的成功功能