Elemente in jQuery durchlaufen

Lesezeit: 4 Minuten

Benutzer-Avatar
Christian Achinger

Ich möchte die Elemente eines HTML-Formulars durchlaufen und die Werte der -Felder in einem Objekt speichern. Der folgende Code funktioniert jedoch nicht:

function config() {
    $("#frmMain").children().map(function() {
        var child = $("this");
        if (child.is(":checkbox"))
            this[child.attr("name")] = child.attr("checked");
        if (child.is(":radio, checked"))
            this[child.attr("name")] = child.val();
        if (child.is(":text"))
            this[child.attr("name")] = child.val();
        return null;
    });

Folgendes auch nicht (inspiriert von der Antwort von Jobscry):

function config() {
    $("#frmMain").children().each(function() {
        var child = $("this");
        alert(child.length);
        if (child.is(":checkbox")) {
            this[child.attr("name")] = child.attr("checked");
        }
        if (child.is(":radio, checked"))
            this[child.attr("name")] = child.val();
        if (child.is(":text"))
            this[child.attr("name")] = child.val();
    });
}

Der Alarm zeigt das immer an child.length == 0. Die manuelle Auswahl der Elemente funktioniert:

    
>>> $("#frmMain").children()
Object length=42
>>> $("#frmMain").children().filter(":checkbox")
Object length=3

Irgendwelche Tipps, wie man die Schleife richtig macht?

  • Ihr Thread hat mir gerade 20 Minuten zeilenweise Eingabefelder für mehrere Formulare erspart -_-;. +1.

    – Zeboidlund

    28. November 2011 um 18:22 Uhr

Benutzer-Avatar
imjoevasquez

glaube nicht, dass du Zitate dazu brauchst:

var child = $("this");

Versuchen:

var child = $(this);

Benutzer-Avatar
imjoevasquez

jQuery hat eine hervorragende Funktion, um eine Reihe von Elementen zu durchlaufen: .jeder()

$('#formId').children().each(
    function(){
        //access to form element via $(this)
    }
);

  • Funktioniert bei mir nicht, siehe meine Bearbeitung der Frage. Weitere Ideen?

    – Christian Aichinger

    4. Oktober 2008 um 12:23 Uhr

  • Das Formular wird wahrscheinlich einen Absatz oder etwas Ähnliches als untergeordnetes Element haben. Sie müssen sicherstellen, dass Sie nur Eingabeelemente auswählen.

    – SpoonMeiser

    4. Oktober 2008 um 18:00 Uhr

  • “children()” ruft alle DOM-Kinder innerhalb des Formulars ab, nicht die Elemente.

    – mpemburn

    1. November 2013 um 14:13 Uhr

Benutzer-Avatar
Hugo

Je nachdem, wofür Sie jedes Kind brauchen (wenn Sie es irgendwo über AJAX posten möchten), können Sie einfach tun …

$("#formID").serialize()

Es erstellt automatisch eine Zeichenfolge mit allen Werten für Sie.

Wie beim Durchlaufen von Objekten können Sie dies auch tun.

$.each($("input, select, textarea"), function(i,v) {
    var theTag = v.tagName;
    var theElement = $(v);
    var theValue = theElement.val();
});

Folgendes habe ich bisher verwendet:

var my_form = $('#form-id');
var data = {};

$('input:not([type=checkbox]), input[type=checkbox]:selected, select, textarea', my_form).each(
    function() {
        var name = $(this).attr('name');
        var val = $(this).val();

        if (!data.hasOwnProperty(name)) {
            data[name] = new Array;
        }

        data[name].push(val);
    }
);

Dies wird nur aus dem Speicher geschrieben, kann also Fehler enthalten, aber dies sollte ein aufgerufenes Objekt erzeugen data die die Werte für alle Ihre Eingaben enthält.

Beachten Sie, dass Sie mit Kontrollkästchen besonders umgehen müssen, um zu vermeiden, dass Sie die Werte von nicht aktivierten Kontrollkästchen erhalten. Dasselbe gilt wahrscheinlich für Funkeingänge.

Beachten Sie auch die Verwendung von Arrays zum Speichern der Werte, da Sie für einen Eingabenamen möglicherweise Werte von mehreren Eingaben haben (insbesondere Kontrollkästchen).

Wenn Sie die each-Funktion verwenden möchten, sollte es so aussehen:

$('#formId').children().each( 
  function(){
    //access to form element via $(this)
  }
);

Tauschen Sie einfach die schließende geschweifte Klammer gegen eine schließende Klammer aus. Danke für den Hinweis, Jobscry, du hast mir etwas Zeit gespart.

  • Warum hast du das als Antwort gepostet, wenn du sagst, dass du nur antwortest? jobscry? Es ist derselbe Code, den er gepostet hat. Dafür sind Kommentare da.

    – Shane Reustle

    23. Oktober 2010 um 18:52 Uhr

Benutzer-Avatar
Fahrrad

bei mir hat das alles nicht funktioniert. Was bei mir funktioniert hat, war etwas ganz Einfaches:

$("#formID input[type=text]").each(function() {
alert($(this).val());
});

  • Warum hast du das als Antwort gepostet, wenn du sagst, dass du nur antwortest? jobscry? Es ist derselbe Code, den er gepostet hat. Dafür sind Kommentare da.

    – Shane Reustle

    23. Oktober 2010 um 18:52 Uhr

Dies ist die einfachste Möglichkeit, ein Formular zu durchlaufen, indem nur auf die Formularelemente zugegriffen wird. Innerhalb jeder Funktion können Sie überprüfen und erstellen, was Sie wollen. Beachten Sie beim Erstellen von Objekten, dass Sie es außerhalb der einzelnen Funktionen deklarieren möchten.

BEARBEITEN
JSFIDDLE

Das Folgende wird funktionieren

$('form[name=formName]').find('input, textarea, select').each(function() {
    alert($(this).attr('name'));
});

  • $('#formId input, select, textarea') werde alles zurückgeben input Elemente im Formular, zusammen mit jedes Auswahlfeld und Textfeld auf der Seite.

    – chao

    26. März 2013 um 20:22 Uhr

  • Es verhält sich tatsächlich nicht so … Die Verwendung dieses genauen Formats in JSFiddle führte tatsächlich dazu, dass nur die Auswahl und der Textbereich widerhallten. Das Hinzufügen eines Kommas vor “Eingabe” ergibt das, was Sie sagen.

    – Scottzozer

    27. März 2013 um 12:17 Uhr

  • Wirklich? Weil jsfiddle.net/UDD7E/3 zeigt genau das was ich meinte. Beide Auswahlfelder und beide Textbereiche sind rot, obwohl sich jeweils einer außerhalb des Formulars befindet.

    – chao

    27. März 2013 um 14:19 Uhr

  • Interessant, ich bin auf andere Ergebnisse gekommen. Vielleicht liegt es daran, dass ich es auf Knopfdruck gestartet habe. Sehr eigenartig. Ich würde eine Geige hochwerfen, aber es spielt keine Rolle mehr.

    – Scottzozer

    27. März 2013 um 16:59 Uhr

  • Hab gerade die Bearbeitung bemerkt. Der neue Code sollte besser funktionieren, da Sie das Formular abrufen und abfragen (was die Abfrage auf eine Weise einschränkt, die der andere Code nicht hatte). Der Code darüber ist immer noch kaputt, und Sie möchten ihn vielleicht loswerden, aber zumindest haben Sie jetzt etwas, das funktioniert. 🙂

    – chao

    4. April 2013 um 16:10 Uhr

1145750cookie-checkElemente in jQuery durchlaufen

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy