วิธีรีเซ็ต <input type =“ file”>


400

ฉันกำลังพัฒนาแอพ metro ด้วย VS2012 และ Javascript

ฉันต้องการรีเซ็ตเนื้อหาของอินพุตไฟล์ของฉัน:

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

ฉันควรทำอย่างไร


1
เนื้อหาหมายถึงอะไร
Maess

3
คุณหมายถึงหลังจากผู้ใช้เลือกไฟล์คุณต้องการรีเซ็ตไฟล์ที่เลือกเป็น "nothing" หรือไม่?
ddavison

9
สำเนาซ้ำที่เป็นไปได้ของstackoverflow.com/questions/1043957/ …
Dhaval Marthak

14
มันดูเหมือนว่าง่ายinputElement.value = ""ไม่หลอกลวงได้ดีโดยไม่ต้อง resorting โคลนหรือตัดเป็นข้อเสนอแนะ ทำงานใน CH (46), IE (11) และ FF (41)
Robert Koritnik

คำตอบ:


371

วิธีการแก้ปัญหา jQuery ที่ @ dhaval-marthak โพสต์ในความคิดเห็นเห็นได้ชัดว่าทำงานได้ แต่ถ้าคุณดูการโทร jQuery ที่เกิดขึ้นจริงมันค่อนข้างง่ายที่จะเห็นสิ่งที่ jQuery กำลังทำอยู่เพียงแค่ตั้งค่าvalueแอตทริบิวต์เป็นสตริงว่าง ดังนั้นใน JavaScript "บริสุทธิ์" มันจะเป็น:

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

15
ขอบคุณ! หากคุณมีการอ้างอิง jquery อยู่แล้ว $ input.val ("") จะทำงานตามปกติ
Natan

@ 2ndGAB อืม ... ฉันมีเพียง 45.0.1 ดังนั้นฉันจึงไม่สามารถทดสอบ ... มีใครอีกไหม
Jordan Kasper

@ 2ndGAB Correction, Firefox ของฉันเพิ่งอัพเดตเป็น 46.0.1 และโค้ดนี้ยังใช้งานได้ คุณยืนยันได้ไหม
Jordan Kasper

@ jakerella ที่แปลกสำหรับฉันตั้งค่าตัวเลือกไฟล์อินพุต trigs trigs เป็นข้อยกเว้นด้านความปลอดภัย ทางออกเดียวที่ฉันประสบความสำเร็จใช้คือ$(#myfileselector).trigger('fileselect', [1, ""]);
fralbo

3
input.type = ''; input.type = 'file'; // เพลิดเพลินกับ
Maxmaxmaximus

81

คุณต้องตัดคำ<input type = “file”>ใน<form>แท็กจากนั้นคุณสามารถรีเซ็ตอินพุตโดยรีเซ็ตฟอร์มของคุณ:

onClick="this.form.reset()"

7
นี่เป็นวิธีที่ถูกต้อง มันทำงานได้ในเบราว์เซอร์ทั้งหมดและไม่ขัดแย้งกับการป้องกันใด ๆ ที่เบราว์เซอร์นำไปใช้เพื่อป้องกันสคริปต์อันธพาลไม่ให้ไปยุ่งกับไฟล์. value
Eugene Ryabtsev

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ด้วยหรือไม่ การตั้งค่าเพียงเพื่อ''ให้ผลลัพธ์ที่คาดหวัง
Harshita Sethi

onchangeเหตุการณ์นี้เกิดขึ้นใน MS Edge หรือไม่
hotohoto

@ Photohoto ฉันไม่รู้มี mac os)
Maxmaxmaximus

1
สิ่งนี้ต้องการ upvotes เพิ่มเติมหรือบางอย่างฉันใช้เวลานานเกินไปในการหาคำตอบนี้เป็นสิ่งเดียวที่ฉันพบว่าใช้งานได้บน IE
sch

