как сериализовать форму без jQuery?

По многим причинам (в первую очередь: изучение javascript) мне нужно сериализовать форму без jQuery и отправить полученную сериализованную структуру данных на php-страницу с помощью ajax. Сериализованные данные должны быть в формате JSON.

Как я могу это сделать?

--РЕДАКТИРОВАТЬ--

так выглядит моя форма: http://jsfiddle.net/XGD4X/

Ответ 1

Я работаю над подобной проблемой, и я согласен с тем, что стоит сначала научиться программировать, не используя фреймворк. Я использую объект данных (BP.reading) для хранения информации, в моем случае чтение кровяного давления. Затем JSON.stringify(dataObj) дозирует работу для вас.

Вот обработчик для нажатия кнопки "Сохранить", который является методом на dataObj. Примечание. Я использую форму вместо таблицы для ввода данных, но такая же идея должна применяться.

update: function () {
            var arr = document.getElementById("BP_input_form").firstChild.elements,
                request = JDK.makeAjaxPost();  // simple cross-browser httpxmlrequest with post headings preset

            // gather the data and store in this data obj
            this.name = arr[0].value.trim();
            ...
            this.systolic = arr[3].value;
            this.diastolic = arr[4].value;

            // still testing so just put server message on page
            request.callback = function (text) {
                msgDiv.innerHTML += 'server said ' + text;
            };
            // 
            request.call("BP_update_server.php", JSON.stringify(this));
        }

Я надеюсь, что это полезно

* редактировать, чтобы показать общую версию *

В моей программе я использую объекты для отправки, получения, отображения и ввода одного и того же типа данных, поэтому у меня уже есть готовые объекты. Для более быстрого решения вы можете просто использовать пустой объект и добавить к нему данные. Если данные представляют собой набор данных того же типа, просто используйте массив. Однако с объектом у вас есть полезные имена на стороне сервера. Вот более общая версия untested, но прошла jslint.

function postUsingJSON() {
    // collect elements that hold data on the page, here I have an array
    var elms = document.getElementById('parent_id').elements,
        // create a post request object
        // JDK is a namespace I use for helper function I intend to use in other
        //  programs or that i use over and over
        // makeAjaxPost returns a request object with post header prefilled
        req = JDK.makeAjaxPost(),
        // create object to hold the data, or use one you have already
        dataObj = {},   // empty object or use array dataArray = []
        n = elms.length - 1;     // last field in form

    // next add the data to the object, trim whitespace
    // use meaningful names here to make it easy on the server side
    dataObj.dataFromField0 = elms[0].value.trim();  // dataArray[0] =
    //        ....
    dataObj.dataFromFieldn = elms[n].value;

    // define a callback method on post to use the server response
    req.callback = function (text) {
        // ...
    };

    // JDK.makeAjaxPost.call(ULR, data)
    req.call('handle_post_on_server.php', JSON.stringify(dataObj));
}

Удачи.

Ответ 2

Реализация CoffeeScript возвращает строку запроса GET:

serialize = (form) ->
  enabled = [].filter.call form.elements, (node) -> not node.disabled
  pairs = [].map.call enabled, (node) ->
    encoded = [node.name, node.value].map(encodeURIComponent)
    encoded.join '='
  pairs.join '&'

Или, если вы предпочитаете карту значений ключа:

serialize = (form) ->
  data = {}
  for node in form.elements when not node.disabled and node.name
    data[node.name] = node.value
  data

Я не смотрел реализацию jQuery, поэтому гарантирована 100% совместимость.