2013-02-19 1 views
0

Я знаю, что это не должно быть так сложно, но мне нужны еще две пары глаз, потому что я бью голову к стене.Невозможно получить вложенные элементы ввода таблицы в массив jQuery

У меня есть вложенная таблица с идентификатором, например:

<table id="dwMeasurements_0"> 
<tbody> 
    <tr id="tDim_0"> 
     <td colspan="2"> 
     <strong>Total Wall Length: </strong> 
     </td> 
     <td> 
     <input type="text" id="Msr_0_T1" class="dwInput" value="0"> Inches and </td> 
     <td> 
     <input type="text" id="Msr_0_T2" class="dwInput" style="margin-left:2px;" value="0"> 16ths</td> 
    </tr> 
    <tr> 
     <td colspan="4"> 
     <hr> 
     </td> 
    </tr> 
    <tr id="lDim_0_0"> 
     <td> 
      <select id="ItemType_0_0"> 
       <option>Item Type</option> 
       <option>Door</option> 
       <option>Window</option> 
       <option>Other</option> 
      </select> 
     </td> 
     <td> 
     <label>L-Dim: </label> 
     </td> 
     <td> 
     <input type="text" id="Msr_0_0_A1" class="dwInput" value="0"> Inches and </td> 
     <td> 
     <input type="text" id="Msr_0_0_A2" class="dwInput" style="margin-left:2px;" value="0"> 16ths</td> 
    </tr> 
//MORE ROWS HERE// 
</table> 

Мой JQuery для упорядочивания текстовых входов и выбрать элементы являются следующие:

var MeasureRowCount = $("[id^='MeasureRow_']").length; //Populated by counting parent rows 
var htmlOutput = ''; 
var rowInputs,rowSelects; 
for(var r=0;r < MeasureRowCount;r++){ 
    rowInputs = $('#dwMeasurements_'+r+' :input').serializeArray(); 
    rowSelects = $('#dwMeasurements_'+r).find('select').serializeArray(); 

      $.each(rowSelects, function(i, eSelectItem){ 
     esName = eSelectItem.name; 
     esVal = eSelectItem.value;     

        htmlOutput += //name and value from above with markup 
      } 
} 

// htmlOutput to DOM here with markup 

Я пробовал несколько методов для собирать входные элементы и не работать. Массивы выглядят пустыми. Несмотря на то, что таблица вложенна, не должна ли она работать, поскольку я напрямую вызываю вложенный идентификатор таблицы?

+0

jsfiddle и сообщения консоли – mplungjan

+1

Использование селектора типа '[id^= 'MeasureRow _']' является хорошим индикатором того, что вместо этого вы должны использовать общий класс. – Blazemonger

+0

, добавляя к тому, что сказал @Blazemonger, я не вижу, где вы используете какой-либо идентификатор с «MeasureRow_something», счетчик MeasureRowCount будет 0 – Trufa

ответ

0

Ответ не было 100% интуитивно, но я должен был знать ...

The serializeArray() метод по умолчанию для использования name:value пара, когда сбор элементов, а элементы, которые я собирал, не имели никаких атрибутов «имя», а только идентификаторов. После добавления имен массивы заполняются по желанию.

1

Этот код:

for(var r=0;r < MeasureRowCount;r++){ 
    rowInputs = $('#dwMeasurements_'+r+' :input').serializeArray(); 

будет перезаписывать Значение rowInputs каждый раз, когда он закругляется.

Попробуйте использовать jQuery.merge объединить их вместо того, чтобы:

var rowInputs=[],rowSelects=[]; 
for(var r=0;r < MeasureRowCount;r++){ 
    $.merge(rowInputs, $('#dwMeasurements_'+r+' :input').serializeArray()); 
+0

Я пробовал слияние, но все равно кубиков. Он создает массив, но он все еще остается пустым. Мне любопытно, что причиной того, что динамически созданные элементы 'input', кажется, теряют свою закрытую косую черту' /> 'в опубликованной DOM, вызывает проблему? – gtr1971

+0

Динамически созданные элементы 'input' DO имеют конечную косую черту в jQuery, которая их создает, но они, похоже, удаляются в DOM. – gtr1971

+0

Эта закрывающая косая черта не важна, кроме XHTML. Не путайте HTML-разметку (то, что вы пишете в коде) с элементами DOM (объекты, созданные браузером из HTML). – Blazemonger