input.value = '' ส่งข้อยกเว้นไปยังคอนโซลใน IE11 อย่างไรก็ตามการรีเซ็ต input.type ใช้ได้กับทุกเบราว์เซอร์โดยไม่มีข้อผิดพลาด
Miroslav Jasso

45

ในกรณีที่คุณมีสิ่งต่อไปนี้:

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

จากนั้นทำ:

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

เพื่อรีเซ็ตการควบคุมไฟล์


6
ทางออกที่ดีที่สุด IMHO
Serhii Maksymchuk

3
หรือใช้ DOM:inputFileEl.value = '';
Ninh Pham

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 นี้ไม่ทำงานหากมีการอัพโหลดภาพเป็นครั้งที่สองหลังจากรีเซ็ต
Sarthak Singhal

2
@SarthakSinghal แต่น่าเสียดายที่คุณเขียนรหัสผิดคุณควรทำjsfiddle.net/cL1LooLe
Roger Russel

2
@RogerRussel: แน่นอน ... ฉันสงสัยตัวเองว่าทำไมคำตอบที่ดีที่สุดถึงบอกว่ามันใช้งานได้เพียงครั้งเดียวซึ่งเป็นตัวบ่งชี้ที่ชัดเจนว่าการอ้างอิงบางประเภทหายไป และนั่นก็เป็นจริงเพราะในตอนแรกสร้างการอ้างอิงอินพุตที่ถูกแทนที่ในภายหลังด้วยองค์ประกอบอินพุตใหม่
Robert Koritnik

1
เพียงแค่รีเซ็ตคำvalueเหมือนในคำตอบอื่น ๆ ดูเหมือนจะตรงไปตรงมามากกว่าการใช้ DOM
CodeFinity

40

โซลูชันอื่น (โดยไม่เลือกองค์ประกอบ HTML DOM)

หากคุณเพิ่มผู้ฟังเหตุการณ์ 'เปลี่ยน' ในอินพุตนั้นจากนั้นในโค้ดจาวาสคริปต์ที่คุณสามารถโทรได้

event.target.value = '';

ตัวอย่างเช่นใน HTML:

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

และในจาวาสคริปต์:

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

จะใช้งานได้กับชื่อไฟล์ที่มีเพียงไฟล์เดียวที่.อยู่ข้างหน้านามสกุลไฟล์
Ma Kobi

ถูกต้องฉันได้แก้ไขโค้ดและให้วิธีการที่เป็นสากลมากขึ้นในการรับนามสกุลไฟล์
ตกลง

31

สารละลาย

รหัสต่อไปนี้ทำงานให้ฉันด้วย jQuery มันทำงานได้ในทุกเบราว์เซอร์และช่วยให้รักษาเหตุการณ์และคุณสมบัติที่กำหนดเอง

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

การสาธิต

ดูjsFiddle นี้สำหรับรหัสและการสาธิต

ลิ้งค์

ดูวิธีการรีเซ็ตอินพุตไฟล์ด้วย JavaScriptสำหรับข้อมูลเพิ่มเติม


1
@alessadro ไม่เพียงแค่องค์ประกอบที่<input type="file">มี ID เฉพาะ
Gyrocode.com

ขอขอบคุณคำตอบที่ชัดเจน :) +1
candlejack

1
นี่เป็นวิธีที่สะอาดและเป็นไปตามเบราว์เซอร์ที่พบมากที่สุด - ขอบคุณ
Pat

25

การรีเซ็ตปุ่มอัปโหลดไฟล์เป็นเรื่องง่ายมากโดยใช้JavaScript บริสุทธิ์ !

มีวิธีไม่กี่อย่างที่ต้องทำ แต่วิธีที่ตรงไปตรงมาซึ่งทำงานได้ดีในเบราว์เซอร์จำนวนมากคือการเปลี่ยนค่าที่เก็บไว้เป็นอะไรวิธีการอัปโหลดที่ยื่นได้รับการรีเซ็ตและลองใช้จาวาสคริปต์บริสุทธิ์ รหัสด้านล่างเพียงตรวจสอบ (ES6):

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


