Làm cách nào để thiết lập lại <kiểu nhập = tập tin trên mạng >>


401

Tôi đang phát triển ứng dụng metro với VS2012 và Javascript

Tôi muốn đặt lại nội dung nhập tệp của mình:

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

Tôi nên làm thế nào?


1
Bạn có ý nghĩa gì bởi nội dung?
Maess 12/12/13

3
Ý bạn là, sau khi người dùng chọn một tệp, bạn muốn đặt lại tệp đã chọn thành "không có gì"?
ddavison

9
Bản sao có thể có của stackoverflow.com/questions/1043957/
Ấn

14
dường như là một đơn giản inputElement.value = ""hiện các trick tốt mà không cần đến nhân bản hoặc gói như đề xuất. Hoạt động ở CH (46), IE (11) và FF (41)
Robert Koritnik

Câu trả lời:


372

Giải pháp jQuery mà @ dhaval-marthak đăng trong các bình luận rõ ràng hoạt động, nhưng nếu bạn nhìn vào cuộc gọi jQuery thực tế, thật dễ dàng để xem jQuery đang làm gì, chỉ cần đặt valuethuộc tính thành một chuỗi trống. Vì vậy, trong JavaScript "thuần túy" sẽ là:

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

15
Cảm ơn! Nếu bạn đã có tham chiếu jquery, $ input.val ("") sẽ hoạt động như bình thường.
Natan

@ 2ndGAB Hmm ... Tôi chỉ có 45.0.1 vì vậy tôi không thể kiểm tra ... bất cứ ai khác?
Jordan Kasper

@ 2ndGAB Correction, Firefox của tôi vừa cập nhật lên 46.0.1 và mã này vẫn hoạt động ở đó. Bạn có thể xác nhận?
Jordan Kasper

@jakerella thật lạ, đối với tôi, đặt giá trị bộ chọn tệp đầu vào tạo ra ngoại lệ Bảo mật. Giải pháp duy nhất tôi sử dụng thành công là$(#myfileselector).trigger('fileselect', [1, ""]);
fralbo

3
input.type = ''; input.type = 'tập tin'; // thưởng thức
Maxmaxmaximus

81

Bạn cần bọc <input type = “file”>vào <form>các thẻ và sau đó bạn có thể đặt lại đầu vào bằng cách đặt lại biểu mẫu của mình:

onClick="this.form.reset()"

7
Đây là phương pháp chính xác. Nó hoạt động trong tất cả các trình duyệt và không xung đột với bất kỳ sự bảo vệ nào mà các trình duyệt thực hiện để ngăn chặn các tập lệnh giả mạo gây rối với giá trị đầu vào của tệp.
Eugene Ryabtsev

9
Mặc dù vậy, không tốt cho tôi, vì nó cũng đặt lại các trường khác trong mẫu này.
Starwave

2
Một giải pháp jQuery tương tự có thể là $("form").get(0).reset();. Các .get(0)sẽ trở lại các yếu tố hình thức thực tế, do đó bạn có thể sử dụng các reset()chức năng.
teewuane 16/03/18

74

Đây là giải pháp TỐT NHẤT:

input.value = ''

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

Trong tất cả các câu trả lời ở đây đây là giải pháp nhanh nhất. Không có bản sao đầu vào, không có hình thức thiết lập lại!

Tôi đã kiểm tra nó trong tất cả các trình duyệt (nó thậm chí còn hỗ trợ IE8).


4
Có bất kỳ lý do cụ thể để thiết lập lại input.typequá? Chỉ đặt giá trị ''là đưa ra kết quả mong đợi.
Harshita Sethi ngày

Nó có bắn onchangesự kiện trong MS Edge không?
hotohoto

@hotohoto tôi không biết, a có mac os)
Maxmaxmaximus 30/03/2017

1
Điều này cần thêm một số upvote hoặc một cái gì đó, tôi mất quá nhiều thời gian để tìm câu trả lời này, đây là người duy nhất tôi tìm thấy hoạt động trên IE.
sch

input.value = '' ném ngoại lệ vào bảng điều khiển trong IE11. Tuy nhiên, đặt lại input.type hoạt động trên tất cả các trình duyệt mà không có bất kỳ lỗi nào.
Miroslav Jasso

45

Trong trường hợp bạn có những điều sau đây:

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

sau đó chỉ cần làm:

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

để thiết lập lại kiểm soát tập tin.


6
Giải pháp tốt nhất IMHO.
Serhii Maksymchuk

