jQuery - 基於serializeArray的serializeObject


將表單序列化成JSON對象,注意不管是自實現的serializeObject()還是原生的serializeArray(),所要序列化的控件都必須要有name,而不是id

[javascript] view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
  1. jQuery.prototype.serializeObject=function(){  
  2.     var obj=new Object();  
  3.     $.each(this.serializeArray(),function(index,param){  
  4.         if(!(param.name in obj)){  
  5.             obj[param.name]=param.value;  
  6.         }  
  7.     });  
  8.     return obj;  
  9. };  


設有form中有username,password兩個input,看效果

$("form").serializeArray()

[{"name":"username","value":""},{"name":"password","value":""}]

$("form").serializeObject()
{"username":"","password":""}

serializeObject僅適用於name值不重復的情況,若name值重復,則取第一個


20150125更新
===========

+ 此版本不再兼容IE8
+ 修復一個邏輯錯誤

[javascript] view plain copy print ? 在CODE上查看代碼片 派生到我的代碼片
  1. $.fn.serializeObject=function(){  
  2.     var hasOwnProperty=Object.prototype.hasOwnProperty;  
  3.     return this.serializeArray().reduce(function(data,pair){  
  4.         if(!hasOwnProperty.call(data,pair.name)){  
  5.             data[pair.name]=pair.value;  
  6.         }  
  7.         return data;  
  8.     },{});  
  9. };  

另一種實現方式:

$.fn.serializeObject = function() {
var o = {};
var a = this.serializeArray();
$.each(a, function() {
if (o[this.name] !== undefined) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
return o;
};

 

在JavaScript中,可以利用表單字段的type屬性,連同name和value屬性一起實現對表單的序列哈。在編寫代碼之前,有必要搞清楚在表單提交期間,瀏覽器是怎樣將數據發送給服務器的。

  • 對表單字段的名稱和值進行URL編碼,使用和號(&)分割。
  • 不發送禁用的表單字段。
  • 只發送勾選的復選框和單選按鈕。
  • 不發送type為“reset”和“button”的按鈕。
  • 多選擇框中的每個選中的值單獨一個條目。
  • 在單擊提交按鈕提交表單的情況下,也會發送提交阿牛;否則,不發送提交按鈕。也包括type為“image”的<input>元素。
  • <select>元素的值,就是選中的<option>元素的value特性的值。如果<option>元素沒有value特性,則是<option>元素的文本值。

jQuery.serializeArray() 函數詳解

serializeArray()函數用於序列化一組表單元素,將表單內容編碼為一個JavaScript數組

serializeArray()函數常用於將表單內容序列化為JSON對象,以便於被編碼為JSON格式的字符串。

該函數會將可用於提交的每個表單控件封裝成一個Object對象,該對象有name和value屬性,對應該表單控件的name和value屬性。然后將這些Object對象封裝為一個數組並返回。

該函數不會序列化不需要提交的表單控件,這和常規的表單提交行為是一致的。例如:不在<form>標簽內的表單控件不會被提交、沒有name屬性的表單控件不會被提交、帶有disabled屬性的表單控件不會被提交、沒有被選中的表單控件不會被提交。

與常規表單提交不一樣的是:常規表單一般會提交帶有name的按鈕控件,而serializeArray()函數不會序列化帶有name的按鈕控件。更多詳情請點擊這里

該函數屬於jQuery對象(實例)。

語法

jQuery 1.2 新增該函數。

jQueryObject.serializeArray( )

返回值

serializeArray()函數的返回值為Array類型,返回將表單元素編碼后的JS數組。

示例&說明

請參考下面這段初始HTML代碼:

<form name="myForm" action="http://www.365mini.com" method="post">
   
<input name="uid" type="hidden" value="1" />
   
<input name="username" type="text" value="張三" />
   
<input name="password" type="text" value="123456" />
   
<select name="grade" id="grade">
       
<option value="1">一年級</option>
       
<option value="2">二年級</option>
       
<option value="3" selected="selected">三年級</option>
       
<option value="4">四年級</option>
       
<option value="5">五年級</option>
       
<option value="6">六年級</option>
   
</select>
   
<input name="sex" type="radio" checked="checked" value="1" />
   
<input name="sex" type="radio" value="0" />
   
<input name="hobby" type="checkbox" checked="checked" value="1" />游泳
   
<input name="hobby" type="checkbox" checked="checked" value="2" />跑步
   
<input name="hobby" type="checkbox" value="3" />羽毛球
   
<input name="btn" id="btn" type="button" value="點擊" />
</form>

對<form>元素進行序列化可以直接序列化其內部的所有表單元素。

var formArray = $("form").serializeArray();
/* 以下是序列化后的結果數組formArray的內容:
[
    { name: "uid", value: "1" },
    { name: "username", value: "張三" },
    { name: "password", value: "123456" },
    { name: "grade", value: "3" },
    { name: "sex", value: "1" },
    { name: "hobby", value: "1" },
    { name: "hobby", value: "2" }
];
*/

我們也可以直接對部分表單元素進行序列化。

var result = $(":text, select, :checkbox").serializeArray();
/* 以下是序列化后的結果數組result的內容:
[
    { name: "username", value: "張三" },
    { name: "password", value: "123456" },
    { name: "grade", value: "3" },
    { name: "hobby", value: "1" },
    { name: "hobby", value: "2" }
];
*/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM