Динамическое удаление строк таблицы
Здравствуйте. Требуется сделать динамическое добавление строк в таблицу на экране и динамическое удаление выбранных строк (выбор осуществляется чекбоксом). События удаления/добавления: кнопки. Добавляю так:
{
z = document.getElementById('out'); // Получаем ссылку на таблицу
d = z.insertRow(z.rows.length); // Добавляем строку
d.setAttribute("id", "row_" + nextcount);
// Формируем строку элементов управления
z = document.createElement("input"); // Чекбокс (он указывает на удаляемую строку)
z.setAttribute("type", "checkbox");
z.setAttribute("id", "check_" + nextcount);
d.appendChild(z); // Добавляем к строке
// Текст
tn1 = document.createTextNode("текст "+(counter+1)+" ");
d.appendChild(tn1); // Добавляем к строке
z = document.createElement("input"); // Строка ввода
z.setAttribute("type", "text");
z.setAttribute("name", "answer"+counter);
z.setAttribute("id", "input_" + nextcount);
d.appendChild(z); // Добавляем к строке
out.appendChild(d); // Добавляем строку к таблице
}
А вот с удалением проблема. Пробовал работать с id, однако получается слишком сложно. Решил сделать удаление с помощью pTable.deleteRow(numRow). В начале id чекбоксов совпадают с номером строки, поэтому можно считать значени чекбокса по номеру строки. Проблема в том, что после удаления части строк id чекбокса и номер строки уже никак не коррелируют, поэтому я не могу получить номер удаляемой строки (он определяется по наличию включенного чекбокса). Как можно получить значение чекбокса по номеру строки таблицы, в которой чекбокс расположен? |
Идентификаторы вообще не нужны, у каждой строки есть свойство rowIndex:
var table = document.getElementById('out');
function deleteRows(table) {
var inputs = table.getElementsByTagName("input");
var i = inputs.length;
while (i--) {
var input = inputs[i];
if (input.checked == true) {
var tr = input.parentNode.parentNode;
table.deleteRow(tr.rowIndex);
}
}
}
Можно и еще раз наверх подняться и удалить tr через обычный removeChild. Код не проверял. p.s. однобуквенные имена переменных зло |
Спасибо. Насчет rowIndex не знал. Может быть, подскажете хорошую литературу по JavaScript с подробным описанием функций?
P.S. Замечание по коду. Используя выражение var tr = input.parentNode.parentNode;я получал сообщение об ошибке. Вывел результат tr и получил, что в результате такого выражения тип tr HTMLTableElement. Я убрал один parentNode и получил уже HTMLTableRowElement, т.е. var tr = input.parentNode;В этом случае функция работает так как и надо. |
Цитата:
|
У вас input прямо в tr лежит? Вообще должно быть так:
<table>
<tr>
<td><input … /></td>
…
тогда первый раз parentNode выдаст td, а второй — tr. Литературу не знаю, почти не читал книжек по JavaScript, на этом сайте есть несколько книг, возможно, в них есть это http://javascript.ru/book |
>>Octane: "Вообще должно быть так:"
Согласен с Вашим замечанием). Я просто для теста быстро накидывал, отсюда и строки без столбцов и однобуквенные переменные... То, для чего тему открывал, сделал. Всем спасибо. |
Помогите разобраться с похожей проблемой
Добрый день. проблема такая.
есть страничка HTM, на которой отлавливается ввод с клавиатуру и пишется в строковую переменную до нажатия ENTER. Далее полученную строку мы добаляем в массив и выводим в таблицу на экране. таблица состоит из 3 столбцов. в первом: находится checkbox/ во-втором: табельный номер(но он пока не заполняется) в третьем: выводятся или данная строка или часть этой строки. мне нужно чтоб пользователь мог выделить галочками ненужную строку и по нажатию кнопки(допустим "DELETE") удалялись выбранные строки. подскажите плиз, как это можно сделать? Код прилагаю:
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<head>
<title>SAP</title>
<script language="javascript" type="text/javascript">
var char1 = '', mass = new Array(), lastn = '',
fastn = '', middlen = '', s4 = 0, s41 = 0, f = false;
var fio1 = "";
// Отлов ввода с клавы
function press(event)
{
if(event.keyCode == "13"){
mass[mass.length] = char1;
//fio()
char1 = '';
f = true;
insRow();
}else{
char1 += String.fromCharCode(event.keyCode);
}
}
// разбивание строки полученной при вводе с клавы
function fio()
{
for (i = 0; i < char1.length; i ++ )
{
// подсчет знаков "!"
if (char1.charAt(i) == '!')
{
s4 = s4 + 1;
s41 = i
}
if (s4 == 14 && i != s41) // фамилия
{
lastn += char1.charAt(i)
}
if (s4 == 15 && i != s41) // имя
{
fastn += char1.charAt(i)
}
if (s4 == 16 && i != s41) // отчество
{
middlen += char1.charAt(i)
}
}
fio1 = lastn + " " + fastn + " " + middlen;
}
// функция для добавления новой строки в таблицу на экране
function insRow()
{
var x = document.getElementById('MyTable').insertRow(0);
var k = x.insertCell(0);
var y = x.insertCell(1);
var z = x.insertCell(2);
k.innerHTML = '<td><input type="checkbox" id=checkN"' + ((mass.length) - 1) + '"></td>';
y.innerHTML = "табельный номер";
if(f){z.innerHTML = mass[mass.length-1];
f = false;
}else{z.innerHTML = fio1;}
}
function demo()
{
char1 = '!!8!!!01!001234567891!!1!0!2011-01-01!Городская больница №1!г.Москва, ул.Бутырская, д.88!123456789012345!PAULSEN!OLAF!!1965-10-12!0!ОАО Предприятие!1!01!!!!0!!!!!!!!!!!!!!!!!!!!!!2013-06-05!2013-06-12!Терапевт!Петрова В.В.!!!!!!!!!!!1994-04-22!!';
if (char1.charAt(0) == '!' && char1.charAt(1) == '!' && char1.charAt(2) == '8' && char1.charAt(3) == '!' && char1.charAt(4) == '!' && char1.charAt(5) == '!')
{
mass[mass.length] = char1;
fio();
char1 = '';
insRow();
}
}
// данная функция складывает элементы массива в строку и отправляет их на сервер
//var result = "!!8!!!";
//function sendtosap()
//{
// var r = confirm(mass[])
// result = result + '@';
// if (r == true){
// document.f1.h1.value = result;
// document.location.reload(true);
// }
// else
// result = "";
//}
</script>
</head>
<body onkeypress = "press(event)">
<H1>"SAP"</H1>
<div id="header" style="background-color:#87CEFA;">
<INPUT TYPE="button" NAME="myButton" value="Добавить строку готовую строку, вместо ввода с клавы"
onClick="demo()">
<form id="fms" method="get" action="">
<DIV style="position: absolute; top: 130px; left: 20px;
background-color: #F0FFFF ; color: navy">
<table id="MyTable" border="1">
</table>
</DIV>
</form>
<form name = "f1" method="POST" action="sapevent:longtext">
<DIV style="position: absolute; top: 80px; left: 1000px;
background-color: #7FFFD4 ; color: navy">
<INPUT TYPE="submit" value="Send text to SAP" name="cc" onclick = "sendtosap(event) ">
<br /><input type="hidden" value="" name="h1"/>
</DIV>
</form>
</body>
</html>
|
Angelo4ek88,
<!DOCTYPE html>
<html>
<head>
<title>SAP</title>
<meta charset="utf-8">
<script language="javascript" type="text/javascript">
var char1 = '', mass = new Array(), lastn = '',
fastn = '', middlen = '', s4 = 0, s41 = 0, f = false;
var fio1 = "";
// Отлов ввода с клавы
function press(event)
{
if(event.keyCode == "13"){
mass[mass.length] = char1;
//fio()
char1 = '';
f = true;
insRow();
}else{
char1 += String.fromCharCode(event.keyCode);
}
}
// разбивание строки полученной при вводе с клавы
function fio()
{
for (i = 0; i < char1.length; i ++ )
{
// подсчет знаков "!"
if (char1.charAt(i) == '!')
{
s4 = s4 + 1;
s41 = i
}
if (s4 == 14 && i != s41) // фамилия
{
lastn += char1.charAt(i)
}
if (s4 == 15 && i != s41) // имя
{
fastn += char1.charAt(i)
}
if (s4 == 16 && i != s41) // отчество
{
middlen += char1.charAt(i)
}
}
fio1 = lastn + " " + fastn + " " + middlen;
}
// функция для добавления новой строки в таблицу на экране
function insRow()
{
var x = document.getElementById('MyTable').insertRow(0);
var k = x.insertCell(0);
var y = x.insertCell(1);
var z = x.insertCell(2);
k.innerHTML = '<input type="checkbox" id=checkN"' + ((mass.length) - 1) + '">';
y.innerHTML = "табельный номер";
if(f){z.innerHTML = mass[mass.length-1];
f = false;
}else{z.innerHTML = fio1;}
}
function demo()
{
char1 = '!!8!!!01!001234567891!!1!0!2011-01-01!Городская больница №1!г.Москва, ул.Бутырская, д.88!123456789012345!PAULSEN!OLAF!!1965-10-12!0!ОАО Предприятие!1!01!!!!0!!!!!!!!!!!!!!!!!!!!!!2013-06-05!2013-06-12!Терапевт!Петрова В.В.!!!!!!!!!!!1994-04-22!!';
if (char1.charAt(0) == '!' && char1.charAt(1) == '!' && char1.charAt(2) == '8' && char1.charAt(3) == '!' && char1.charAt(4) == '!' && char1.charAt(5) == '!')
{
mass[mass.length] = char1;
fio();
char1 = '';
insRow();
}
}
// данная функция складывает элементы массива в строку и отправляет их на сервер
//var result = "!!8!!!";
//function sendtosap()
//{
// var r = confirm(mass[])
// result = result + '@';
// if (r == true){
// document.f1.h1.value = result;
// document.location.reload(true);
// }
// else
// result = "";
//}
function del_row() {
var nodeList = document.getElementsByTagName('input');
var array = Array.prototype.slice.call(nodeList);
for (var i = 0; i < array.length; i++) {
if (array[i].checked) {
var tr = array[i].parentNode.parentNode;
var parent = tr.parentNode
parent.removeChild(tr);
}
}
}</script>
</head>
<body onkeypress = "press(event)">
<H1>"SAP"</H1>
<div id="header" style="background-color:#87CEFA;">
<INPUT TYPE="button" NAME="myButton" value="Добавить строку готовую строку, вместо ввода с клавы"
onClick="demo()">
<form id="fms" method="get" action="">
<DIV style="position: absolute; top: 130px; left: 20px;
background-color: #F0FFFF ; color: navy">
<table id="MyTable" border="1">
</table>
<input name="" type="button" value="del_check_row" onclick="del_row()">
</DIV>
</form>
<form name = "f1" method="POST" action="sapevent:longtext">
<DIV style="position: absolute; top: 80px; left: 1000px;
background-color: #7FFFD4 ; color: navy">
<INPUT TYPE="submit" value="Send text to SAP" name="cc" onclick = "sendtosap(event) ">
<br /><input type="hidden" value="" name="h1"/>
</DIV>
</form>
</DIV>
</body>
</html>
|
Angelo4ek88,
зачем теги td в Цитата:
|
Цитата:
но Спасибо огромное что отозвались на мой крик о помощи.. просто уже мозг вскипел а результата не было.. |
сейчас попробую ваш вариант, надеюсь получится.. но скорее всего без пояснений я не разберусь))
|
Посмотрел...
ДА ладно!!!! не может быть так просто... РАБОТАЕТ!!!! ВЫ просто меня спасили! СПС Огромное! |
рони,
Еще раз спасибо... А могли бы вы пояснить то как работает ваша функция? и почему именно это в ней используется... для меня это просто шаманский-непонятный текст..
function del_row()
{
var checks = document.querySelectorAll('input:checked');
for (var i = 0, check; check = checks[i]; i++) {
var tr = check.parentNode.parentNode;
var parent = tr.parentNode
parent.removeChild(tr);
}
}
|
SOS!! help!!!
Я конечно глубоко извиняюсь но проблема такая.
Вот код который получился.. он прекрасно работает в "Chrome", но оказалось, что необходимо открывать эту страничку через IE(Internet Explorer) а там, на удивление, функция удаления строк не работает(( :( говорит "Ошибка на странице" и ссылается вроде как на эту строчку:
var checks = document.querySelectorAll('input:checked');
Вот сам код страницы:
<!DOCTYPE html>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<head>
<title>SAP</title>
<script language="javascript" type="text/javascript">
var char1 = '', mass = new Array(), lastn = '',
fastn = '', middlen = '', s4 = 0, s41 = 0, f = false;
var fio1 = "";
// Функция отлова нажатых клавиш с клавы
function press(event)
{
if(event.keyCode == "13"){
mass[mass.length] = char1;
//fio()
char1 = '';
f = true;
insRow();
}else{
char1 += String.fromCharCode(event.keyCode);
}
}
// функция для доставания ФИО из вводимой строки
function fio()
{
for (i = 0; i < char1.length; i ++ )
{
if (char1.charAt(i) == '!')
{
s4 = s4 + 1;
s41 = i
}
if (s4 == 14 && i != s41) // фамилия
{
lastn += char1.charAt(i)
}
if (s4 == 15 && i != s41) // имя
{
fastn += char1.charAt(i)
}
if (s4 == 16 && i != s41) // отчество
{
middlen += char1.charAt(i)
}
}
fio1 = lastn + " " + fastn + " " + middlen;
}
// функция вставки строки в таблицу
function insRow()
{
var x = document.getElementById('MyTable').insertRow(0);
var k = x.insertCell(0);
var y = x.insertCell(1);
var z = x.insertCell(2);
k.innerHTML = '<td><input type="checkbox" id=checkboxN"' + ((mass.length) - 1) + '"></td>';
y.innerHTML = "номер";
if(f){z.innerHTML = mass[mass.length-1];
f = false;
}else{z.innerHTML = fio1;}
}
function demo()
{
char1 = '!!8!!!!!!1!0!!!!!PAULSEN!OLAF!!1965-10-12!0!!1!!!!!!0!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!';
if (char1.charAt(0) == '!' && char1.charAt(1) == '!' && char1.charAt(2) == '8' && char1.charAt(3) == '!' && char1.charAt(4) == '!' && char1.charAt(5) == '!')
{
mass[mass.length] = char1;
fio();
char1 = '';
insRow();
}
}
// функция для удаления
function del_row()
{
var checks = document.querySelectorAll('input:checked');
for (var i = 0, check; check = checks[i]; i++) {
var tr = check.parentNode.parentNode;
var parent = tr.parentNode
parent.removeChild(tr);
}
}
// функция для отправки данных на сервер
var finishstr = "";
function sendtosap(event)
{
for (i=0;i<(mass.length); i ++ )
{
finishstr += mass[i];
if (i==mass.length-1)
{
finishstr += '@';
}
else
{
finishstr += '$';
}
}
var r = confirm("You sure send to SAP?")
if (r == true){
document.f1.h1.value = finishstr;
document.location.reload(true);
}else{
finishstr = "";
}
}
</script>
</head>
<body onkeypress = "press(event)">
<H1>"SAP" sick list </H1>
<div id="header" style="background-color:#87CEFA;">
<INPUT TYPE="button" NAME="myButton" value=" добавить готовую строчку"
onClick="demo()">
<form id="fms" method="get" action="">
<DIV style="position: absolute; top: 130px; left: 20px;
background-color: #F0FFFF ; color: navy">
<table id="MyTable" border="1">
</table>
<input name="" type="button" value="del_check_row" onclick="del_row()">
</DIV>
</form>
<form name = "f1" method="POST" action="sapevent:longtext">
<DIV style="position: absolute; top: 80px; left: 1000px;
background-color: #7FFFD4 ; color: navy">
<INPUT TYPE="submit" value="Send text to SAP" name="cc" onclick = "sendtosap(event) ">
<br /><input type="hidden" value="" name="h1"/>
</DIV>
</form>
</body>
</html>
Что делать?? подскажите пожалуйста.. :help: :help: :help: :cray: |
Angelo4ek88,:cray: пост 8 обновлён -- функция находит инпуты и если чекед удаляет строку в которой этот инпут находится -- если checkbox гдето ещё есть кроме таблицы уточните сами где их искать. http://learn.javascript.ru/searching-elements-dom
function del_row() {
var nodeList = document.getElementsByTagName('input');
var array = Array.prototype.slice.call(nodeList);
for (var i = 0; i < array.length; i++) {
if (array[i].checked) {
var tr = array[i].parentNode.parentNode;
var parent = tr.parentNode
parent.removeChild(tr);
}
}
}
|
Цитата:
-т.е. я понял так, что данный код работает в IE только начиная с версии 8. так? а для версий более ранних можно ли что нить придумать? --checkbox кроме таблицы, больше нигде нет... А как тогда сделать кнопку "Выделить все", чтоб она выделяла сразу все checkbox?? -- и еще вопрос.. каким методом в таблицу можно передать данные из сервера??.. |
|
| Часовой пояс GMT +3, время: 09:19. |