Sie können dies tun:
var fields = {};
$("#theForm").find(":input").each(function() {
// The selector will match buttons; if you want to filter
// them out, check `this.tagName` and `this.type`; see
// below
fields[this.name] = $(this).val();
});
var obj = {fields: fields}; // You said you wanted an object with a `fields` property, so...
Beachten Sie, dass Formulare Felder mit sich wiederholenden Namen haben können, und dass das, was Sie vorhaben, dies nicht unterstützt. Außerdem ist die Bestellung von Feldern in HTML-Formularen kann erheblich sein. (Dies sind beides Gründe, die serializeArray
so funktioniert.)
Beachten Sie, dass es in HTML üblich ist, deaktivierte Felder wegzulassen. Wenn Sie dies tun möchten, überprüfen Sie this.disabled
bevor Sie den Wert ebenfalls erfassen.
Beachten Sie, dass die oben (vor zwei Jahren geschrieben) verwendet eine jQuery Pseudo-Selektor. Ich bin ein wenig überrascht, dass ich das geschrieben habe. Wie es in der Dokumentation für die :input
Pseudo-Selektor bedeutet dies, dass jQuery den Selektor nicht an den Browser weitergeben kann. querySelectorAll
(über die inzwischen fast alle Browser verfügen).
Heutzutage würde ich wahrscheinlich schreiben:
$("#theForm").find("input, textarea, select, button")...
... wenn ich Knöpfe wollte, oder wenn nicht, dann
$("#theForm").find("input, textarea, select")...
...und dann herausfiltern input[type="button"]
y input[type="submit"]
innerhalb der each
. Z. B. (überhaupt keine Tasten):
$("#theForm").find("input, textarea, select").each(function() {
var inputType = this.tagName.toUpperCase() === "INPUT" && this.type.toUpperCase();
if (inputType !== "BUTTON" && inputType !== "SUBMIT") {
// ...include it, either it's an `input` with a different `type`
// or it's a `textarea` or a `select`...
}
});