Tôi đã có cùng một vấn đề gần đây và đi ra với plugin .toJSON jQuery này để chuyển đổi một biểu mẫu thành một đối tượng JSON có cùng cấu trúc. Điều này cũng đặc biệt hữu ích cho các biểu mẫu được tạo động mà bạn muốn cho phép người dùng của mình thêm nhiều trường ở những nơi cụ thể.
Vấn đề là bạn thực sự có thể muốn xây dựng một biểu mẫu để nó có cấu trúc, vì vậy giả sử bạn muốn tạo một biểu mẫu nơi người dùng chèn các địa điểm yêu thích của mình trong thị trấn: bạn có thể tưởng tượng biểu mẫu này để biểu thị một <places>...</places>
phần tử XML có chứa một danh sách các địa điểm mà người dùng thích, do đó, một danh sách các <place>...</place>
yếu tố mà mỗi nơi chứa, ví dụ như một <name>...</name>
yếu tố, một <type>...</type>
yếu tố và sau đó là danh sách<activity>...</activity>
yếu tố để thể hiện các hoạt động bạn có thể thực hiện ở một nơi như vậy. Vì vậy, cấu trúc XML của bạn sẽ như thế này:
<places>
<place>
<name>Home</name>
<type>dwelling</type>
<activity>sleep</activity>
<activity>eat</activity>
<activity>watch TV</activity>
</place>
<place>...</place>
<place>...</place>
</places>
Thật tuyệt vời khi có một đối tượng JSON trong số này sẽ đại diện cho cấu trúc chính xác này để bạn có thể:
- Lưu trữ đối tượng này như trong bất kỳ cơ sở dữ liệu nào giống CouchDB
- Đọc nó từ phía máy chủ $ _POST [] của bạn và truy xuất một mảng được lồng chính xác, sau đó bạn có thể thao tác về mặt ngữ nghĩa
- Sử dụng một số tập lệnh phía máy chủ để chuyển đổi nó thành tệp XML được định dạng tốt (ngay cả khi bạn không biết cấu trúc chính xác của nó a-prori)
- Chỉ bằng cách nào đó sử dụng nó như trong bất kỳ tập lệnh máy chủ nào giống Node.js
OK, vì vậy bây giờ chúng ta cần nghĩ làm thế nào một biểu mẫu có thể biểu thị một tệp XML.
Tất nhiên <form>
thẻ là root
, nhưng sau đó chúng ta có<place>
phần tử đó là vùng chứa chứ không phải phần tử dữ liệu, vì vậy chúng ta không thể sử dụng thẻ đầu vào cho nó.
Đây là nơi <fieldset>
thẻ có ích! Chúng tôi sẽ sử dụng <fieldset>
các thẻ để thể hiện tất cả các thành phần chứa trong biểu diễn biểu mẫu / XML của chúng tôi và để có được kết quả như thế này:
<form name="places">
<fieldset name="place">
<input type="text" name="name"/>
<select name="type">
<option value="dwelling">Dwelling</option>
<option value="restoration">Restoration</option>
<option value="sport">Sport</option>
<option value="administrative">Administrative</option>
</select>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
<input type="text" name="activity"/>
</fieldset>
</form>
Như bạn có thể thấy trong biểu mẫu này, chúng tôi đang phá vỡ quy tắc của các tên duy nhất, nhưng điều này không sao vì chúng sẽ được chuyển đổi thành một mảng phần tử do đó chúng sẽ chỉ được tham chiếu bởi chỉ mục của chúng trong mảng.
Tại thời điểm này, bạn có thể thấy làm thế nào không có name="array[]"
tên giống như trong biểu mẫu và mọi thứ đều đẹp, đơn giản và ngữ nghĩa.
Bây giờ chúng tôi muốn biểu mẫu này được chuyển đổi thành một đối tượng JSON trông giống như thế này:
{'places':{
'place':[
{
'name': 'Home',
'type': 'dwelling',
'activity':[
'sleep',
'eat',
'watch TV'
]
},
{...},
{...}
]
}}
Để làm điều này, tôi đã phát triển plugin jQuery này ở đây mà ai đó đã giúp tối ưu hóa trong chuỗi Đánh giá mã này và trông như thế này:
$.fn.toJSO = function () {
var obj = {},
$kids = $(this).children('[name]');
if (!$kids.length) {
return $(this).val();
}
$kids.each(function () {
var $el = $(this),
name = $el.attr('name');
if ($el.siblings("[name=" + name + "]").length) {
if (!/radio|checkbox/i.test($el.attr('type')) || $el.prop('checked')) {
obj[name] = obj[name] || [];
obj[name].push($el.toJSO());
}
} else {
obj[name] = $el.toJSO();
}
});
return obj;
};
Tôi cũng đã thực hiện một bài đăng blog này để giải thích điều này nhiều hơn.
Điều này chuyển đổi mọi thứ trong một biểu mẫu thành JSON (thậm chí cả hộp radio và hộp kiểm) và tất cả những gì bạn còn lại phải làm là gọi
$.post('script.php',('form').toJSO(), ...);
Tôi biết có nhiều cách để chuyển đổi các biểu mẫu thành các đối tượng JSON và chắc chắn .serialize()
và .serializeArray()
hoạt động tốt trong hầu hết các trường hợp và chủ yếu được sử dụng, nhưng tôi nghĩ rằng toàn bộ ý tưởng viết một biểu mẫu dưới dạng cấu trúc XML với các tên có ý nghĩa và chuyển đổi nó thành một Đối tượng JSON được định dạng tốt rất đáng để thử, thực tế là bạn có thể thêm các thẻ đầu vào cùng tên mà không phải lo lắng là rất hữu ích nếu bạn cần truy xuất lại dữ liệu biểu mẫu được tạo động.
Tôi hi vọng điêu nay se giup được ai đo!