jQuery nearest()没有抓取元素

时间:2012-12-05 17:54:17

标签: jquery

好的.closest()函数没有正确地抓取元素或AT ALL所以没有将类添加到div中。这有什么不对?

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')它仍然不会抓住它。 我正在使用validate jQuery插件。 当您开始输入时,它会在输入栏下添加此HTML:

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

任何人都在寻找正确的答案,这就是:

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

3 个答案:

答案 0 :(得分:3)

closest只在dom树上,它没有选择兄弟姐妹。

你需要

$(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 :(得分: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');

答案 2 :(得分: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或HTMLElement对象,则以下内容将起作用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的{​​{1}},则可以使用以下http://jsfiddle.net/Rdpu7/3/

form_label

如果它是其他的东西,你应该改进你的文档,我特别不能忍受没有记录参数的功能,而且我确定这是你混淆的原因。

关于以下行的原因

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') 是什么类型