2012-12-05 100 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是在您的成功功能