3
Hoặc sử dụng DOM:inputFileEl.value = '';
Ninh Phạm

44

Bạn chỉ có thể sao chép nó và thay thế nó bằng chính nó, với tất cả các sự kiện vẫn được đính kèm:

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

var input = $("#control");

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

Cảm ơn: Css-tricks.com


1
Thật không may, điều này không thiết lập lại giá trị đầu vào, xem jsFiddle này . Để có một giải pháp tốt hơn, xem câu trả lời này .
Gyrocode.com

1
@ Gyrocode.com jsFiddle này không hoạt động nếu hình ảnh được tải lên lần thứ hai sau khi thiết lập lại.
Sarthak Singhal

2
@SarthakSinghal, Thật không may, bạn đã viết sai mã, bạn nên thực hiện jsfiddle.net/cL1LooLe
Roger Russel

2
@RogerRussel: Chính xác ... Tôi đã tự hỏi làm thế nào mà các câu trả lời trên lại nói rằng nó chỉ hoạt động một lần, đó là một chỉ báo rõ ràng rằng một số loại tham chiếu đang bị mất. Và đó thực sự là trường hợp vì ban đầu tạo tham chiếu đầu vào mà sau đó được thay thế bằng một yếu tố đầu vào mới.
Robert Koritnik

1
Chỉ cần đặt lại valuetương tự trong các câu trả lời khác có vẻ đơn giản hơn nhiều so với thao tác với DOM.
CodeFinity

40

Một giải pháp khác (không chọn các phần tử DOM HTML)

Nếu bạn đã thêm trình lắng nghe sự kiện 'thay đổi' trên đầu vào đó, thì trong mã javascript, bạn có thể gọi (đối với một số điều kiện được chỉ định):

event.target.value = '';

Ví dụ trong HTML:

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

Và trong 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.');
  }

Một cách khác để angular2: stackoverflow.com/questions/40165271/ từ
Belter

Điều này sẽ chỉ hoạt động trên tên tệp chỉ chứa một .ở phía trước phần mở rộng tập tin.
Ma Kobi

Đúng vậy, tôi đã chỉnh sửa mã và cung cấp cách tiếp cận phổ quát hơn để có được một phần mở rộng tệp.
thờ ơ

31

GIẢI PHÁP

Đoạn mã sau làm việc với tôi với jQuery. Nó hoạt động trong mọi trình duyệt và cho phép bảo tồn các sự kiện và thuộc tính tùy chỉnh.

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

BẢN GIỚI THIỆU

Xem jsFiddle này cho mã và trình diễn.

LIÊN KẾT

Xem Cách đặt lại tệp nhập bằng JavaScript để biết thêm thông tin.


1
@alessadro, không, chỉ là yếu tố <input type="file">có ID cụ thể.
Gyrocode.com

Cảm ơn làm rõ câu trả lời của bạn :) +1
nến

1
Đây là giải pháp sạch nhất và phù hợp với trình duyệt nhất mà tôi đã tìm thấy - cảm ơn bạn.
Pat

25

Đặt lại nút tải lên tệp rất dễ dàng bằng cách sử dụng JavaScript thuần túy !

Có một số cách để làm điều đó, nhưng cách đơn giản phải hoạt động tốt trong nhiều trình duyệt là thay đổi giá trị tệp thành không có gì, bằng cách tải lên tệp được đặt lại, cũng cố gắng sử dụng javascript thuần chứ không phải bất kỳ khung nào, tôi đã tạo mã bên dưới, chỉ cần kiểm tra nó (ES6):

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


Làm thế nào để làm với jquery
Anand Choudhary

1
@AnandChoudhary điều này cũng hoạt động trong jQuery, nhưng bạn có thể thay thế const file = document.querySelector ('. File'); với const file = $ ('. file'); hoặc chỉ làm $ ('. file'). val (""); để làm trống nó
Alireza

18

Riêng về góc

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

Sẽ hoạt động, nhưng nếu bạn sử dụng Angular Nó sẽ nói "Giá trị 'thuộc tính' không tồn tại trên loại 'HTMLEuity'.any"

document.getEuityById () trả về kiểu HTMLEuity không chứa thuộc tính giá trị. Vì vậy, hãy chuyển nó thành HTMLInputEuity

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

THÊM :-

Tuy nhiên, chúng ta không nên sử dụng thao tác DOM (document.xyz ()) trong góc.

