JQuery JSON кодирует набор входных значений - PullRequest
2 голосов
/ 22 мая 2010

Мне нужно tp сериализовать группу входных элементов, но я не могу на всю жизнь решить эту простую задачу.

Я могу успешно перебирать целевые вводы, используя:

$("#tr_Features :input").each(function() {
    ...
}

Вот мой код, который не работает:

var features = "";
$("#tr_Features :input").each(function() {
    features += {$(this).attr("name"): $(this).val()};
}

Сериализация всей формы не даст мне того, что мне нужно. Форма имеет гораздо больше, чем это подмножество входов. Кажется, это должно быть довольно простой задачей, но, очевидно, программирование в конце дня в пятницу не очень хорошая вещь.

Если это полезно, вот формы ввода, на которые я нацеливаюсь:

<table cellspacing="0" border="0" id="TblGrid_list" class="EditTable" cellpading="0">
<tbody><tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Cable Family</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:8" name="feature_id:8"></td>
</tr>
<tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Material</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:9" name="feature_id:9"></td>
</tr>
<tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Thread Size</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:10" name="feature_id:10"></td>
</tr>
<tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Attachment Style</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:11" name="feature_id:11"></td>
</tr>
<tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Feature</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:12" name="feature_id:12"></td>
</tr>
<tr class="FormData" rowpos="1">
    <td class="CaptionTD ui-widget-content">Comments</td>
    <td class="DataTD ui-widget-content" style="white-space: pre;">&nbsp;<input type="text" value="" id="feature_id:13" name="feature_id:13"></td>
</tr>

Ответы [ 4 ]

8 голосов
/ 22 мая 2010

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

Если я правильно понимаю ваш вопрос, это даст вам объект json, который вы хотите.

Обратите внимание, что для этого требуется библиотека json2.

var features = {};    // Create empty javascript object

$("#tr_Features :input").each(function() {           // Iterate over inputs
    features[$(this).attr('name')] = $(this).val();  // Add each to features object
});

var json = JSON.stringify(features); // Stringify to create json object (requires json2 library)

Спасибо R0MANARMY за указание предполагаемого формата json в вопросе.


Есть ли причина, по которой вы не используете функцию .serializeArray() в jQuery? Вы можете запустить его на подмножестве элементов вместо всей формы.

$("#tr_Features :input").serializeArray();

Из документов: http://api.jquery.com/serializeArray/

Метод .serializeArray () создает массив объектов JavaScript, готовых для кодирования в виде строки JSON.

Метод .serializeArray () может воздействовать на объект jQuery, который выбрал отдельные элементы формы, например <input>, <textarea> и <select>.

6 голосов
/ 22 мая 2010

Видимо, все, что я создавал, было объектом долгого и трудного пути. Это звучало хуже, чем следовало, но это правда. Все, что мне нужно было сделать, это использовать атрибут name в index / key и val () в качестве значения.

var data = new Object();
$("#tr_Features :input").each(function() {
    data[$(this).attr("name")] = $(this).val();
});
return data;

Это сработало. Кто знал?! Просто на самом деле. Вы получили от меня стрелку вверх за то, что вы протянули руку и пошли дальше, я звоню в пятницу. Ура! * * 1004

2 голосов
/ 22 мая 2010

+= не добавляет объекты в массивы в JavaScript.То, что вы хотите, это .push():

var features = new Array();
$("#tr_Features :input").each(function(){
    features.push({$(this).attr("name"): $(this).val()});
});

Но подождите, это еще не все!Насколько я знаю, jQuery не поддерживает преобразование объекта в строку JSON (хотя он поддерживает синтаксический анализ JSON).Для этого вам нужно использовать отдельную библиотеку JSON, например this .

2 голосов
/ 22 мая 2010

вы пытаетесь += массив ... попробуйте использовать features.push или использовать индекс из функции $.each: features[i] = someval

EDIT

Я заметил, что у вас одинаковый идентификатор для всех ваших tr с (и некоторых из ваших td с!). Это может быть причиной некоторых проблем. Убедитесь, что все ваши идентификаторы уникальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...