Как очистить ввод HTML-файла с помощью JavaScript?


154

Я хочу очистить файл ввода в моей форме.

Я знаю об установке источников для того же метода ... Но этот метод не сотрет выбранный путь к файлу.

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

Это возможно?

Ответы:


-10

Как насчет удаления этого узла, создания нового с тем же именем?


46
как ты имеешь в виду, дай мне пример, пожалуйста.

1
вы потеряете свои обработчики, как этот: var inputPhoto = document.getElementById ('photoInput'); inputPhoto.addEventListener ('change', handler_file, false);
Руи Мартинс

Отказался за отсутствующее объяснение!
Джейсон

212

Есть 3 способа очистить ввод файла с помощью JavaScript:

  1. установить значение свойства на пустое или нулевое.

    Работает для IE11 + и других современных браузеров.

  2. Создайте новый элемент ввода файла и замените старый.

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

  3. Сбросьте форму владельца с помощью метода form.reset ().

    Чтобы не влиять на другие элементы ввода в той же форме владельца, мы можем создать новую пустую форму, добавить элемент ввода файла в эту новую форму и сбросить его. Этот способ работает для всех браузеров.

Я написал функцию JavaScript. демо: http://jsbin.com/muhipoye/1/

function clearInputFile(f){
    if(f.value){
        try{
            f.value = ''; //for IE11, latest Chrome/Firefox/Opera...
        }catch(err){ }
        if(f.value){ //for IE5 ~ IE10
            var form = document.createElement('form'),
                parentNode = f.parentNode, ref = f.nextSibling;
            form.appendChild(f);
            form.reset();
            parentNode.insertBefore(f,ref);
        }
    }
}

1
Не должны ли мы также удалить созданную форму впоследствии?
Андрей

1
Нет, тебе не нужно. элемент формы не был добавлен к дереву документа страницы.
Cuixiping

5
Просто предупреждение, использование подходов 2. или 3. может иметь значение для вас, если вы хотите сохранить события и другие атрибуты, которые были добавлены в элемент программным способом. В моем случае я добавил событие onclick к элементу формы, который исчез после сброса формы. В таком случае подход 1. лучше. (Это было отмечено для 2., но может также случиться и для 3.)
Вольф Ину

86

tl; dr : для современных браузеров просто используйте

input.value = '';

Старый ответ:

Как насчет:

input.type = "text";
input.type = "file";

Я все еще должен понять, почему это не работает с webkit .

В любом случае, это работает с IE9>, Firefox и Opera.
Ситуация с webkit такова, что я не могу изменить его обратно в файл.
С IE8 ситуация такова, что он выдает исключение безопасности.

Редактировать: Для webkit, Opera и Firefox это работает, хотя:

input.value = '';

(проверьте приведенный выше ответ с этим предложением)

Я посмотрю, смогу ли я найти более чистый способ сделать этот кросс-браузер без GC.

Edit2:

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

Работает с большинством браузеров. Не работает с IE <9, вот и все.
Протестировано на Firefox 20, Chrome 24, Opera 12, IE7, IE8, IE9 и IE10.


36

Установка значения в '' не работает во всех браузерах.

Вместо этого попробуйте установить значение nullкак:

document.getElementById('your_input_id').value= null;

РЕДАКТИРОВАТЬ: Я получаю очень веские причины безопасности для того, чтобы не разрешать JS устанавливать ввод файла, однако представляется разумным предоставить простой механизм для очистки уже выбранного вывода. Я попытался использовать пустую строку, но она не работала во всех браузерах, NULLработала во всех браузерах, которые я пробовал (Opera, Chrome, FF, IE11 + и Safari).

РЕДАКТИРОВАТЬ: Обратите внимание, что установка на NULLработает во всех браузерах, а установка на пустую строку не сделал.


6
К сожалению, я не вижу этого в all browsers... это не работает в IE8, IE9 или IE10 (но работает в IE11).
freefaller

Ну черт. Я не тестировал старые версии браузера IE. Сожалею.
BigMac66

