|
|
|
| есть вот такая функция:
function editor(type, n) {
var n = n.parentNode.getAttribute("id");
var tr = document.getElementById(n);
var table = tr.parentNode;
if (type == 1) {
var f = tr.cloneNode(true);
f.setAttribute("id", "i" + table.childNodes.length + 1);
var input = f.getElementsByTagName("input").item(0);
input.setAttribute("value", "");
var num = f.getElementsByTagName("td").item(0);
num.innerHTML = "+";
table.insertBefore(f, tr.nextSibling);
} else {
table.removeChild(tr);
}
}
|
применяется к примерно такому xhtml:
<table class="pedit">
<tr id="i1">
<td style="width:10px;">1</td>
<td><input name="line[0][]" type="text" value="<?php"/></td>
<td style="width:35px;"><a href="javascript:void(0);" onclick="editor(1,this.parentNode);">[+]</a> / <a href="javascript:void(0);" onclick="editor(0,this.parentNode);">[-]</a></td>
</tr>
<tr id="i2">
<td style="width:10px;">2</td>
<td><input name="line[1][]" type="text" value="// encoding = 'utf-8'"/></td>
<td style="width:35px;"><a href="javascript:void(0);" onclick="editor(1,this.parentNode);">[+]</a> / <a href="javascript:void(0);" onclick="editor(0,this.parentNode);">[-]</a></td>
</tr>
</table>
|
проблема в том, что на выходе имеем в новом input поле заранее вставленный текст, не смотря на input.setAttribute("value", "");
при чем это дейтвительно только если мы создаем новый элемент на основе так же созданного через JS.
работает одинаково во всех браузерах (Opera, FF, IE, Chrome). Firebug показывает что value у input таки пустой. | |
|
|
|
|
|
|
|
для: Gemorroj
(19.01.2010 в 22:53)
| | Чудо "интеллигентности":
var n = n.parentNode.getAttribute("id");
var tr = document.getElementById(n);
| Сначала спрашивают - "Эй, мужик, а как тебя звать?" Тот, положим, отвечает - "Вася".
Потом к этому мужику обращаются - "Мужик, назвавший себя Вася"
Почему бы просто не написать: ???
Проблемы - в том виде, в котором вы её описали, я обнаружить, увы, не смог. У меня вновь создаваемые поля по-любому имеют пустое value.
Но возник вопрос - а зачем так много "плюсиков"?
"Минус" рядом с каждым полем понятен и нужен - по нажатию на него именно рядом лежащее поле удаляется.
Но все плюсы делают одно и то же - добавляют еще одно поле в самый низ таблицы. Так зачем их так много? Для красоты, "которая заключается в симметрии"? :-) | |
|
|
|
|
 1.5 Мб |
|
|
для: АЯ
(20.01.2010 в 00:15)
| | Спасибо за "мужика") Видимо что-то там такое делал и забыл почистить)
По поводу вставки текста в input, вот сделал видео) | |
|
|
|
|
|
|
|
для: Gemorroj
(20.01.2010 в 12:44)
| | На видео у вас работает не тот скрипт, который вы здесь выложили.
table.childNodes.length в браузере FF никак не равно количеству строк в таблице, браузер FF добавляет к "детской" коллекции тега <TBODY> ещё и текстовые ноды (переносы строк и пробелы).
Соответственно, на видео при клике на "плюс" строки с номером 10 (и с id="i10") вы должны получить новую строку c id="i121", а у вас высвечивается id="i101"
Хотя, как мне кажется, вы бы хотели получить строку с id="i11", но у вас не получается :-)
Кроме того, атрибут name у инпута новой строки повторяет значение name того инпута, по строке которого кликнули - а ведь, полагаю, вам хотелось бы, чтобы и name менялся.
В идеале, как я это понимаю, при любом добавлении/удалении строк надо, чтобы все строки на эране:
а) были ПОСЛЕДОВАТЕЛЬНО пронумерованы (innerHTML первых ячеек строк);
б) имели соответствующие ПОСЛЕДОВАТЕЛЬНО идущие id;
в) имели инпуты с соответствующими ПОСЛЕДОВАТЕЛЬНО идущими значениями name.
У вас от идеала нет НИЧЕГО.
а) вместо номеров новых строк - "плюсики" (innerHTML первых ячеек строк);
б) id строк - в идиотском порядке, ДОПУСКАЮЩЕМ повторение этих id у разных строк в любом количестве;
в) значения name у инпутов также могут быть "от балды" - номер в массиве line никогда не будет превышать номера последнего прописанного в HTML-коде - потому, видимо, вы и используете двумерный массив line
А ведь "идеала" достичь легко - надо просто использовать РЕКОМЕНДУЕМЫЕ всеми браузерами методы для работы со строками таблицы - insertRow () и deleteRow ().
Помочь? | |
|
|
|
|
|
|
|
для: АЯ
(20.01.2010 в 14:13)
| | Ну глупо было бы отказывться от помощи)
На не совсем корректные id как-то не обращал внимания, взял в скобки f.setAttribute("id","i"+(table.childNodes.length+1)); теперь идут последовательно.
name менять не нужно, у нас ведь массив, и в таком виде мне его прощще обработать PHP. Т.к. если инкрементить name то, можем заменить уже существующуюю строку, которая в редакторе не отображается.
P.S. table.childNodes.length возвращает то, что возвращает, потому, что в скрипте html код реально вытянут в 1 строку без переносов строк. | |
|
|
|
|
|
|
|
для: Gemorroj
(20.01.2010 в 22:22)
| | >"взял в скобки f.setAttribute("id","i"+(table.childNodes.length+1)); теперь идут последовательно."
Добавьте в вашем видеопримере одну строку, получите id="i11"
Затем удалите любую из "верхних" строк, например, с id="i3"
Снова добавьте строку - какой у неё будет id? Правильно, опять будет id="i11".
Два раза подряд одиннадцать без тройки - это разве "последовательно"? :-)
Повторив эту операцию 10 раз, вы получите всё существующие строки (и любое количество вновь добавляемых) с одним и тем же id="i11".
Классная "последовательность", ведь правда :-)
---
>"name менять не нужно, у нас ведь массив, и в таком виде мне его прощще обработать PHP."
Массив у вас как бы двумерный, причем первый размер может остаться в каком-то единственном экземпляре (после выполнения указанного выше 10 раз).
А вполне можно сделать реальный одномерный массив с нормальными последовательными индексами.
Причём, что важно (и о чём вы сами несомненно позже задумаетесь) - реально "плюсики" должны добавлять строку не в конец таблицы, а после той строки, где "плюс" был нажат. Например, написали вы полностью всю свою программу из 525 строк и в последний момент обнаружили, что между 32-й и 33-й строкой надо бы добавить ещё одну строку (случайно пропущенную при вводе). Что будете делать? :-)) | |
|
|
|