як скинути <input type = "file">


400

Я розробляю додаток для метро з VS2012 та Javascript

Я хочу скинути вміст мого файлу:

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />

Як мені це зробити?


1
Що ви маєте на увазі під змістом?
Мейс

3
ви маєте на увазі, після того, як користувач вибере файл, ви хочете скинути вибраний файл на "нічого"?
ddavison

9
Можливий дублікат stackoverflow.com/questions/1043957 / ...
Dhaval Marthak

14
це здається , що просто inputElement.value = ""робить трюк просто відмінно , не вдаючись до клонування або упаковки , як запропоновано. Працює в CH (46), IE (11) та FF (41)
Роберт Коритник

Відповіді:


371

Рішення jQuery, яке @ dhaval-marthak розмістив у коментарях, очевидно, працює, але якщо ви подивитесь на фактичний виклик jQuery, то досить легко зрозуміти, що робить jQuery, просто встановивши valueатрибут у порожній рядок. Тож у "чистому" JavaScript це було б:

document.getElementById("uploadCaptureInputFile").value = "";

15
Дякую! Якщо у вас уже є посилання на jquery, $ input.val ("") буде працювати як завжди.
Натан

@ 2ndGAB Хм ... у мене тільки 45.0.1, тому я не можу перевірити ... хтось ще?
Джордан Каспер

@ 2-е виправлення GAB, мій Firefox лише оновився до 46.0.1 і цей код все ще працює там. Ви можете підтвердити?
Йордан Каспер

@jakerella, що дивно, для мене встановлення значення селектора вхідного файлу викликає виключення безпеки. Єдине рішення, яке я успішно використовую,$(#myfileselector).trigger('fileselect', [1, ""]);
fralbo

3
input.type = ''; input.type = 'файл'; // насолоджуватися
Maxmaxmaximus

81

Вам потрібно звернути , <input type = “file”>щоб <form>теги , а потім ви можете скинути вхід скинувши свою форму:

onClick="this.form.reset()"

7
Це правильний метод. Він працює у всіх браузерах і не суперечить жодним захистам, які браузери реалізують, щоб запобігти шахрайським скриптам не возитися із значенням вводу файлу.
Євген Рябцев

9
Якийсь класний, не для мене, тому що він також скидає інші поля в цій формі.
Starwave

2
Подібне рішення jQuery може бути $("form").get(0).reset();. .get(0)Повертає фактичний елемент форми , так що ви можете використовувати reset()функцію.
teewuane

74

Це найкраще рішення:

input.value = ''

if(!/safari/i.test(navigator.userAgent)){
  input.type = ''
  input.type = 'file'
}

З усіх відповідей тут це найшвидше рішення. Немає клону вводу, не скидається форма!

Я перевірив його у всіх браузерах (у нього навіть є підтримка IE8).


4
Чи є якась конкретна причина для скидання input.type? Встановлення просто значення ''дає очікуваний результат.
Харшита Сеті

Це пожежна onchangeподія в MS Edge?
hotohoto

@hotohoto Я не знаю, є mac os)
Maxmaxmaximus

1
Для цього потрібні ще декілька оновлень або чогось, мені було потрібно занадто багато часу, щоб знайти цю відповідь. Це єдиний я знайшов, що працює на IE.
sch

input.value = '' видає виняток для консолі в IE11. Однак скидання input.type працює у всіх браузерах без будь-яких помилок.
Мирослав Яссо

45

Якщо у вас є наступне:

<input type="file" id="fileControl">

тоді просто зробіть:

$("#fileControl").val('');

щоб скинути керування файлами.


6
Найкраще рішення ІМХО.
Сергій Максимчук

3
Або скористайтеся DOM:inputFileEl.value = '';
Нінх Фам

44

Ви можете просто його клонувати і замінити на себе, з усіма подіями, які все ще додаються:

<input type="file" id="control">

і

var input = $("#control");

function something_happens() {
    input.replaceWith(input.val('').clone(true));
};

Дякуємо: Css-tricks.com


1
На жаль, це значення не вдається скинути, див. Цей jsFiddle . Для кращого рішення дивіться цю відповідь .
Gyrocode.com

1
@ Gyrocode.com Цей jsFiddle не працює, якщо зображення завантажено вдруге після скидання.
Сартак Сінгал

2
@SarthakSinghal, На жаль, ти написав неправильний код, ти повинен був зробити jsfiddle.net/cL1LooLe
Roger Russel

2
@RogerRussel: Саме так ... Мені було цікаво, як з’являються верхні відповіді, що це працює лише один раз, що є чітким показником того, що якась посилання втрачається. Це було насправді тому, що спочатку було створено вхідне посилання, яке згодом було замінено на новий елемент введення.
Роберт Коритник