จะทำอย่างไรกับ jQuery
Anand Choudhary

1
@AnandChoudhary สามารถใช้งานได้ใน jQuery เช่นกัน แต่คุณสามารถแทนที่ const file = document.querySelector ('. file'); with const file = $ ('. file'); หรือเพียงแค่ทำ $ ('. file'). val (""); เพื่อล้างมัน
Alireza

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 () ตามลำดับ

แม้ฉันไม่ได้อ่าน ดีกว่าที่จะติดตามบล็อกของผู้เชี่ยวชาญ

ผ่านลิงค์นี้ 1 , ลิงค์ 2


ดีใจที่ฉันไม่ต้องใช้เชิงมุม!
user2677034

ไม่ได้ FIx จะอยู่ที่นั่น ฉันเท่านั้นที่พบสิ่งนี้ คุณกำลังใช้อะไรอยู่
P Satish Patro

ขออภัยฉันกำลังประชดประชัน ... ฉันเพิ่งใช้ document.getElementById ('uploadFile') value = ""; เพราะฉันไม่ได้ใช้มุม
user2677034

ทำได้ดีนี่. ฉันคิดเหมือนกัน แต่ใช้ Angular / React / VUe เหล่านี้เป็นกรอบที่มีประสิทธิภาพสำหรับการกำหนดเส้นทาง, ส่วนประกอบ, บริการ, การครอบงำจัดการครอบงำ Dom
P Satish Patro

14

ฉันใช้สำหรับ vuejs

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

this.$refs.fileref.value = ''

2
ขอบคุณคน! ฉันคิดว่าฉันจะไม่มีทางแก้ปัญหาด้วย vuejs: D คุณบ้าวันของฉัน!
Zsoca

1
ทำงานเหมือนจับใจ! ขอบคุณ
F KIng

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>

หรือคุณสามารถสร้างวิธีการรีเซ็ตเช่นนี้

component.ts

  @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>


2

ทางออกที่ดีที่สุดของฉัน

$(".file_uplaod_input").val('');  // this is working best ):

สิ่งนี้แตกต่างจากคำตอบแรกและข้อคิดเห็นในคำตอบนั้นอย่างไร
Akin Okegbile

1

โซลูชั่น jQuery:

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

ลองใส่คำตอบนี้เพื่ออธิบายวิธีการทำงาน
บัก

@ บั๊กเดาว่าสิ่งนี้พูดเพื่อตัวเอง เมื่อon changeเหตุการณ์ของอินพุตไฟล์ถูกทริกเกอร์ค่าจะถูกล้าง ประเภทของอินพุตได้รับการตั้งค่าใหม่จากไม่มีเป็นไฟล์

2
@Jordy ใช่ฉันรู้ว่ามันทำอะไร :) ฉันแค่คิดว่ามีคำตอบอื่น ๆ อีกโหลมันจะคุ้มค่าที่จะพยายามทำให้มันโดดเด่น มันปรากฏขึ้นในขณะที่ฉันกำลังทบทวน ในความเป็นจริงพวกเขาสามารถคัดลอกความคิดเห็นของคุณเพื่อตัดออกอีกเล็กน้อย มันคุ้มค่าที่จะพยายามอธิบายว่าทำไมคุณถึงรู้สึกว่ารหัสแก้ไขปัญหา OPs ได้
บัก

1

ฉันประสบปัญหากับ ng2-file-upload สำหรับเชิงมุม หากคุณกำลังมองหาวิธีการแก้ปัญหาในการอ้างอิงเชิงมุมด้านล่างรหัส

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, filestyle เพื่อแสดงรูปแบบไฟล์อินพุต:

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


0

ใช้งานได้สำหรับการควบคุมแบบไดนามิกเช่นกัน

จาวาสคริ

<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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.