jQuery update DOM

интернет компьютеры программирование jQuery programming

Добрый день. У меня такой вопрос:
На одной из страниц своего сайта я хочу, чтобы пользователи отправляли фотографии переменного количества (т.е. можно отправить 1 файл, можно 5, можно 15 и т.д.). Есть поле для ввода файла (type='file'), рядом кнопочка "+" (для добавления еще одного input'a для файла). Вот эта часть формы:
<input type='file' name='photo[]' value='' /> <a class='add' href='#' target='_self'><b>+</b></a>
То есть, если человек хочет добавить еще поле. он нажимает на плюсик.
jQuery код:
$(document).ready(function(){

$('.add').click(function() {
var new_input = document.createElement("input");
new_input.setAttribute('type', 'file');
new_input.setAttribute('name', 'photo[]');
new_input.setAttribute('value', '');
var new_a = document.createElement("a");
new_a.setAttribute('href', '#');
new_a.setAttribute('class', 'add');
new_a.setAttribute('target', '_self');
var new_b = document.createElement("b");
var b_inner = document.createTextNode('+');
new_b.appendChild(b_inner);
$(this).after(new_a).after(new_input).after('<br>');
new_a.appendChild(new_b);
});
});

То есть, как только готов DOM, после нажатия на элемент с классом 'add', выполняется функция, которая добавляет после кнопки "+"
<br /><input type='file' name='photo[]' value='' /> <a class='add' href='#' target='_self'><b>+</b></a>
То есть, такой же код + <br /> в начале.
Но теперь после нажатия на новый плюсик, ничего не произойдет, т.к. функция находится внутри функции $(document).ready(function(){.... для которой DOM был определен после загрузки страницы.

Соответственно вопрос - как заставить jQuery после добавления нового поля обновить DOM?

PS я знаю менее красивый способ сделать то же самое, но хотелось бы именно при помощи jQuery как-то это красиво реализвать...

Спасибо за ответы.

Примечание:
Сделал так. Слешами - то, где добавлены строки кода.
Спасибо за ответ.

$(document).ready(function(){

$('.add').click(t = function() { ////////// t =
var new_input = document.createElement("input");
new_input.setAttribute('type', 'file');
new_input.setAttribute('name', 'photo[]');
new_input.setAttribute('value', '');
var new_a = document.createElement("a");
new_a.setAttribute('href', '#');
new_a.setAttribute('class', 'add');
new_a.setAttribute('target', '_self');
var new_b = document.createElement("b");
var b_inner = document.createTextNode('+');
new_b.appendChild(b_inner);
$(this).after(new_a).after(new_input).after('<br>');
new_a.appendChild(new_b);
$('.add').click(t); ///////////////
});
});

Примечание:
Ну и ограничиваем количество прикрепляемых файлов (в моем примере - максимум 15):

$(document).ready(function(){
x=1; ///////// начальное значение счетчика 1 (т.к. уже существует одно поле для файла)
$('.add').click(t = function() {
if (x>14) break; ///////// выходим, если превышен лимит
var new_input = document.createElement("input");
new_input.setAttribute('type', 'file');
new_input.setAttribute('name', 'photo[]');
new_input.setAttribute('value', '');
var new_a = document.createElement("a");
new_a.setAttribute('href', '#');
new_a.setAttribute('class', 'add');
new_a.setAttribute('target', '_self');
var new_b = document.createElement("b");
var b_inner = document.createTextNode('+');
new_b.appendChild(b_inner);
$(this).after(new_a).after(new_input).after('<br>');
new_a.appendChild(new_b);
$('.add').click(t);
window.x++; /////// инкрементируем счетчик полей
});
});

Примечание:
По-моему довольно таки красиво. А насчет того, что в jQuery есть attr - знаю, конечно,... и пользовался миллион раз как .attr(key, value) так и setAttribute(key, value) - разница есть? :) Ну разве что написать setAttribute дольше, чем attr :)

Если я создаю элементы на native JS, то и атрибуты им задаю на native JS - не знаю почему :) наверное потому что native JS тоже забывать нельзя :) Хотя... jQuery умеет почти всё... а если и не умеет NATIVE JQUERY, то есть куча плагинов. В общем, за это, я думаю, меня строго судить не правильно :)
Ответы:
1) Проблема не в том, что бы обновить DOM,  а в том, что нужно добавить listener  на вновь созданный элемент.
$('.add').click(function()  - вот эта функция у вас выполняется один раз при загрузке DOM и имеет воздействие на уже существующие элементы. Если вы хотите добавить тот же функционал на вновь созданный элемент, нужно на него подвесить тот же обработчик.
А в случае если HTML загружается посредством $('myDiv').load() ?
попробуй использовать метод livequery
как по мне, то лучше сделать клон какого-нибудь элемента, а потом заменить значение
например:
есть html
<ul>
   <li class="leaf">
       <input type="text" disabled="disabled" value="какой-то текст"/>
<input type="image" alt="Изменить содержимое" src="/shared/images/ico_change.gif" name="submit" class="change_button" />
   </li>
   <li>
       <input type="text" size="40" /><input type="button" id="add_button" value="ok"/>
  </li>
</ul>
есть готовое поле для ввода неактивное(к примеру), и есть пустое поле для ввода с кнопкой "ок", по нажатии на кот происходит добавление содержимое пустого поля для ввода к неактивному и имеет такой же стиль и DOM. Около неактивного поля для ввода - кнопочка для редактирования неактивного, по нажатие на кот неактивное->активное. На этой кнопочке весит обработчик на jquery.Для того чтоб эта кнопка отработала в новосозданном неактивном поле, нужно чтоб был новый элемент записан в DOM. Так вот, в чем лекарство:клонируем неактивное поле с кнопкой редактировать и изменяем value у этого поля.
javascript:
$('#add_button').click(function(){
$(this).parent().prev().clone(true).insertBefore($(this).parent());
$(this).parent().prev().val($(this).prev().val());
});
Клонирует выбранные элементы DOM, и все их обработчики событий и выбирает клонированные. Это полезно при перемещении копий элементов и их обработчиков событий на другую позицию в объектной модели документа (DOM).
Думаю ты не понимаешь всю концепцию. Прочти статью, может что то прояснит
$('.add').live('click', function() {
var new_input = document.createElement("input");
new_input.setAttribute('type', 'file');
new_input.setAttribute('name', 'photo[]');
new_input.setAttribute('value', '');
var new_a = document.createElement("a");
new_a.setAttribute('href', '#');
new_a.setAttribute('class', 'add');
new_a.setAttribute('target', '_self');
var new_b = document.createElement("b");
var b_inner = document.createTextNode('+');
new_b.appendChild(b_inner);
$(this).after(new_a).after(new_input).after('<br>');
new_a.appendChild(new_b);
});
});
Для работы с объектами появившимися после чтения DOM надо использовать функцию «live»? первым атрибутом которой является событие
То есть:
$('.className').live('click', function(){
  // выполняемые действия
});


16 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.