1
Просто скидання valueподібного в інших відповідях здається набагато простішим, ніж маніпулювання DOM.
CodeFinity

40

Інше рішення (без вибору елементів HTML DOM)

Якщо ви додали прослуховувач подій "змінити" на цей вхід, тоді в коді JavaScript ви можете зателефонувати (для деяких заданих умов):

event.target.value = '';

Наприклад у HTML:

<input type="file" onChange="onChangeFunction(event)">

І в JavaScript:

onChangeFunction(event) {
  let fileList = event.target.files;
  let file = fileList[0];
  let extension = file.name.match(/(?<=\.)\w+$/g)[0].toLowerCase(); // assuming that this file has any extension

  if (extension === 'jpg') {
    alert('Good file extension!');
  }
  else {
    event.target.value = '';
    alert('Wrong file extension! File input is cleared.');
  }

Інший спосіб angular2: stackoverflow.com/questions/40165271 / ...
Belter

Це буде працювати тільки з іменами файлів, які містять лише один .перед розширенням файлу.
Ма Кобі

Правильно, я відредагував код і запропонував більш універсальний підхід, щоб отримати розширення файлу.
відступив

31

РІШЕННЯ

Наступний код працював для мене з jQuery. Він працює у кожному браузері і дозволяє зберегти події та власні властивості.

var $el = $('#uploadCaptureInputFile');
$el.wrap('<form>').closest('form').get(0).reset();
$el.unwrap();

DEMO

Дивіться цей jsFiddle для коду та демонстрації.

ПОСИЛАННЯ

Див. Як відновити введення файлів за допомогою JavaScript для отримання додаткової інформації.


1
@alessadro, ні, просто елемент <input type="file">із конкретним ідентифікатором.
Gyrocode.com

Дякую,
уточнюй

1
Це найчистіше і найбільш сумісне з браузером рішення, яке я знайшов ще - дякую.
Пт

25

Скинути кнопку завантаження файлів так просто за допомогою чистого JavaScript !

Є декілька способів це зробити, але якраз необхідний спосіб роботи, який працює у багатьох браузерах, змінює подане значення ні до чого, таким чином завантажене завантаження отримує скидання, також намагайтеся використовувати чистий javascript, а не будь-який фреймворк, я створив код нижче, просто перевірте це (ES6):

function resetFile() {
  const file = document.querySelector('.file');
  file.value = '';
}
<input type="file" class="file" />
<button onclick="resetFile()">Reset file</button>


як робити з jquery
Ананд Чудхарі

1
@AnandChoudhary це працює і в jQuery, але ви можете замінити const file = document.querySelector ('. File'); з файлом const = $ ('. file'); або просто зробіть $ ('. file'). val (""); випорожнити її
Аліреза

18

Особливо для кутових

document.getElementById('uploadFile').value = "";

Буде працювати, але якщо ви використовуєте Angular, він скаже, що "Властивість" значення "не існує для типу" HTMLElement'.any "

document.getElementById () повертає тип HTMLElement, який не містить властивості значення. Отже, киньте його в HTMLInputElement

(<HTMLInputElement>document.getElementById('uploadFile')).value = "";

ДОПОМОГА: -

Однак ми не повинні використовувати маніпуляцію з DOM (document.xyz ()) у кутовій.

Для цього кутовий надав @VIewChild, @ViewChildren тощо, які є document.querySelector (), document.queryselectorAll () відповідно.

Навіть я цього не читав. Краще слідкуйте за блогами експертів

Перехід через цю link1 , LINK2


рада, що мені не доведеться використовувати кутові!
user2677034

Ні. Фікс був би там. Тільки я знайшов цього. Яким ви користуєтесь тоді?
P

Вибачте, я був саркастичним ... Я просто використовую document.getElementById ('uploadFile'). Value = ""; так як я не використовую кутовий.
user2677034

Хороший. Я думав так само, Але, використовуйте Angular / React / VUe. Це потужні рамки для маршрутизації, компонентів, сервісів, маніпуляцій з
P

14

Я використовую для vuejs

   <input
          type="file"
          ref="fileref"
          @change="onChange"/>

this.$refs.fileref.value = ''

2
Спасибі людино! Я думав, що ніколи не знайду рішення з vuejs: D, ти божеволієш мені день!
Zsoca

1
Працював як шарм! Дякую
F КІНГ

8

Повторний вхідний файл є дуже одиничним

$('input[type=file]').val(null);

Якщо ви пов'язуєте, скиньте файл у зміні іншого поля форми або завантажте форму з ajax.

Цей приклад застосовний

Селектором, наприклад, є $('input[type=text]')будь-який елемент форми

подія click , changeабо будь-яка подія

$('body').delegate('event', 'selector', function(){
     $('input[type=file]').val(null) ;
});

5

За допомогою IE 10 я вирішив проблему з:

    var file = document.getElementById("file-input");
    file.removeAttribute('value');
    file.parentNode.replaceChild(file.cloneNode(true),file);

де:

<input accept="image/*" onchange="angular.element(this).scope().uploadFile(this)" id="file-input" type="file"/>


5

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

<input
    id="image"
    type="file"
    required
    ref={ref => this.fileInput = ref}
    multiple
    onChange={this.onFileChangeHandler}
/>

очистити значення після надсилання.

this.fileInput.value = "";


4

За допомогою кута ви можете створити змінну шаблону та встановити значення null

<input type="file" #fileUploader />
<button (click)="fileUploader.value = null">Reset from UI</button>

Або ви можете створити метод для такого скидання

компонент.ц

  @ViewChild('fileUploader') fileUploader:ElementRef;

  resetFileUploader() { 
    this.fileUploader.nativeElement.value = null;
  }

шаблон

<input type="file"/>
<button (click)="resetFileUploader()">Reset from Component</button>

stackblitz demo


2

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



2

Це можна зробити так

var inputfile= $('#uploadCaptureInputFile')
$('#reset').on('click',function(){
inputfile.replaceWith(inputfile.val('').clone(true));
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<a href="" id="reset">Reset</a>



1

jQuery рішення:

    $('input').on('change',function(){
                $(this).get(0).value = '';
                $(this).get(0).type = '';
                $(this).get(0).type = 'file';
            });

Розгляньте цю відповідь, щоб пояснити, як вона працює.
Помилки

@Bugs здогадуються, що це говорить саме за себе. Коли on changeспрацьовує подія введення файлу, значення видаляється. Тип вводу повертається з жодного файлу.

2
@ Джорді Так, я знаю, що це робить :) Я просто думав, що з десяток інших відповідей варто було б спробувати зробити так, щоб це виділялося. Це з'явилось, коли я переглядав. Насправді вони могли скопіювати ваш коментар, щоб викласти це трохи більше. Завжди варто спробувати пояснити, чому ви вважаєте, що код вирішує проблему ОП.
Помилки

1

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

HTML:

<input type="file" name="myfile" #activeFrameinputFile ng2FileSelect [uploader]="frameUploader" (change)="frameUploader.uploadAll()" />

компонент

import { Component, OnInit, ElementRef, ViewChild } from '@angular/core';

@ViewChild('activeFrameinputFile ')InputFrameVariable: ElementRef;

this.frameUploader.onSuccessItem = (item, response, status, headers) => {

`this.`**InputFrameVariable**`.nativeElement.value = '';`

};


1
<input type="file" id="mfile" name="mfile">
<p>Reset</p>

<script>
$(document).ready(function(){
$("p").click(function(){

            $("#mfile").val('');
            return false;

    });
});


Хоча цей код може вирішити питання, включаючи пояснення, як і чому це вирішує проблему, справді допоможе покращити якість вашої публікації та, ймовірно, призведе до збільшення кількості голосів. Пам'ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз задає питання. Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються. З огляду
подвійний звуковий сигнал

0

Якщо у вас є кілька файлів у формі, але ви хочете, щоб один із них був скинутий:

якщо ви використовуєте boostrap, jquery, стиль файлу для відображення форми вхідного файлу:

$("#"+idInput).filestyle('clear');

0
var fileInput = $('#uploadCaptureInputFile');
fileInput.replaceWith(fileInput.val('').clone(true));

0

Працює і для динамічного управління.

Javascript

<input type="file" onchange="FileValidate(this)" />

function FileValidate(object) {
    if ((object.files[0].size / 1024 / 1024) > 1) {   //greater than 1 MB         
        $(object).val('');
    }     
}

JQuery

<input type="file" class="UpoloadFileSize">

$(document).ready(function () {

    $('.UpoloadFileSize').bind('change', function () {                
        if ((this.files[0].size / 1024000) > 1.5) { //greater than 1.5 MB
            $(this).val('');
            alert('Size exceeded !!');
        }
    });

});

0

function resetImageField() {
    var $el = $('#uploadCaptureInputFile');                                        
    $el.wrap('<form>').closest('form').get(0).reset();
    $el.unwrap();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="file" id="uploadCaptureInputFile" class="win-content colors" accept="image/*" />
<button onclick="resetImageField()">Reset field</button>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.