Відповіді:
Як щодо видалення цього вузла, створення нового з такою ж назвою?
Існує 3 способи очищення введення файлів за допомогою JavaScript:
встановити властивість значення порожнім або нульовим.
Працює для IE11 + та інших сучасних браузерів.
Створіть новий елемент введення файлу та замініть старий.
Недоліком є те, що ви втратите слухачів подій та властивості розширення.
Скиньте форму власника методом 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);
}
}
}
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.
Встановлення значення ''
не працює у всіх браузерах.
Замість цього спробуйте встановити значення null
таким чином:
document.getElementById('your_input_id').value= null;
EDIT: Я отримую дуже вагомі причини безпеки, які не дозволяють JS встановлювати вхід файлу, однак, здається, розумним є створення простого механізму очищення вже вибору виводу. Я спробував використовувати порожній рядок, але він не працював у всіх браузерах, NULL
працював у всіх браузерах, які я пробував (Opera, Chrome, FF, IE11 + та Safari).
РЕДАКТУВАННЯ: Зверніть увагу, що налаштування для NULL
роботи у всіх браузерах під час встановлення порожнього рядка не було.
all browsers
... він не працює в IE8, IE9 або IE10 (але працює в IE11).
На жаль, жодна з перерахованих вище відповідей не охоплює всіх основ - принаймні, не з моїм тестуванням ванільного 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"));
if
заяву розміщувати всередині catch
блоку?
null
. Майте на увазі пояснити, який сенс вводити ctrl.value = null;
всередину try...catch
блоку? Вибачте за нове запитання.
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
- в який момент ми фактично очищаємо значення, оскільки cloneNode
також копіюємо його?
Наступний код працював для мене з jQuery. Він працює у кожному браузері і дозволяє зберегти події та власні властивості.
var $el = $('#your-input-id');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();
Дивіться цей jsFiddle для коду та демонстрації.
Вам потрібно замінити його на новий ввід файлу. Ось як це можна зробити за допомогою jQuery:
var inputFile = $('input[type=field]');
inputFile.wrap('<div />');
і використовувати цей рядок, коли вам потрібно очистити поле для введення (наприклад, про якусь подію):
inputFile.parent().html( inputFile.parent().html() );
document.getElementById('your_input_id').value=''
Редагувати:
цей не працює в IE та операх, але, здається, працює для firefox, safari та chrome.
У мене були ті ж проблеми, і я придумав це.
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>
Я шукав простий і чистий спосіб очистити введення 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>
Наведені вище відповіді пропонують дещо незграбні рішення з наступних причин:
Я не люблю, щоб перший , а потім отримати HTML - код, це дуже заплутане і брудний.wrap
input
Перехресний браузер JS зручний і, здається, що в цьому випадку є занадто багато невідомих, щоб надійно використовувати type
комутацію (що, знову ж таки, трохи брудно) і налаштування value
на''
Тому я пропоную вам моє рішення на основі jQuery:
$('#myinput').replaceWith($('#myinput').clone())
Він робить те, що каже, замінює вхід самим клоном. Клон не буде обраний файл.
Переваги:
Результат: Щасливий програміст
Cross browser compatibility
... моє тестування показує, що FireFox копіює файли .value
як частину .clone()
, тому робить його марним
replaceWith
? Я використовую clone()
себе, і це працює чудово у firefox (я не знаю, чи це все-таки для вас ще через рік =))
Що мені допомогло, я спробував отримати і завантажити останній вибраний файл за допомогою циклу, а не очищати чергу, і це спрацювало. Ось код.
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);
}
Сподіваюся, що це може допомогти деяким.
Я спробував більшість рішень, але, здавалося, нікому не вийшло. Але я знайшов прогулянку навколо цього внизу.
Структура форми: form
=> label
, input
і submit button
. Після того як ми виберемо файл, ім'я файлу буде показано міткою, зробивши це вручну в JavaScript.
Тож моя стратегія така: спочатку подання button
відключено, після вибору файлу disabled
атрибут кнопки подання буде видалений таким чином, що я можу надіслати файл. Після подання я очищаю те, через label
що я очищаю файл, input
але насправді ні. Тоді я знову відключу кнопку для надсилання, щоб запобігти надсиланню форми.
Встановивши подати button
disable
чи ні, я зупиняю файл, який він надсилає багато разів, якщо я не виберу інший файл.
Я змінив тип тексту і повернувся до типу, використовуючи 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");
}