Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: JS клонирование ноды с изменением ее параметров
 
 автор: Gemorroj   (19.01.2010 в 22:53)   письмо автору
 
 

есть вот такая функция:
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="&lt;?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 таки пустой.

  Ответить  
 
 автор: АЯ   (20.01.2010 в 00:15)   письмо автору
 
   для: Gemorroj   (19.01.2010 в 22:53)
 

Чудо "интеллигентности":
var n = n.parentNode.getAttribute("id");
var tr = document.getElementById(n); 
Сначала спрашивают - "Эй, мужик, а как тебя звать?" Тот, положим, отвечает - "Вася".
Потом к этому мужику обращаются - "Мужик, назвавший себя Вася"

Почему бы просто не написать:
var tr = n.parentNode;
???

Проблемы - в том виде, в котором вы её описали, я обнаружить, увы, не смог. У меня вновь создаваемые поля по-любому имеют пустое value.

Но возник вопрос - а зачем так много "плюсиков"?
"Минус" рядом с каждым полем понятен и нужен - по нажатию на него именно рядом лежащее поле удаляется.
Но все плюсы делают одно и то же - добавляют еще одно поле в самый низ таблицы. Так зачем их так много? Для красоты, "которая заключается в симметрии"? :-)

  Ответить  
 
 автор: Gemorroj   (20.01.2010 в 12:44)   письмо автору
1.5 Мб
 
   для: АЯ   (20.01.2010 в 00:15)
 

Спасибо за "мужика") Видимо что-то там такое делал и забыл почистить)
По поводу вставки текста в input, вот сделал видео)

  Ответить  
 
 автор: АЯ   (20.01.2010 в 14:13)   письмо автору
 
   для: 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 ().
Помочь?

  Ответить  
 
 автор: Gemorroj   (20.01.2010 в 22:22)   письмо автору
 
   для: АЯ   (20.01.2010 в 14:13)
 

Ну глупо было бы отказывться от помощи)
На не совсем корректные id как-то не обращал внимания, взял в скобки f.setAttribute("id","i"+(table.childNodes.length+1)); теперь идут последовательно.
name менять не нужно, у нас ведь массив, и в таком виде мне его прощще обработать PHP. Т.к. если инкрементить name то, можем заменить уже существующуюю строку, которая в редакторе не отображается.
P.S. table.childNodes.length возвращает то, что возвращает, потому, что в скрипте html код реально вытянут в 1 строку без переносов строк.

  Ответить  
 
 автор: АЯ   (20.01.2010 в 22:49)   письмо автору
 
   для: 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-й строкой надо бы добавить ещё одну строку (случайно пропущенную при вводе). Что будете делать? :-))

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования