Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Почему не удаляется поле инпут? (https://javascript.ru/forum/misc/9220-pochemu-ne-udalyaetsya-pole-input.html)

Amateur 05.05.2010 13:38

Почему не удаляется поле инпут?
 
Здравствуйте.
Есть код по динамическому добавлению полей:
<form>
<div id="inputi">
<div><input name="my_input"><input type="button" value="+" onclick="add_input(this.parentNode)"></div>
</div>
</form>
<script language="javascript">
// Теперь эта функция будет принимать указатель на объект, после которого нужно осуществить вставку
<script language="javascript">
// Теперь эта функция будет принимать указатель на объект, после которого нужно осуществить вставку
function add_input(obj)
{
var new_input=document.createElement('div');
new_input.innerHTML='<table border="2"><tr><td>Изображение '+(document.getElementById('inputi').getElementsByTagName('div').length + 2)+'</td><td>Описание</td></tr><tr><td><input name="picture[]" type="file" class="required"></td><td><input name="about[]" type="text" class="required">';
// Дописываем рядом с input-ом кнопку, она будет добовлять элемент именно под input, рядом с которым она находится
new_input.innerHTML=new_input.innerHTML+'<input type="button" value="+" onclick="add_input(this.parentNode)">';
// И еще одна кнопочка для его удаления.
new_input.innerHTML=new_input.innerHTML+'<input type="button" value="-" onclick="del_input(this.parentNode)"></td></tr></table>';
//Ищем присутствует ли следующий узел в структуре DOM-а
if (obj.nextSibling)
    // если да - то создаем после него
    document.getElementById('inputi').insertBefore(new_input,obj.nextSibling)
//если такого не нашлось то просто добавляем в конец
else document.getElementById('inputi').appendChild(new_input);
}
// А эта функция будет принимать указатель на объект, который нужно удалить
function del_input(obj)
{
document.getElementById('inputi').removeChild(obj)
}
</script>

<form action="1.php" name="test" id="test">
	<div id="inputi"><table border="2">
<tr><td>Изображение 1</td><td>Описание</td></tr><tr><td><input name="picture[]" type="file" class="required"></td><td><input name="about[]" type="text" class="required"><input type="button" value="+" onclick="add_input(this.parentNode)">
</td></tr></table></div></form>


В таком варианте код и добавляет и удаляет поля, кнопки добавления у удаления находятся под строкой (не в одной строке, а под ней).

Если изменить скрипт добавления полей так:

function add_input(obj)
{
var new_input=document.createElement('div');
new_input.innerHTML='<table border="2"><tr><td>Изображение '+(document.getElementById('inputi').getElementsByTagName('div').length + 2)+'</td><td>Описание</td></tr><tr><td><input name="picture[]" type="file" class="required"></td><td><input name="about[]" type="text" class="required"><input type="button" value="+" onclick="add_input(this.parentNode)"><input type="button" value="-" onclick="del_input(this.parentNode)"></td></tr></table>';
// Дописываем рядом с input-ом кнопку, она будет добовлять элемент именно под input, рядом с которым она находится
//new_input.innerHTML=new_input.innerHTML+'<input type="button" value="+" onclick="add_input(this.parentNode)">';
// И еще одна кнопочка для его удаления.
//new_input.innerHTML=new_input.innerHTML+'<input type="button" value="-" onclick="del_input(this.parentNode)"></td></tr></table>';
//Ищем присутствует ли следующий узел в структуре DOM-а
if (obj.nextSibling)
    // если да - то создаем после него
    document.getElementById('inputi').insertBefore(new_input,obj.nextSibling)
//если такого не нашлось то просто добавляем в конец
else document.getElementById('inputi').appendChild(new_input);
}

То все кнопки находятся в одной строке, но тогда не срабатывает удаление поля инпут.
Ломаю голову, но не могу понять в чем ошибка
Пожалуйста подскажите в чем ошибка и как можно ограничить количество добавления полей.

exec 05.05.2010 15:36

Цитата:

f<script
Что за чушь?

Цитата:

'+(document.getElementById('inputi')
Кавычки конфликтуют.

Kfuse 05.05.2010 16:39

Цитата:

В таком варианте код и добавляет и удаляет поля, кнопки добавления у удаления находятся под строкой (не в одной строке, а под ней).
Ну в первом варианте вы сначала пишете в innerHTML, а потом добавляете к тому же самому innerHTML ещё немножко разметки, но innerHTML уже оказывается другим.
var keke = document.createElement("div");
keke.innerHTML = "<table><tr><td>lolwut";
Что возвратит keke.innerHTML? "<table><tr><td>lolwut</td></tr></table>"
Именно поэтому и работает код удаления элемента, так как this.parentNode кнопки ссылается на нужный заключающий <div>. А во втором варианте всё добавляется верно и кнопка вставляется в мини-таблицу, но тогда this.parentNode ссылается уже на <td> и удаления не происходит.

Amateur 05.05.2010 17:51

Цитата:

Сообщение от exec
f<script

опечатки - исправил(но на результат не влияет)

Amateur 05.05.2010 17:55

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

Kfuse 05.05.2010 18:11

Ну наверное легче взять второй вариант, и пририсовать несколько дополнительных parentNode в аргуметы del_input и add_input. Типа того:
(this.parentNode.parentNode.parentNode.parentNode. parentNode). Вроде столько нужно (там же ещё tbody добавится..)

Чё-т пробел сам появляется перед последним parentNode. И кстати в форме тоже желательно аргументу add_input пару parentNode пририсовать. На функциональность это не повлияет, но неправильный, хотя и рабочий скрипт - дело некрасивое.

Amateur 05.05.2010 18:33

Цитата:

Сообщение от Kfuse
но неправильный, хотя и рабочий скрипт - дело некрасивое.

это да. добавил parentNode в add и del - теперь все нормально удаляется и добавляется. Спасибо за ответ.
Остался только один вопрос. - можно ли ограничить добавление поле (чтобы пользователь мог добавить не больше 10 полей к примеру) ?

Kfuse 05.05.2010 18:41

Можно вписать в начало функции add_input вот это.
if (document.getElementById('inputi').getElementsByTa gName('div').length > 8) return;
Выглядит, конечно, некрасиво (по многим причинам), но дело сделает.

Amateur 05.05.2010 19:09

вот за это отдельное спасибо - никто за неделю не ответил на подобный вопрос.
А по поводу "некрасиво",- главное рабочий вариант, без ошибок, а потом уже красота...
P/S/ второй раз честно заработанный "+" поставить система уже не позволяет...


Часовой пояс GMT +3, время: 13:04.