フォームの値を連想配列にする、そしてそのまま $.ajax()

JavaScript がなくても動く普通のフォームを非同期にするとき、JavaScript でごりごりリクエストデータを作るのはかっこ悪いので、フォームからデータを取ってきて連想配列で返すコード書いた。戻り値はそのまま $.ajax, $.get, $.post で使用可能。

function getFormValues(form) {
	var data = {};
	$(form).find("input, select, textarea").each(function() {
		var el = $(this);
		var name = el.attr("name");
		var value = el.val();
		if (typeof name === "undefined" ||
			el.attr("disabled") ||
			this.tagName.toLowerCase() === "input" && el.attr("type") === "checkbox" && !el.attr("checked")) {
			return;
		}
		if (name in data) {
			if (data[name] instanceof Array) {
				data[name].push(value);
			}
			else {
				data[name] = [data[name], value];
			}
		}
		else {
			data[name] = value;
		}
	});
	return data;
}