31

К сожалению, ни один из приведенных выше ответов, по-видимому, не охватывает все основы - по крайней мере, в моем тестировании с использованием vanilla javascript.

  • .value = nullпохоже работает на FireFox, Chome, Opera и IE11 (но не IE8 / 9/10 )

  • .cloneNode.clone()в jQuery) в FireFox, похоже, копирует .valueовер, поэтому делает клон бессмысленным.

Итак, вот написанная мной функция vanilla javascript, которая работает в FireFox (27 и 28), Chrome (33), IE (8, 9, 10, 11), Opera (17) ... это единственные доступные в настоящее время браузеры мне проверить с.

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

ctrlПараметр является сам входной файл, так что функция будет называться ...

clearFileInput(document.getElementById("myFileInput"));

1
Это ответ. Одна из проблем, связанных с таким большим количеством ответов на этот вопрос - не только на этой странице, но и при поиске на других форумах, заключается в том, что вы можете очистить текст «3 файла выбран», но на самом деле он не очищает файлы http. очередь. Затем происходит следующее: при следующей загрузке вы можете выбрать только один файл, и, что еще хуже, он будет сохранен в предыдущей папке. Этот ответ очистит оба, и вы можете возобновить загрузку следующего набора файлов так же легко, как вы загрузили первый набор файлов.
ТАРКУС

Разве ifоператор не должен быть помещен в catchблок?
Фахми

Не @Fahmi - нет, она не должна
freefaller

О, я думал, что IE8 / 9/10 вызовет исключение при попытке установить значение null. Не могли бы вы объяснить, какой смысл ставить ctrl.value = null;внутри try...catchблока? Извините за новый вопрос.
Фахми

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);- в какой момент мы на самом деле очищаем значение, поскольку cloneNodeтакже копируем его?
Фахми

12

РЕШЕНИЕ

Следующий код работал для меня с jQuery. Он работает в любом браузере и позволяет сохранять события и пользовательские свойства.

var $el = $('#your-input-id');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

DEMO

Смотрите этот jsFiddle для кода и демонстрации.

ССЫЛКИ


11

Вам нужно заменить его на новый файл ввода. Вот как это можно сделать с помощью jQuery:

var inputFile = $('input[type=field]');
inputFile.wrap('<div />');

и используйте эту строку, когда вам нужно очистить поле ввода (например, для какого-либо события):

inputFile.parent().html( inputFile.parent().html() );

Для замены оригинального элемента это выглядит лучше: stackoverflow.com/questions/1043957/…
Mengdi Gao

9
document.getElementById('your_input_id').value=''

Изменить:
этот не работает в IE и опере, но, кажется, работает для Firefox, Safari и Chrome.


7
Это работает для меня, хотя я всегда спрашиваю себя, как долго.
Пекка

это не сработает, только в некоторых браузерах, а также установка значения для ввода файла является брешей в безопасности ... не лучший выбор.

5

У меня была такая же проблема, и я придумал это.

var file = document.querySelector('input');
var emptyFile = document.createElement('input');
emptyFile.type = 'file';

document.querySelector('button').onclick = function(){
  file.files = emptyFile.files;
}
<input type='file'>
<button>clear</button>


4

Это на самом деле довольно просто.

document.querySelector('#input-field').value = '';

3

Я искал простой и понятный способ очистки ввода HTML-файла, приведенные выше ответы великолепны, но ни один из них на самом деле не отвечает на то, что я ищу, пока я не наткнулся в Интернете на простой и элегантный способ сделать это:

var $input = $("#control");

$input.replaceWith($input.val('').clone(true));

все заслуги перед Крисом Койером .

// Referneces
var control = $("#control"),
    clearBn = $("#clear");

// Setup the clear functionality
clearBn.on("click", function(){
    control.replaceWith( control.val('').clone( true ) );
});

