#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, который создавал динамический массив и сохранял значения в каждом столбце моей текущей таблицы. Затем код создал новую строку, и затем был получен доступ к массиву для повторного заполнения значений.