Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.01.2015, 00:47
Профессор
Отправить личное сообщение для javascript_pupil Посмотреть профиль Найти все сообщения от javascript_pupil
 
Регистрация: 05.07.2009
Сообщений: 222

Почему введённые в поле данные исчезают при добавлении такого же нового поля?
Всем привет!

Если в приведённом примере выбрать файл, а затем нажать на "Добавить поля", то при добавлении нового поля уже введённые данные исчезают. Что неправильно? Подскажите, пожалуйста.

<!doctype html>
<html>
<head>
<script type="text/javascript">
function addField() {
document.getElementById("file2upload").innerHTML += '<br><input type="file" multiple="multiple" name="upload_file" size="50" value="">';
}
</script>
<title>Title</title>
</head>
<body>
<form method="post" action="/upload.cgi" enctype="multipart/form-data">

Загрузить файл: <div id="file2upload"><input type="file" multiple="multiple" name="upload_file" size="50" value=""></div>
<br><a href="#" onClick="addField(); return false;">Добавить поля</a>

<input type="submit" name="abc" value="Загрузить"></form>

</body>
</html>
Ответить с цитированием
  #2 (permalink)  
Старый 29.01.2015, 01:26
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от javascript_pupil
Что неправильно?
innerHTML
Что происходит при изменении этого свойства:
1) Содержимое элемента полностью очищается. Все заполненные инпуты при этом исчезают.
2) Парсер парсит новый HTML и из него создает инпуты и все прочее.

Используй appendChild() или insertAdjacentHTML
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #3 (permalink)  
Старый 29.01.2015, 02:48
Аспирант
Отправить личное сообщение для DeV1doR Посмотреть профиль Найти все сообщения от DeV1doR
 
Регистрация: 07.12.2014
Сообщений: 30

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<script type="text/javascript">
	function addField() {

		document.getElementById("file2upload").insertAdjacentHTML('afterend','<input type="file" multiple="multiple" name="upload_file" size="50" value=""><br>');

	}

</script>

<title>Title</title>

</head>

<body>
	<form method="post" action="/upload.cgi" enctype="multipart/form-data">
	Загрузить файл: <div id="file2upload"><input type="file" multiple="multiple" name="upload_file" size="50" value=""></div>
	<br><a href="#" onClick="addField(); return false;">Добавить поля</a>
	<input type="submit" name="abc" value="Загрузить"></form>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 29.01.2015, 21:54
Профессор
Отправить личное сообщение для javascript_pupil Посмотреть профиль Найти все сообщения от javascript_pupil
 
Регистрация: 05.07.2009
Сообщений: 222

danik.js, спасибо за участие, но с appendChild() у меня почему-то не получилось.

DeV1doR, большое спасибо! Всё работает! Только я заменил 'afterend' на 'beforeEnd' и теперь все поля добавляются в конец списка. Странно, что insertAdjacentHTML я не нашел в "JavaScript Подробное руководство", Дэвид Флэнаган, 5-е издание. Тем не менее вопрос решён, ещё раз спасибо!
Ответить с цитированием
  #5 (permalink)  
Старый 29.01.2015, 21:59
Аспирант
Отправить личное сообщение для DeV1doR Посмотреть профиль Найти все сообщения от DeV1doR
 
Регистрация: 07.12.2014
Сообщений: 30

javascript_pupil,
Да, так пожалуй правильней будет, прошляпил. Сам учусь)
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2015, 22:49
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от javascript_pupil
с appendChild() у меня почему-то не получилось
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<script type="text/javascript">
    function addField() {
        var fieldset = document.getElementById("file2upload");
        var firstField = fieldset.querySelector('.field');
        var clonedField = firstField.cloneNode(true);
        clonedField.value = '';
        fieldset.appendChild(clonedField);
    }
</script>
 
<title>Title</title>
 
</head>
 
<body>
    <form method="post" action="/upload.cgi" enctype="multipart/form-data">
    Загрузить файл: <div id="file2upload">
    <div class="field">
        <input type="file" multiple="multiple" name="upload_file" size="50" />
    </div>
    </div>
    <br><a href="#" onClick="addField(); return false;">Добавить поля</a>
    <input type="submit" name="abc" value="Загрузить"></form>
</body>
</html>


При клонировании инпута его value также сохраняется. Поэтому нужно очистить .value, но тут проблемка - старые IE не дают менять value на файловых инпутах. Но тут можно что-нибудь придумать.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2015, 01:30
Профессор
Отправить личное сообщение для javascript_pupil Посмотреть профиль Найти все сообщения от javascript_pupil
 
Регистрация: 05.07.2009
Сообщений: 222

danik.js, да, круто. Оказывается есть несколько решений и у каждого свои плюсы.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти обнуление прокрутки при добавлении нового DOM-узла? webantip Общие вопросы Javascript 3 07.04.2014 16:59
автоввод даты в поле при изменении другого поля js_nub Общие вопросы Javascript 2 25.03.2013 01:49
Как правильно получить введенные данные в поле? buket jQuery 11 11.04.2010 19:59