2017-10-24 5 views
0

Ich würde gerne wissen, ob es möglich ist, bestimmte Elemente zwischen zwei Punkten durch das DOM zu kriechen.Wählen Sie bestimmte Elemente zwischen zwei Elementen aus [jQuery]

Im Folgenden ein Beispiel des Baumes ist, mein Wunsch ist es, alle die labels mit einem data-tagname Attribute auszuwählen, ausgehend von den input und endete am .parent. Die Idee ist dann, es als Name der Eingabe festzulegen, d. H. Name = "diary_hours_monday_start".

ich dies in einer bestimmten Art und Weise zu tun, zum Beispiel:

$('input').each(function(){ 
    $(this).attr('name', $(this).parent().parent().prev('[data-tagname]').attr('data-tagname') 
+ '_' + $(this).prev('[data-tagname]').attr('data-tagname'); //etc... 
}); 

Aber offensichtlich diese Lösung ist schrecklich, und die Struktur wird nicht immer gleich sind (einige Elemente verschachtelt 5 mal, andere 2).

TL; DR

ich entlang der Linien durchqueren, um den DOM-Baum von Punkt A, Filtern die guten Sachen aus, und Anhalten bei Punkt B nach einer Lösung gesucht Vielleicht gehen wir von A zu B und schiebe alle ausgewählten Elemente in ein leeres Array?

+0

Könnten Sie bitte kopieren + fügen Sie die HTML in die Frage ein. Es erspart Menschen, die HTML-Code eingeben müssen, um mögliche Lösungen zu testen, was zu Ungenauigkeiten führen kann. –

+0

Das gesamte Formular wird nach einer AJAX-Anfrage generiert (ich rufe eine XSD auf und verwende sie als Framework zum Erstellen von Formulareingaben usw. - Idee ist, eine Benutzeroberfläche zu erstellen, mit der XML-Dateien nach XSD-Regeln erstellt werden können). https://jsfiddle.net/jd4gh89n/6/ kann als Beispiel verwendet werden, obwohl –

Antwort

1

können Sie die .parentsUntil() Funktion die DOM von jedem INPUT zur ersten LI.parent zu durchqueren bis:

$('input').each(function() { 
    var $this = $(this); 
    var name = $this 
     .parentsUntil($this.closest('li.parent').parent(), 'li') 
     .map(
      function() { 
       return $(this).find('> label:first').attr('data-tagname'); 
      } 
     ) 
     .toArray() 
     .reverse() 
     .join('_') 
    ; 

    $this.attr('name', name); 
}); 

Da Sie die erste LI.parent aufnehmen möchten wir seine Eltern als erstes Argument zu .parentsUntil() verwenden.

Dann verwenden wir .map() alle data-tagname Attribute zu aggregieren, um sie zu einem Array typisieren, die umzukehren, und kommen sie in einen String _ als Trennzeichen verwendet wird.

Schließlich setzen wir den Namen jedes INPUT zu diesem Namen String. In Ihrem Beispiel ist das "diary_hours_monday_start".

+1

Genau wie ich dachte, das sollte funktionieren und was ich suchte. Vielen Dank für Ihre Antwort und Ihre Erklärung. –

+0

Sicher Sache! Ich bin froh, dass es geholfen hat. –

Verwandte Themen