// Some bound handlers to preserve when cloning
control.on({
    change: function(){ console.log( "Changed" ) },
     focus: function(){ console.log(  "Focus"  ) }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="file" id="control">
<br><br>
<a href="#" id="clear">Clear</a>


... и вам, приятель, это помогло мне при проверке и отображении ошибок при возможной загрузке файла. Это сбрасывается при ошибке и позволяет пользователю повторно загрузить тот же файл в случае, если кто-то ищет что-то подобное.
Клинтон Доббс

1

Приведенные выше ответы предлагают несколько неуклюжих решений по следующим причинам:

  1. Я не люблю, чтобы первый , а затем получить HTML - код, это очень запутанное и грязный.wrapinput

  2. Кросс-браузерный JS удобен, и кажется, что в этом случае слишком много неизвестных, чтобы надежно использовать typeпереключение (что опять-таки немного грязно) и установку valueна''

Поэтому я предлагаю вам свое решение на основе jQuery:

$('#myinput').replaceWith($('#myinput').clone())

Он делает то, что говорит, он заменяет входные данные своим клоном. У клона не будет выбранного файла.

Преимущества:

  1. Простой и понятный код
  2. Никакая неуклюжая упаковка или переключение типов
  3. Кросс-браузерная совместимость (поправьте меня, если я ошибаюсь)

Результат: счастливый программист


3
Cross browser compatibility... мое тестирование показывает, что FireFox копирует .valueкак часть .clone(), поэтому делает его бесполезным
freefaller

@freefaller, почему бы не изменить значение перед вызовом replaceWith? Я использую clone()себя, и он отлично работает в Firefox (я не знаю, будет ли это до сих пор для вас год спустя =))
Abdo

@Abdo - если вы посмотрите на мой ответ, вы увидите, что я делаю
freefaller

Вопрос не задается о jQuery; это спрашивает о JavaScript.
Арел

1

Вот мои два цента, входные файлы хранятся в виде массива, так вот, как обнулить его

document.getElementById('selector').value = []

это возвращает пустой массив и работает во всех браузерах


0

Мне помогло то, что я попытался извлечь и загрузить последний выбранный файл, используя цикл, вместо очистки очереди, и это сработало. Вот код

for (int i = 0; i <= Request.Files.Count-1; i++)
{
 HttpPostedFileBase uploadfile = files[i];
 Stream fs = uploadfile.InputStream;
 BinaryReader br = new BinaryReader(fs);
 Byte[] imageBytes = br.ReadBytes((Int32)fs.Length);
}

Надеюсь, это поможет некоторым.


0

Я перепробовал большинство решений, но, похоже, никто не работал. Однако я нашел прогулку вокруг этого ниже.

Структура формы: form=> label, inputи submit button. После того, как мы выберем файл, имя файла будет показано надписью, сделав это вручную в JavaScript.

Поэтому моя стратегия такова: изначально отправка buttonотключена, после выбора файла disabledатрибут кнопки отправки будет удален, чтобы я мог отправить файл. После отправки я очищаю, labelчто делает его похожим, я очищаю файлinput но на самом деле это не так. Затем я снова отключу кнопку отправки, чтобы запретить отправку формы.

Установив отправку button disableили нет, я прекращаю отправку файла много раз, если не выберу другой файл.


0

Я изменил, чтобы напечатать текст и вернуться к типу в файл, используя setAttribute

'<input file-model="thefilePic" style="width:95%;" type="file" name="file" id="filepicture" accept="image/jpeg" />'

'var input=document.querySelector('#filepicture');'

if(input != null)
{
    input.setAttribute("type", "text");
    input.setAttribute("type", "file");
}

0

метод input.value = nullявляется рабочим, однако он будет вызывать changeсобытие ввода только в случае вызова изonclick события.

Решением этой проблемы будет вызов этого onchangeобработчика вручную всякий раз, когда вам нужно сбросить ввод.

function reset_input(input) {
    $(input)[0].value = null;
    input_change_handler();
}
function input_change_handler() {
    // this happens when there's been a change in file selection

    if ($(input)[0].files.length) {
        // file(s) selected
    } else {
        // nothing is selected
    }
}
$(input).on('change', input_change_handler);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.