Вы можете сделать это:
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...
Помните, что формы могут иметь поля с повторяющимися именами, и то, что вы пытаетесь сделать, не поддерживает это. Кроме того, порядок полей в формах HTML может быть значительным. (Это обе причины, по которым serializeArray
работает так, как работает.)
Обратите внимание, что обычная практика HTML - пропускать отключенные поля. Если вы хотите это сделать, проверьте this.disabled
, прежде чем также получить значение.
Обратите внимание, что выше (написано два года назад) используется псевдо-селектор jQuery. Я немного удивлен, обнаружив, что я написал это. Как сказано в документации для псевдоселектора :input
, его использование означает, что jQuery не может передать селектор нативному querySelectorAll
браузера (который есть почти во всех браузерах).
В настоящее время я бы, наверное, написал:
$("#theForm").find("input, textarea, select, button")...
... если я хотел кнопки, или если нет, то
$("#theForm").find("input, textarea, select")...
... а затем отфильтруйте input[type="button"]
и input[type="submit"]
внутри each
. Например. (нет кнопок вообще):
$("#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`...
}
});