JavaScript очищает мои входные значения

#javascript #html

#JavaScript #HTML

Вопрос:

Я пишу простую форму на работе, используя HTML, и добавил JavaScript на страницу, чтобы пользователи могли добавлять дополнительные строки в таблицу. В этой таблице есть теги input type = «Text» и теги select. Когда пользователь нажимает кнопку, чтобы добавить строку, JavaScript добавляет строку, но очищает теги ввода и выбора.

Мой скрипт

 var x = x   1;
function another()
{ 
  x = x   1;
  y = y   1;
  var bigTable = document.getElementById("bigTable");  
  bigTable.innerHTML  = ("<TR><TD CLASS="bigTable2" ALIGN="Center"><SELECT         
    NAME="PO"   x   ""><OPTION>Select</OPTION><OPTION>1234567890</OPTION></SELECT>
    </TD><TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" NAME="SKU"   x 
      ""></TD><TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" 
    NAME="modelNum"   x   ""></TD><TD CLASS="bigTable2" ALIGN="Center"><INPUT 
    TYPE="Text" NAME="itemNum"   x   ""></TD><TD CLASS="bigTable2" 
    ALIGN="Center"><INPUT TYPE="Text" NAME="qty"   x   "" ID="qty" x "" 
    onBlur="total();"></TD></TR>");
}
  

Я не уверен, в чем здесь проблема. Является ли оператор » =» в основном сбросом моей таблицы, как это сделал бы оператор =?

РЕДАКТИРОВАТЬ: я не знаю, как отобразить весь код, но то, что отображается, — это не весь мой код. У меня есть базовая таблица, и с помощью JavaScript я использую оператор = для добавления в нее HTML.

РЕДАКТИРОВАТЬ: моя таблица такая:

 <TABLE ID="bigTable">
  <TR>
    <TH>P.O. #</TH>
    <TH>SKU #</TH>
    <TH>Model #</TH>
    <TH>Item #</TH>
    <TH>Quantity</TH>
  </TR>
  <TR>
    <TD CLASS="bigTable" ALIGN="Center">
    <SELECT NAME="PO1">
      <OPTION>Select</OPTION>
      <OPTION>1234567890</OPTION>
    </SELECT>
    </TD>
    <TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" NAME="SKU1"></TD>
    <TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" NAME="modelNum1"></TD>
    <TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" NAME="itemNum1"></TD>
    <TD CLASS="bigTable2" ALIGN="Center"><INPUT TYPE="Text" NAME="qty1" ID="qty1" onBlur="total();"></TD>
    </TR>
</TABLE>
  

Мой JavaScript копирует все между тегами. И я использую переменную x для обновления числа в именах входных данных и выпадающих списков. Переменная Y используется для увеличения функции вычисления.

Комментарии:

1. Какова структура таблицы? Не могли бы вы добавить это в сообщение, пожалуйста?

2. Даже если мой оператор = изменен на = «<BR>», мой <BR> будет вставлен, и мои входные данные будут очищены.

Ответ №1:

Когда вы редактируете innerHTML HTML-элемент, весь DOM повторно анализируется. Поскольку входные значения на самом деле не хранятся в HTML входных элементов, они очищаются.

Одним из вариантов было бы использовать манипуляции с DOM для добавления строки:

 function another(){ 
    x = x   1;
    y = y   1;
    var bigTable = document.getElementById("bigTable");  
    vat tr = document.createElement('tr');
    tr.innerHTML = ("<td class='bigTable2' align='Center'><select name='PO"   x   "'><option>select</option><option>1234567890</option></select></td>" 
        "<td class='bigTable2' align='Center'><input type='Text' name='SKU"   x   "'></td>" 
        "<td class='bigTable2' align='Center'><input type='Text' name='modelNum"   x   "'></td>" 
        "<td class='bigTable2' align='Center'><input type='Text' name='itemNum"   x   "'></td>" 
        "<td class='bigTable2' align='Center'><input type='Text' name='qty"   x   "' ID='qty"   x   "' onBlur='total();'></td>");

    bigTable.appendChild(tr);
}
  

Обратите внимание, что строка больше не содержит <tr> тега.
Этот код создает tr элемент, затем добавляет к нему строки, а затем добавляет это целое (проанализированное) tr в таблицу.

(Я также изменил теги / атрибуты на нижний регистр и заменил все " на ' , чтобы сделать его более читаемым)

Комментарии:

1. Это работает и не удаляет значения. Спасибо! Я еще немного повозлюсь с этим.

Ответ №2:

Чтобы было понятно, x = y это то же самое, что писать x = x y . Здесь происходит то, что вы перезаписываете HTML тем, что у вас было, плюс новая строка. Это очищает ваши входные данные, потому что их значения не сохраняются в HTML (когда вы вводите внутри одного из входных данных, его свойство «значение» не обновляется в фактическом HTML).

Таким образом, вы в основном перезаписываете свой HTML тем, что было там изначально, плюс некоторые добавленные узлы.

РЕДАКТИРОВАТЬ: перейдите к решению Cerbrus. Намного чище.

Комментарии:

1. insertAfter требуется элемент DOM, а не строка HTML. element.appendChild(newTR) все будет в порядке.

2. Только что заметил это. Почти забыл appendChild (использовал эту функцию довольно долгое время).

3. Я почти уверен, что оба x и y даже не используются для позиционирования строки и ячеек вновь созданной строки. Он используется только в своих атрибутах и не связан с перезаписью старых строк.

Ответ №3:

В итоге я использовал динамический код JavaScript, который создавал динамический массив и сохранял значения в каждом столбце моей текущей таблицы. Затем код создал новую строку, и затем был получен доступ к массиву для повторного заполнения значений.