Pull to refresh

Comments 48

Вспоминается фраза: «Что человек должен был делать с коровой, когда узнал, что она дает молоко?».
Так же и у вас xD
не понял вашего юмора ;) поясните плиз
Сам очень интересуюсь зачем это?
часто бывают ситуации когда пользователю нужно удалить ранее выбранный файл.
пользователь может передумал отсылать что-нибудь заполняя большую форму…
Ни разу не сталкивался с таким, обычно если в форме есть файл — то он ключевой.
Но спасибо за разъяснения.
прикрепить фотки к письму или анкете
полей может быть несколько, пользователь сперва выбрал пять файлов в пять полей, а потом решил оставить только один.
или не отправлять фотку в этот раз.
В этом случае лучше использовать вариант есть поле/нет поля. Если нужно добавить файл, нажимается кнопка добавить и появляется поле для добавления файла, а рядом с ним кнопка удаления этого поля. Таким образом мы динамически добавляем нужное нам кол-во полей. А если JS у пользователя выключен(что может встретиться менее чем у 1% пользователей) то и вашь вариант работать не будет… Но можно добавить надпись «Для возможности добавлять файлы включите JS»
Без JS и метод автора не сработает ;)
UFO landed and left these words here
У input type=file нет аттрибута value.
да я просто попробовал в ff 3.5 и предположил что так можно очистить и в других браузерах, просто не проверял (лень).
и еще в safari работает последнем. а вот в какой-то из последней opera и ie 6 не сработало =(
UFO landed and left these words here
Да, только ридонли, вы правы. Поэтому простой value = '' здесь нам не поможет.
UFO landed and left these words here
не работает. все манипуляции с атрибутами ничего не дали…
Если бы у него был атрибут валуе, то можно было туда вписать адрес файла и ява скриптом засубмитить форму при заходе на страницу. Сбылась бы мечта многих хакеров: как утянуть любой файл с компа жертвы.
UFO landed and left these words here
Нет, не сбылась, это у них обнуление сработало.
Прописать произвольное значение без участия юзера там не выйдет, потому что у
… файлового инпута нет и быть не может атрибута value
UFO landed and left these words here
хм… ну пока глюков не наблюдаю в ИЕ.
Побочных эффектов не наблюдалось, проект, где я этот способ применял, уже полгода в продакшене, дефектов на эту тему не постили. То есть этот способ можно считать вроде как бы надежным. Работает в IE6, IE7 и IE8.

Но идеологически это решение кривое-кривое… все же лучше от него отказаться, именно по тем соображениям, что это «специфик» браузера.
Спасибо!
Пригодилось вот прямо сейчас!!!

Думал это невозможно без удаления элемента…

Спасибо еще раз!

рад что пригодились результаты моих экспериментов :)
Не совсем понял для чего это нужно, скорее всего проблема высосана из пальца, но…
input type='reset'
для того и придумали.
ну это очищает ВСЮ форму. а если кому-нибудь взбредёт в голову очистить только полформы — то увы. заказчики порой загадочные бывают… ;)
Я так понимаю, задача в том, чтобы сохранить значение в других полях формы. Правда их можно пересохранить и восстановить. Или поубирать из формы. Но то, что предложил автор, действительно проще.
FF 3.5.1
<html>
<body>
<form>
<input type="file" name="test" id="test" />
<input type="button" name="clear" value="clear" onclick="alert(document.getElementById('test').innerHTML); document.getElementById('test').innerHTML = document.getElementById('test').innerHTML;" />
</form>
</body>
</html>

Не очищает.
И alert в первый раз выдает пустую строку, а в последующие разы "<input>" N-1 раз подряд, где N — количество нажатий кнопки минус 1.
Там не настолько все революционно, этот способ просто неявно удаляет и создает новое поле файлового ввода (если я не попутал способ):
designformasters.info/lab/clear-file-input/index.html
Код смотрите innerHTML не самого инпута, а контейнера в который он вложен.
код:
<html>
<head>
    <script>
        function clearFileInputField(Id)
        {
            document.getElementById(Id).innerHTML = document.getElementById(Id).innerHTML;
        }
    </script>

</head>
<body>
    <form>
    <div id="fileInputContainer">
        <input id="fileInput" name="fileInput" type="file">
    </div>
    <a href="#" onclick="clearFileInputField('fileInputContainer'); return false;">Очистить</a>
    </form>
</body>
</html>

неявно код в посте написан, я тоже сначала не вкурил какой у input[type=«file»] может быть innerHTML.

так было бы куда честнее:
function clearFileInputField(Id) {
  document.getElementById(Id).parentNode.innerHTML += " ";
}
Честнее но куда опаснее. parentNode может содержать другие элементы, на которые могут быть ссылки в js.
В FF (но не в IE!) очистка будет работать, если использовать

document.getElementById('test').value = '';

проверено в FF 3.0.x

(хоть это и работает, но я на практике это не применяю, как-то не нравится мне такой подход)
обработчики событий, прикрепленные к этой ноде через addEventListener/attachEvent перестанут срабатывать.

про такие ограничения лучше сразу говорить, пусть и можно перевесить обработчик выше
С использованием jQuery делаю так:
$("#file_field").replaceWith($("#file_field").clone());
Работает вроде везде и события сохраняются.
file_field — id инпута
Чтобы события сохранялись надо clone(true) делать.
Да, этот способ работает, использовал на практике.

Кстати интересно, что в FF (но не в IE!) работает даже конструкция: элемент.value = '';
Да да, это не ошибка, у input type=file хоть value и является readonly, но присвоить пустое значение (таким образом сделав очистку поля) FF позволяет, это не является нарушением безопасности.

Но мой любимый способ это, конечно, reset формы… к сожалению, если нужно очистить только поле аплоада файла, не трогая остальные поля, приходится такое поле оформлять в отдельной форме… но зато работает везде, и не надо никаких извращений.
Прошу прощения, но разве использовать сброс конретного объекта (а не всей формы) не выход?
<INPUT type="file" name="UPLOAD" title="Выбрать и загрузить файл на сервер" onchange="return upload(this.form);" />


Пример:
function upload(obj) {
	if (confirm('Загрузить файл на сервер?')) {
		obj.submit();
	}
	else {
		obj.reset();
	}
}
а может кто знает как получить на JS путь к файлу из
<input type=file>
?
Обязательно напишите, что обнулять нужно именно код контейнера, в котором лежит инпут, а то у самого инпута никакого innerHTML нет, а то топик в поиске появляется и люди потом наверняка как я теряют время, разбираясь в этом нюансе.
Sign up to leave a comment.

Articles