Метод createElement

igortik

Новичок
Метод createElement

Столкнулся с проблемой в меру незнания JS

Задача такова:

1. Есть форма <form></form>
2. Необходимо реализовать добавление в тело формы элементов <input type="file">.
3. Добавление в структуру документа должно происходить без перезагрузки страницы - динамически.
4. Кол-во элементов не ограничено!

Я делаю:

var my_div = null;
var newDiv = null;

function addElement()
{
//создаем новый элемент div и добавляем в него немного контента
newDiv = document.createElement("div");
// это ясно - мой элемент для формы
newDiv.innerHTML = "<input type=\"file\" name=\"foto\" id=\"foto\">";
// добавляем только что соданый элемент в дерево DOM
my_div = document.getElementById("content");
document.body.insertBefore(newDiv, my_div);
}
<a href="#" onClick="addElement();" style="cursor:pointer">добавить еще фото</a>
<div id="content"></div>

И что выходит у нас...
Выходит то, что элемент формы-то вставляется, НО за пределы самой формы!

Что я только не пробовал - уже даже ставил id для form, но УВЫ ...

-~{}~ 21.10.08 00:42:

Я понимаю, что делает body.insertBefore(newDiv, my_div):

body - элемент, в котором вставляем дочерный элемент
newDiv - нод, который вставляем
my_div - нод, перед котором вставляем

Все было бы просто, если я бы создал div внутри самой формы и мой эелемент был бы вставлен перед дивом, НО в форме.

Не выходит, т.к. div внутри формы не виден для скрипта! И по нажатию на кнопку ничего не происходит. Даже Firebug молчит :(
 

MiRacLe

просто Чудо
1. ты не привёл код формы, полагаю как всегда имеет место кривая вёрстка (form между tr или т.п.)
2. "Кол-во элементов не ограничено!", а имя у всех "foto" - уличная магия?
 

igortik

Новичок
MiRacLe
Ну по второму пункту еще буду дорабатывать, чтобы потом интерпретатору передать уникальные значения.

А вот что касается html, то:

<html>
<body >
<a href="#" onClick="addElement();" style="cursor:pointer">добавить еще фото</a>
<form>

<div id="content"></div>

</form>
</body>
</html>

-~{}~ 21.10.08 00:54:

Потому и понять ничего не могу, ведь лишнего ничего нет, голая страница. По сути результатом должно быть нечто:

<html>
<body >
<a href="#" onClick="addElement();" style="cursorointer">добавить еще фото</a>
<form>

<input type="file" name="foto" id="foto">
<div id="content"></div>

</form>
</body>
</html>
 

dimagolov

Новичок
igortik, а почему div ты создаешь и добавляешь через createElement/insertBefore, а input через innerHTML? и откуда идея с insertBefore? appendChild не кошерно?
 

igortik

Новичок
эммм.. получилось.

dimagolov, спасибо!

сейчас подумаю и отпишу более простой результат
 

MiRacLe

просто Чудо
а главное почему insertBefore вызывается у body, а не у form-ы ?
 

igortik

Новичок
Такс, все вышло... привожу код с пояснением.

<script type="text/javascript">

var newDiv = null;

function addElement()
{
// создаем новый элемент div
newDiv = document.createElement("div");
//создаем в диве нужный мне эелемент формы
newDiv.innerHTML = "<input type=\"file\" name=\"foto\">";
//Вставка нода
document.getElementById("content").appendChild(newDiv);
}

</script>
<a href="#" onClick="addElement();" style="cursor:pointer">добавить еще фото</a>
<form id="form" name="myform" method="post" >
<div id="content"></div>
</form>

В итоге

<div id="content"></div> в этот див вставляются элементы <input type="file" name="foto">

-~{}~ 21.10.08 01:17:

MiRacLe
Действительно, почему ? :)

Спасибо, и так верно, див родительский не нужен в этом случае:)

document.getElementById("form").insertBefore(newDiv, my_div);

-~{}~ 21.10.08 02:11:

Все ОК!

Даже счетчик поставил и передал кол-во фоток в форму для дальнейшей обработки.

<script type="text/javascript">
var my_div = null;
var newDiv = null;
var content = null;
var num = null;
var counter = null;

function addElement()
{

num++;
// создаем новый элемент div и добавляем в него поле файла
newDiv = document.createElement("div");
newDiv.innerHTML = "<input type=\"file\" name=\"foto_"+num+"\">";

// добавляем только что соданый элемент в дерево DOM
document.getElementById("foto").appendChild(newDiv);

//обновляем в форме кол-во фотографий
document.getElementById("foto_counter").innerHTML = "<input type=\"hidden\" name=\"foto_counter\" value="+num+">";

//проверяем показатели счетчика
alert(num);
}

</script>

<a href="#" onClick="addElement();">добавить еще фото</a>
<form id="form" name="myform" method="post">
<div id="foto"></div>
<div id="foto_counter"></div>
</form>

В результате получаем через ПОСТ кол-во открытых полей для загрузки файлов(фото)

А также присваиваем каждому полю файла уникальное имя.
 

MiRacLe

просто Чудо
вместо "счётчика", удобнее поменять имя поля на на foto[]
 

igortik

Новичок
MiRacLe
отличная идея!
спасибо :)

потом сделать count ? и задать в цикле-обработчике фотографий его значение?
 
Сверху