Để làm được điều đó, góc đã cung cấp @VIewChild, @ViewChildren, v.v., tương ứng là document.querySelector (), document.queryselector ALL ().

Ngay cả tôi cũng không đọc nó. Tốt hơn để theo dõi blog của chuyên gia

Đi qua link1 này , link2


rất vui vì tôi không phải sử dụng góc cạnh!
dùng2677034

Số FIx sẽ ở đó. Chỉ có tôi tìm thấy cái này Mà bạn đang sử dụng sau đó?
P Satish Patro

Xin lỗi, tôi đã bị mỉa mai ... Tôi chỉ sử dụng document.getEuityById ('uploadFile'). Value = ""; như tôi không sử dụng góc cạnh.
dùng2677034

Đẹp một. Tôi cũng nghĩ như vậy, Nhưng, hãy sử dụng Angular / React / VUe. Đây là các khung mạnh mẽ để định tuyến, thành phần, dịch vụ, thao tác dom ghi đè lên quá trình
cấy ghép

14

Tôi sử dụng cho vuejs

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

this.$refs.fileref.value = ''

2
Cảm ơn người đàn ông! Tôi nghĩ rằng tôi sẽ không bao giờ tìm thấy một giải pháp với vuejs: D, bạn điên ngày của tôi!
Zsoca

1
Làm việc như người ở! Cảm ơn bạn
F KIng

8

Các tập tin đầu vào thiết lập lại là rất đơn

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

Nếu bạn liên kết đặt lại tệp trong trường thay đổi trường khác của biểu mẫu hoặc tải biểu mẫu bằng ajax.

Ví dụ này được áp dụng

ví dụ, bộ chọn$('input[type=text]')hoặc bất kỳ phần tử nào của biểu mẫu

sự kiện click , changehoặc bất kỳ sự kiện

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

5

Với IE 10 tôi đã giải quyết vấn đề với:

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

Ở đâu :

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


5

Có nhiều cách tiếp cận và tôi sẽ đề xuất đi kèm với đính kèm ref vào đầu vào.

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

để xóa giá trị sau khi gửi.

this.fileInput.value = "";


4

Với góc cạnh, bạn có thể tạo một biến mẫu và đặt giá trị thành null

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

Hoặc bạn có thể tạo một phương thức để thiết lập lại như thế này

thành phần

  @ViewChild('fileUploader') fileUploader:ElementRef;

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

bản mẫu

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

bản demo stackblitz


2

Bạn có thể cài đặt lại vì đây là tệp chỉ đọc. bạn có thể sao chép nó để giải quyết vấn đề.



2

Điều này có thể được thực hiện như thế này

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

Giải pháp tốt nhất của tôi

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

Điều này khác với câu trả lời đầu tiên và nhận xét về câu trả lời đó như thế nào?
Akin Okegbile

1

Giải pháp jQuery:

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

Xem xét đệm câu trả lời này ra để giải thích cách nó hoạt động.
Lỗi

@Bugs đoán điều này nói cho chính nó. Khi on changesự kiện đầu vào tệp được kích hoạt, giá trị sẽ bị xóa. Loại đầu vào được đặt lại từ không có tệp.

2
@Jordy vâng tôi biết nó làm gì :) Tôi chỉ nghĩ rằng với hàng tá câu trả lời khác, sẽ rất đáng để cố gắng làm cho nó nổi bật. Nó xuất hiện trong khi tôi đang xem xét. Thực tế họ có thể sao chép bình luận của bạn để thêm vào đó. Luôn luôn đáng để giải thích lý do tại sao bạn cảm thấy mã khắc phục sự cố OP.
Lỗi

1

Tôi đã đối mặt với vấn đề với ng2-file-upload cho góc. Nếu bạn đang tìm kiếm giải pháp trong góc tham khảo mã bên dưới

HTML:

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

thành phần

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;

    });
});


Mặc dù mã này có thể giải quyết câu hỏi, bao gồm giải thích về cách thức và lý do giải quyết vấn đề này thực sự sẽ giúp cải thiện chất lượng bài đăng của bạn và có thể dẫn đến nhiều lượt bình chọn hơn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ người hỏi bây giờ. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng. Từ đánh giá
tiếng bíp đôi

0

Nếu bạn có một vài tệp trong biểu mẫu của mình nhưng chỉ muốn một trong số chúng được đặt lại:

nếu bạn sử dụng boostrap, jquery, filestyle để hiển thị biểu mẫu tệp đầu vào:

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

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

0

Hoạt động cho các điều khiển động quá.

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>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.