Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Динамическое добавление полей формы


Автор: Pena 16.8.2012, 14:56
Здраствуйте. Задача проста: есть форма в которой необходимой динамически добавлять поля. Я это реализовал посредствам вызова функции:
Код

var i = 0;
function ЕщёПродукт(){
 Добавка = '\\r\\n <input type="text" name="Input4Text_НаименованиеПродукта_' + i + '">\\r\\n<textarea name="Textarea_ОписаниеПродукта_' + i + '"></textarea>\\r\\n<hr>';
 document.getElementById('Div_ПереченьПродукции').innerHTML += Добавка;
 i++;
}

, но всякий раз при добавлении новых полей содержимое предыдущих теряется. Как добавлять поля без зачистки предыдущих?

Автор: нуп 16.8.2012, 15:47
Код

 var el = document.getElementById('Div_ПереченьПродукции');
el.innerHTML = el.innerHTML + 'Добавка';

Автор: Pena 17.8.2012, 09:05
А в чём разница? Попробывал и так - не работает (поля добавляются, но и предыдущие зачищаются)

Автор: ksnk 17.8.2012, 10:15
Вообще-то механика работы броузера с innerHTML довольно непроста. Настолько, что у w3c многие годы бродила идея вообще выкинуть innerHTML напрочь... Так что по возможности, следует избегать использование этого метода изменения страницы.

Вот еще пара мыслей.
  •  в форме заводится специальное метка для вставки нового элемента. К примеру - span с именем 'placetoinsertnewelements'. Тогда вставка нового элемента в новое место превращается в операцию insertBefore.
  •  Вставляемые элементы, как правило, определенного типа и дизайна. Дизайн этот находится в html файле и правиться должен именно там, а не в Javascript'е. Так что правильнее, imho, создавать новые элементы  клонируя уже существующие.
    Для этого заводим специальное место в страничке, которое будет скрыто от просмотра и в нем разместим необходимые нам заготовки элементов.
Код

<form id="justaform"...>

<input ...>
<textarea ... >

<span id="placetoinsertnewelements"></span>
</form>

<!-- clone factory -->
<div style="display:none;">

<input id="input_template">
<textarea id="textarea_template"></textarea>
</div>



Код

function append_element(template, attr){
   var    element = document.getElementById(template).cloneNode(true);
   element.removeAttribute('id');
   if(attr && typeof(attr)=='object'){
            for (var a in attr) {
               element.setAttribute(a,attr[a])
            }
   }

    return document.insertBefore(document.getElementById('placetoinsertnewelements'),element);
}


append_element('input_template',{name:'new_picture'});


Автор: нуп 17.8.2012, 10:19
Та ладно зачищаются, пример выложите

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)