2011-04-09 113 views
15

如何用表單的字段和值創建對象?jQuery從表單字段創建對象

像這樣的:

{ 
    fields: 
    { 
     name: 'foo', 
     email: '[email protected]', 
     comment: 'wqeqwtwqtqwtqwet'  

    } 
} 

假設形式如下:

<form> 
    <input type="text" name="name" value="foo" /> 
    <input type="text" name="email" value="[email protected]" /> 
    <textarea name="comment">wqeqwtwqtqwtqwet</textarea> 
</form> 

我需要知道我能做到這一點對於任何形式的單一功能,而不是某一特定形成。

+0

有什麼使命?你打算如何處理這個對象? – Canuteson 2011-04-09 05:42:49

+0

我想創建一個驗證表單的ajax腳本。和一些領域取決於其他領域,所以我只是發送整個對象上的任何輸入更改... – Alex 2011-04-09 05:46:16

回答

28

你可以這樣做:

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僞選擇器。我有點驚訝地發現我寫了這個。正如它在documentation for the :input pseudo-selector中所述,使用它意味着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`... 
    } 
}); 
+0

謝謝你:P是的,我需要一個字段屬性,因爲我也傳遞其他的屬性,不想混淆它們 – Alex 2011-04-09 05:59:32

+0

您可能希望在.each之前添加.not(「按鈕」),因爲按鈕包含在輸入字段中 – Xerri 2013-05-29 15:16:01

+0

@thearchitect:因此*「選擇器將匹配按鈕;如果你想過濾出來,請檢查'this.tagName'和'this.type';見下面」* :-)(儘管我沒有看到什麼「低於「我指的是!)我很驚訝地發現自己在答案中使用了jQuery僞選擇器。我想* *是兩年前的...... – 2013-05-29 21:05:35

3

jQuery有一個連載於320交織像 $( '#myForm的')()函數。序列()

這是你在找什麼?

更新: oops,也許嘗試serializeArray(),而應該給你一個名稱和值的數組。

+0

序列化不給JSON輸出作爲OP請求 – Hussein 2011-04-09 05:45:05

+0

@Hussein謝謝,那麼也許serializeArray()將工作,我已經更新我的回答。 – albb 2011-04-09 05:54:57

11
var inputs = $("form :input"); 
var obj = $.map(inputs, function(x, y) { 
    return { 
     Key: x.name, 
     Value: $(x).val() 
    }; 
}); 
console.log(obj); 
+0

需要添加其他表單元素類型,但這很好 – Slappy 2011-04-09 05:41:00

+0

還有其他元素需要考慮,比如input,textarea – 2011-04-09 05:41:07

+0

':input'適用於所有字段,包括textarea和select。我使用':input'而不是'input'。請參閱示例http://jsfiddle.net/ASe4S/ – Hussein 2011-04-09 05:42:59

1
function formsToObj(){ 
    var forms = []; 
    $('form').each(function(i){ 
     forms[i] = {}; 
     $(this).children('input,textarea,select').each(function(){ 
      forms[i][$(this).attr('name')] = $(this).val(); 
     }); 
    }); 
    return forms; 
} 

這是一個廣義的功能,在你的頁面會爲每個窗體對象

6

由於每http://api.jquery.com/serializeArray/頁面上的評論,你可以這樣做:

(function($){ 
    $.fn.serializeJSON=function() { 
     var json = {}; 
     jQuery.map($(this).serializeArray(), function(n, i){ 
      json[n['name']] = n['value']; 
     }); 
     return json; 
    }; 
})(jQuery); 

然後做:

var obj = $('form').serializeJSON(); 

,或者如果你需要它您的fields屬性,您可以修改該功能或執行此操作:

var obj = {fields: $('form').serializeJSON()}; 

或者如果您不介意輸出格式,則可以使用serializeArray()

0

所以我總是試圖在表單提交中放置一個包裝。

這對於運行在ajax上的表單提交尤其重要。

首先要做的是抓住提交時的表單。

$(".ajax-form").submit(function(){ 
    var formObject = objectifyForm($(this).serializeArray()); 
    // Do stuff with formObject 

    // always add return false to stop the form from actually doing a post anywhere 
    return false; 
}); 

這將包裹任何形式的有一類「Ajax的形式」,併發送serializeArray到一個被稱爲客觀化形式將返回所有形式的值的目標函數。

function objectifyForm(formArray) { 
    returnArray = {}; 
    for (var i = 0; i < formArray.length; i++) { 
     returnArray[formArray[i]['name']] = formArray[i]['value']; 
    } 
    return returnArray; 
} 
0

這樣你趕上所有值從多個選擇或複選框組

function form2obj(form) { 
    var arr = $(form).serializeArray(), obj = {}; 
    for(var i = 0; i < arr.length; i++) { 
     if(obj[arr[i].name] === undefined) { 
      obj[arr[i].name] = arr[i].value; 
     } else { 
      if(!(obj[arr[i].name] instanceof Array)) { 
       obj[arr[i].name] = [obj[arr[i].name]]; 
      } 
      obj[arr[i].name].push(arr[i].value); 
     } 
    } 
    return obj; 
}; 
0

簡單的表單代碼

<form id="myForm" name="myForm"> 
    <input type="text" name="email" value="[email protected]"/> 
    <input type="checkbox" name="gender"> 
    <input type="password" name="pass" value="123"/> 
    <textarea name="message">Enter Your Message Her</textarea> 
</form> 

JavaScript代碼:

var data = {}; 
var element = document.getElementById("form").elements 
for (var i = 0; i < element.length; i++) { 
    switch (element[i].type) { 
     case "text": data[element[i].name] = element[i].value; break; 
     case "checkbox": data[element[i].name] = element[i].checked; break; 
     case "passwrod": data[element[i].name] = element[i].checked; break; 
     case "textarea": data[element[i].name] = element[i].value; break; 
    } 
}