2017-03-21 4 views
2

Ich habe ein Formular, und einige der Felder sind in 3 Gruppen von reduzierbaren divs gesetzt, ich möchte nach der Validierung, dass wenn irgendein Feld Fehler hat, das Elternteil eine Klasse bekommt, um es zu entfalten.jquery Klasse zum nächsten Elternteil hinzufügen

<div class="panel-group" id="fields_panel"> 
    <div class="panel panel-primary"> 
    <div id="basic_info_fields" class="panel-collapse collapse in"> <!-- add class "in" -->> 
     <div class="panel-body"> 
     <div class="row clearfix"> 
      <div class="col-md-12 m-b-0"> 
      <div class="form-group"> 
       <div class="form-line error"> <!-- if this div has "error" --> 
       </div> 
      </div> 
      </div> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 

Ich habe zwei weitere Platten mit der gleichen Struktur, eine mit ein paar Feldern Eacho, ich versuche, wenn eine form-lineerror hat zu finden und die Klasse in zum panel-collapse Eltern hängen Sie ihn zu entfalten.

Im Moment habe ich den folgenden jQuery-Code:

$(function() { 
    var elem = $('.panel').find('.form-line'); 
    if (elem.hasClass('error')) { 
     elem.closest('.panel-collapse').addClass('in'); 
    }; 
}); 

Aber es die in Klasse für alle panel-collapse gilt. Was soll ich tun, um es nur auf die Top-Level-Eltern anzuwenden, die ein Child-Element mit dieser Klasse haben, und nicht für alle Eltern?

+0

elem.parent(). parent(). parent(). parent(). übergeordnete(). parent(). find ('. panel-collapse'). addClass ('in'); (vielleicht zu viel Eltern() versuchen Sie, einige zu entfernen, wenn Sie nicht arbeiten) – Roy

Antwort

3

Ihre hasClass wird nicht funktionieren, wie elem ist ein Array von jQuery-Objekte - nicht nur eine.

Warum brauchen Sie es - warum nicht nur die Klasse in Ihrer Wähler sind:

$('.panel').find('.form-line.error').closest('.panel-collapse').addClass('in'); 

Dies hält auch Sie durch Elemente im Array Looping, die nicht die Klasse hat somit die Verbesserung der Effizienz

+1

Danke, dass deine Lösung perfekt funktioniert, um ehrlich zu sein, versuche ich Jquery zu lernen und manchmal habe ich keine Ahnung, was ich mache. –

2

Verwenden Code folgenden:

$('.panel').find('.form-line.error').each(function(){ 
    $(this).closest('.panel-collapse').addClass('in'); 
}); 

$(this) bezieht sich auf das angegebene Element, das die error Klasse.

+0

@Pete Es war eine geringfügige Vereinfachung des Codes ... Es produziert genau die gleiche Ausgabe. – mhodges

+0

@Pete Ich habe beide Antworten hochgestuft, aber ich ziehe diese immer noch vor, da sie die Mehrdeutigkeit für den Leser beseitigt. '.closes()' gibt ein einzelnes Element zurück. Wenn Sie sie jedoch in einer jQuery-Auflistung aufrufen, wird eine Sammlung zurückgegeben. Das ist internes Wissen, das der Leser im Voraus wissen muss. Das ist übrigens genau das, was das OP ausgelöst hat ... Die Verwendung von '.each()' bedeutet für den Leser sofort, dass ein oder mehrere Ergebnisse zurückgegeben werden können, und sie wollen etwas für jedes Ergebnis tun. – mhodges

+0

@Pete Zum Kopieren und Einfügen jemandes Antwort etwas so geringfügig wie ich zu ändern, ist einfach regelrecht unethisch. Wenn ich drastische Änderungen vorgenommen hätte, stimme ich zu 100% mit Ihnen überein - aber für den Schnitt, den ich gemacht habe, den Hals hinunterzuspringen, ist völlig unangebracht. – mhodges

Verwandte Themen