2010-12-28 5 views
2

Ich versuche ein JSON-Objekt auf dem Formular zu erstellen, das an Perl übergeben werden soll. Ich habe mehrere verschachtelte div s mit ul s ein li s, um eine sortierte Sortierung nach jQuery-ui zu ermöglichen.Jquery each() Fallback, wenn kein Ergebnis gefunden wurde

Um die sortierten li s (die sich über mehrere div s verteilt) speichern ich den folgenden Code geschrieben:

jQuery("form[name='editorview']").submit(function(event) { 
    event.preventDefault(); 
    var values = '{ '; 
    jQuery(this).find(".div_abcd").each(function(){ 
     values += '"'+this.id+'": ['; 
     jQuery(this).find("div[id^='CONT']").each(function(){ 
      values += '{"'+this.id+'": ['; 
      jQuery(this).find("li").each(function(){ 
       if (jQuery(this).not("class='placeholder'")){ 
        values += '"'+this.id+'",'; 
       } else { 
        values +='"placeholder",'; 
       } 
      }); 
      values = values.slice(0, -1); //removing trailing , 
      values +=']},'; 
     }); 
     values = values.slice(0, -1); //removing trailing , 
     values += '],'; 
    }); 
    values = values.slice(0, -1); //removing trailing , 
    values += '}'; 
    jQuery("#order").val(values); 
    document.editorview.submit(); 
}); 

Es gibt ein Maximum von 4 div s mit der Klasse div_abcd aber sie don‘ t notwendigerweise andere div s enthalten. In diesem Fall habe ich das Problem, dass die zweiten values = values.slice(0, -1); die Öffnung [ aus der Leitung

5.

entfernt Gibt es eine Möglichkeit, um ein else wenn jQuery(this).find("div[id^='CONT']").each(function(){ nicht hat nichts gefunden. Ich habe versucht, .not() zu verwenden, aber es hat nicht funktioniert.

Edit:

Auch wenn mein Problem gelöst ist, würde ich noch gerne wissen, ob es eine Möglichkeit zu wissen, wann ist die each() nicht durch noch einmal ausgeführt.

2. Edit:

Alles klar jetzt. Vielen Dank.

+0

Ich denke, eine bessere Methode, um die Werte zu einem Array zu schieben wäre, dann 'Join (',')' Wenn Sie fertig sind, müssen Sie sich keine Gedanken über nachgestellte Kommas machen. Oder tue, was Felix vorschlägt: P – Mottie

Antwort

5

Ich wette, es gibt einen besseren Weg als das Schleifen, aber für einen Anfang: Erzeuge die Saite nicht manuell!

var values = {}; 
jQuery(".div_abcd", this).each(function(){ 
    var a = values[this.id] = []; 
    jQuery("div[id^='CONT']", this).each(function(){ 
     var obj = {}; 
     obj[this.id] = jQuery("li", this).map(function() { 
      if (jQuery(this).is(".placeholder")){ 
       return "placeholder";     
      } 
      return this.id; 
     }).get(); 
     a.push(obj); 
    }); 
}); 
values = JSON.stringify(values); 

Update: Sie haben auch is() statt not()

Referenz verwenden:map, get, JSON

prüfen diese DEMO.

aktualisieren Ihre Frage zu beantworten:

können Sie immer überprüfen, wie viele Elemente ausgewählt sind, mit length:

var $elements = jQuery(this).find("div[id^='CONT']"); 
if($elements.length > 0) { 
    $elements.each(...); 
} 
else { 
    // something else 
} 
+0

Danke, das macht den gleichen Job wie meine manuell erstellen Zeichenfolge und es behebt mein Problem. Ich würde aber trotzdem gerne wissen ob es eine Möglichkeit gibt zu wissen, wann die jeweils() nicht einmal durchläuft. – Pit

+0

@Pit: Bitte sehen Sie meine aktualisierte Antwort. –

+0

Nun, ich würde deine Antwort zweimal akzeptieren, wenn ich könnte.Danke vielmals. – Pit

1

Sie können die Ergebnisse in eine Variable und überprüfen Sie die Länge der Ergebnisse. Wenn es nicht leer ist, können Sie die Schleife ausführen oder Sie können das Trimmen überspringen.

+0

Du meinst eine Variable, die ich innerhalb der einzelnen() Schleife setze, die nicht gesetzt würde, wenn ich nicht in die Schleife gehe. Und das Trimmen würde in einem erfolgen, wenn ich überprüfe, ob die Variable gesetzt ist? Es sollte funktionieren, aber ich dachte, es wäre eine geeignetere Art und Weise, es zu tun – Pit

Verwandte Themen