Як я можу очистити введення HTML-файлу за допомогою JavaScript?


154

Я хочу очистити введення файлу у своїй формі.

Я знаю про встановлення джерел на той самий метод ... Але цей метод не буде стерти вибраний шлях до файлу.

Примітка . Хочеться уникати перезавантаження сторінки, скидання форми або здійснення дзвінка AJAX.

Чи можливо це?

Відповіді:


-10

Як щодо видалення цього вузла, створення нового з такою ж назвою?


46
як ви маєте на увазі, дайте мені приклад, будь ласка.

1
ви втратите ваші обробники, як цей: var inputPhoto = document.getElementById ('photoInput'); inputPhoto.addEventListener ('змінити', обробник_файл, помилково);
Руй Мартінс

Проголосували за відсутні пояснення!
Джейсон

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.)
Wolfie Inu

85

tl; dr : Для сучасних браузерів просто використовуйте

input.value = '';

Стара відповідь:

Як щодо:

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

Я ще мушу зрозуміти, чому це не працює з веб-кайтом .

У будь-якому разі це працює з IE9>, Firefox та Opera.
Ситуація з webkit полягає в тому, що я, здається, не можу змінити його назад у файл.
З IE8 ситуація така, що він кидає виняток із безпеки.

Редагувати: для веб-програми, 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.


35

Встановлення значення ''не працює у всіх браузерах.

Замість цього спробуйте встановити значення nullтаким чином:

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

EDIT: Я отримую дуже вагомі причини безпеки, які не дозволяють JS встановлювати вхід файлу, однак, здається, розумним є створення простого механізму очищення вже вибору виводу. Я спробував використовувати порожній рядок, але він не працював у всіх браузерах, NULLпрацював у всіх браузерах, які я пробував (Opera, Chrome, FF, IE11 + та Safari).

РЕДАКТУВАННЯ: Зверніть увагу, що налаштування для NULLроботи у всіх браузерах під час встановлення порожнього рядка не було.


6
На жаль, я не бачу цього в all browsers... він не працює в IE8, IE9 або IE10 (але працює в IE11).
freefaller

Добре бовтаються. Я не перевіряв старіші версії браузера IE. Вибачте.
BigMac66

31

На жаль, жодна з перерахованих вище відповідей не охоплює всіх основ - принаймні, не з моїм тестуванням ванільного javascript.

  • .value = null, здається, працює на FireFox, Chome, Opera та IE11 (але не IE8 / 9/10)

  • .cloneNode.clone()в jQuery) на FireFox, схоже, копіює .valueнад, тому клон стає безглуздим.

Отже, ось функція 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 черга. Потім відбувається те, що наступного разу, коли ви намагаєтеся завантажити, ви можете вибрати лише один файл, і ще гірше, він зберігається в попередній папці файлів. Ця відповідь очистить обоє, і ви можете відновити завантаження наступного набору файлів так само легко, як і ви завантажили перший набір файлів.
TARKUS

Чи не слід 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
Це працює для мене, хоча я завжди задаю собі питання, як довго.
Pekka

ця робота не лише в деяких браузерах, а також встановлення значення вхідного файлу є порушенням безпеки ... не вдалий вибір.

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>



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 - якщо ви подивитесь на мою відповідь, ви побачите, що я роблю
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");
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.