2016-07-08 5 views
1

Ich arbeite an einer Joomla-Komponente und es nicht die Serialisierung meiner Formulardaten die Art, wie ich es brauche, so dass meine Lösung zu erstellen sein wird hidden textarea und befüllen Sie es mit den json-Daten, die erstellt werden, wenn das Formular auf der Client-Seite ausgefüllt wird, dann senden Sie einfach den Textbereich.Kodieren Array-Elemente in JSON mit nur JS oder anderen Client-Seiten-Bibliotheken

<input type="text" name="jform[work_experience][]employer"><input type="text" name="jform[work_experience][]position"><br/> 
    <input type="text" name="jform[work_experience][]employer"><input type="text" name="jform[work_experience][]position"><br/> 
    <input type="text" name="jform[work_experience][]employer"><input type="text" name="jform[work_experience][]position"><br/> 

Stellen Sie sich meine Form so aussieht, wo die Zahl der „Reihen“ dynamisch sind, je nachdem, wie viele der Bedürfnisse der Nutzer. Dann möchte ich diese in eine JSON-String serialisiert werden, die wie etwas aussieht:

[ 
    { 
    "employer": "apple", 
    "position": "contract killer" 
    }, 
    { 
    "employer": "microsoft", 
    "position": "bathroom attendant" 
    }, 
    { 
    "employer": "samsung", 
    "position": "window washer" 
    } 
] 

Wenn ich die Felder umbenennen müssen sie die richtige Struktur zu erhalten, so sein.

Gibt es eine jQuery-Funktion, die es mir erlauben würde, jform[work_experience] zu nehmen und einen JSON-String auszuspucken?

+0

JSON.stringify (__YOUR_JAVASCRIPT_OBJECT_OR_ARRAY__) gibt json – 25r43q

+0

@ 25r43q ich auch 'lesen. serializeArray() 'Ich denke, die Frage ist dann, wie ich nur diese Felder als ein Objekt, das ca n in diesen Funktionen verwendet werden. Ich habe vergessen zu erwähnen, dass 'jform' andere Elemente hat, die ich ignorieren möchte. – Wobbles

+0

Ich könnte ein Beispiel einreichen, wenn es in Ordnung ist, die Datenstruktur und das Markup zu ändern. Aber ich bin nicht sicher, wie in dir in der aktuellen Setup gesperrt sind – 25r43q

Antwort

1

Hier gehen Sie, fügte ich Daten-Typ, um Sachen einfacher zu wählen. Und es verwendet natives JS, so dass Sie sich keine Gedanken über Kollisionen mit Frameworks oder Bibliotheken machen sollten. Ich nehme auch an, dass die Felder zusammenkommen.

<form id="uniqueId"> 
    <input type="text" name="jform[work_experience][]employer" data-type="employer" value="apple"> 
    <input type="text" name="jform[work_experience][]position" data-type="position" value="contract killer"><br/> 

    <input type="text" name="jform[work_experience][]employer" data-type="employer" value="apples"> 
    <input type="text" name="jform[work_experience][]position" data-type="position" value="Designer"><br/> 

    <input type="text" name="jform[work_experience][]employer" data-type="employer" value="appe"> 
    <input type="text" name="jform[work_experience][]position" data-type="position" value="Sales rep"><br/> 

</form> 

JS:

var inputFields = document.querySelectorAll('#uniqueId input'); 
var dataObject = []; 
for(var x = 0 ; x < inputFields.length ; x++){ 
    if(inputFields[ x ].dataset.type === "employer"){ 
     var current = {}; 
     current.employer = inputFields[ x ].value; 
     current.position = inputFields[ x + 1 ].value; 
     dataObject.push(current); 
     x++; //skip check for next input 
    } 
} 
//verify that the object holds data. The loop assumes 
//that employer and position come in tandem 
console.log(JSON.stringify(dataObject)); 

Ausgänge:

[{ 
     "employer": "apple", 
     "position": "contract killer" 
}, { 
     "employer": "apples", 
     "position": "Designer" 
}, { 
     "employer": "appe", 
     "position": "Sales rep" 
}] 

EDIT: Feste Datenformat :)

+0

Brilliant, ich dachte, es würde zur Iteration kommen, ich hatte nur gehofft, dass es einen direkteren Weg gab. Ich glaube, mein Problem war mein Missverständnis, dass der Serializer ein mehrdimensionales Array nicht als verschachtelte Objekte sieht. – Wobbles

+0

Das ist ein Missverständnis, das ich geteilt habe, bevor ich es richtig benutzt habe. Die meisten Selektoren oder "direkten" Methoden durchlaufen jedoch auch Daten. Und um ehrlich zu sein, sind einfache Schleifen wie diese in JavaScript so schnell, dass sich kein normaler Mensch jemals um die Geschwindigkeit kümmern müsste. – 25r43q

+0

Ich gehe davon aus, dass '#unique input [name^=" jform [work_experience]] "' auch für meinen Selektor funktioniert, da das Formular auch andere Eingabeelemente enthält. – Wobbles