Làm cách nào tôi có thể xóa đầu vào tệp HTML bằng JavaScript?


154

Tôi muốn xóa đầu vào tập tin trong mẫu của tôi.

Tôi biết về việc đặt các nguồn cho cùng một phương thức ... Nhưng phương thức đó sẽ không xóa đường dẫn tệp đã chọn.

Lưu ý : Tôi muốn tránh phải tải lại trang, đặt lại biểu mẫu hoặc thực hiện cuộc gọi AJAX.

Điều này có thể không?

Câu trả lời:


-10

Làm thế nào về việc loại bỏ nút đó, tạo một nút mới có cùng tên?


46
ý bạn thế nào, làm ơn cho tôi một ví dụ.

1
bạn sẽ mất các trình xử lý của mình, như thế này: var inputPhoto = document.getEuityById ('photoInput'); inputPhoto.addEventListener ('thay đổi', handler_file, false);
Rui Martins

Bỏ phiếu cho giải thích mất tích!
Jason

211

Có 3 cách để xóa đầu vào tệp bằng javascript:

  1. đặt thuộc tính giá trị thành rỗng hoặc null.

    Hoạt động cho IE11 + và các trình duyệt hiện đại khác.

  2. Tạo một phần tử nhập tệp mới và thay thế phần tử cũ.

    Nhược điểm là bạn sẽ mất người nghe sự kiện và thuộc tính mở rộng.

  3. Đặt lại biểu mẫu chủ sở hữu thông qua phương thức form.reset ().

    Để tránh ảnh hưởng đến các thành phần đầu vào khác trong cùng một hình thức chủ sở hữu, chúng tôi có thể tạo một biểu mẫu trống mới và nối phần tử nhập tệp vào biểu mẫu mới này và đặt lại nó. Cách này hoạt động cho tất cả các trình duyệt.

Tôi đã viết một hàm javascript. bản demo: 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
Không phải chúng ta cũng nên xóa mẫu đã tạo sau đó sao?
Andrey

1
Không bạn không cần. phần tử biểu mẫu chưa được thêm vào cây tài liệu trang.
cuixiping

5
Chỉ cần một lời cảnh báo, sử dụng các cách tiếp cận 2. hoặc 3. có thể có ý nghĩa đối với bạn nếu bạn muốn bảo tồn các sự kiện và các thuộc tính khác được thêm vào một yếu tố theo chương trình. Trong trường hợp của tôi, tôi đã thêm một sự kiện onclick vào một phần tử biểu mẫu đã biến mất sau khi đặt lại biểu mẫu. Trong trường hợp như vậy, cách tiếp cận 1. là tốt hơn. (Điều này được ghi nhận cho 2., nhưng cũng có thể xảy ra cho 3.)
Wolfie Inu

85

tl; dr : Đối với các trình duyệt hiện đại, chỉ cần sử dụng

input.value = '';

Câu trả lời cũ:

Làm thế nào về:

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

Tôi vẫn phải hiểu tại sao điều này không hoạt động với webkit .

Dù sao, điều này hoạt động với IE9>, Firefox và Opera.
Tình huống với webkit là tôi dường như không thể thay đổi nó trở lại thành tập tin.
Với IE8, tình huống là nó ném một ngoại lệ bảo mật.

Chỉnh sửa: Đối với webkit, Opera và firefox, điều này hoạt động, mặc dù:

input.value = '';

(kiểm tra câu trả lời trên với đề xuất này)

Tôi sẽ xem liệu tôi có thể tìm thấy một cách sạch đẹp hơn để làm trình duyệt chéo này mà không cần đến GC không.

Chỉnh sửa2:

try{
    inputs[i].value = '';
    if(inputs[i].value){
        inputs[i].type = "text";
        inputs[i].type = "file";
    }
}catch(e){}

Hoạt động với hầu hết các trình duyệt. Không hoạt động với IE <9, chỉ vậy thôi.
Đã thử nghiệm trên firefox 20, chrome 24, opera 12, IE7, IE8, IE9 và IE10.


35

Đặt giá trị thành ''không hoạt động trong tất cả các trình duyệt.

Thay vào đó, hãy thử đặt giá trị nullnhư vậy:

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

EDIT: Tôi có các lý do bảo mật rất hợp lệ khi không cho phép JS đặt đầu vào tệp, tuy nhiên có vẻ hợp lý khi cung cấp một cơ chế đơn giản để xóa đầu ra đã chọn. Tôi đã thử sử dụng một chuỗi trống nhưng nó không hoạt động trong tất cả các trình duyệt, NULLhoạt động trong tất cả các trình duyệt tôi đã thử (Opera, Chrome, FF, IE11 + và Safari).

EDIT: Xin lưu ý rằng cài đặt NULLhoạt động trên tất cả các trình duyệt trong khi cài đặt thành một chuỗi trống thì không.


6
Thật không may, tôi không thấy điều này trong all browsers... nó không hoạt động trong IE8, IE9 hoặc IE10 (nhưng không hoạt động trong IE11).
rơi tự do

Vâng dang. Tôi đã không kiểm tra các phiên bản cũ hơn của trình duyệt IE. Lấy làm tiếc.
BigMac66

31

Thật không may, không có câu trả lời nào ở trên xuất hiện để bao gồm tất cả các cơ sở - ít nhất là không phải với thử nghiệm của tôi với javilla javascript.

  • .value = nulldường như hoạt động trên FireFox, Chome, Opera và IE11 (nhưng không phải IE8 / 9/10)

  • .cloneNode(và .clone()trong jQuery) trên FireFox dường như sao chép .valuelại, do đó làm cho bản sao trở nên vô nghĩa.

Vì vậy, đây là chức năng javascript vanilla tôi đã viết hoạt động trên FireFox (27 và 28), Chrome (33), IE (8, 9, 10, 11), Opera (17) ... đây là những trình duyệt duy nhất hiện có để tôi kiểm tra với.

function clearFileInput(ctrl) {
  try {
    ctrl.value = null;
  } catch(ex) { }
  if (ctrl.value) {
    ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);
  }
}

Các ctrltham số là các tập tin đầu vào chính nó, vì vậy các chức năng sẽ được gọi là ...

clearFileInput(document.getElementById("myFileInput"));

1
Đây là câu trả lời. Một trong những vấn đề với rất nhiều câu trả lời cho câu hỏi này - không chỉ trên trang này mà cả việc tìm kiếm các diễn đàn khác là bạn có thể xóa văn bản "3 tệp đã chọn", nhưng nó không thực sự xóa các tệp http xếp hàng. Điều xảy ra sau đó là lần tiếp theo bạn cố gắng tải lên, bạn chỉ có thể chọn một tệp và tệ hơn là nó được lưu vào thư mục tệp trước đó. Câu trả lời này sẽ xóa cả hai và bạn có thể tiếp tục tải lên bộ tệp tiếp theo dễ dàng như khi bạn tải lên bộ tệp đầu tiên.
TARKUS

Không nên ifđặt câu lệnh bên trong catchkhối?
Fahmi

@Fahmi - không, không nên
freefaller

Ồ tôi nghĩ rằng IE8 / 9/10 sẽ ném ngoại lệ khi cố gắng đặt giá trị thành null. Tâm trí để giải thích những gì điểm đặt ctrl.value = null;trong một try...catchkhối sau đó? Xin lỗi cho câu hỏi newb.
Fahmi

1
ctrl.parentNode.replaceChild(ctrl.cloneNode(true), ctrl);- tại điểm nào thực sự chúng ta xóa giá trị, vì cloneNodecũng sao chép nó?
Fahmi


11

Bạn cần thay thế nó bằng đầu vào tập tin mới. Đây là cách nó có thể được thực hiện với jQuery:

var inputFile = $('input[type=field]');
inputFile.wrap('<div />');

và sử dụng dòng này khi bạn cần xóa trường nhập (ví dụ: trong một số sự kiện):

inputFile.parent().html( inputFile.parent().html() );

Để thay thế phần tử ban đầu, phần này có vẻ tốt hơn: stackoverflow.com/questions/1043957/
Mạnh

9
document.getElementById('your_input_id').value=''

Chỉnh sửa:
Cái này không hoạt động trong IE và opera, nhưng dường như hoạt động cho firefox, safari và chrome.


7
Điều này làm việc cho tôi, mặc dù tôi luôn tự hỏi mình trong bao lâu.
Pekka

điều này sẽ không hoạt động, chỉ trong một số trình duyệt và cũng đặt giá trị của đầu vào tệp là vi phạm bảo mật ... không phải là lựa chọn tốt.

5

Tôi đã có cùng một vấn đề và tôi đã đưa ra điều này.

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>


4

Điều đó thực sự khá dễ dàng.

document.querySelector('#input-field').value = '';

3

Tôi đã tìm kiếm cách đơn giản và rõ ràng để xóa đầu vào tệp HTML, các câu trả lời trên rất hay, nhưng không ai trong số họ thực sự trả lời những gì tôi đang tìm kiếm, cho đến khi tôi tìm thấy trên web một cách đơn giản để làm điều đó:

var $input = $("#control");

$input.replaceWith($input.val('').clone(true));

tất cả các khoản tín dụng cho Chris Coyier .

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


.. và với bạn thân, điều này đã giúp tôi khi kiểm tra và hiển thị lỗi trong một tệp tải lên tiềm năng. Điều này đặt lại lỗi và cho phép người dùng tải lên lại cùng một tệp trong trường hợp bất cứ ai đang tìm kiếm một cái gì đó như thế này.
Clinton Dobbs

1

Các câu trả lời trên cung cấp các giải pháp hơi vụng về vì những lý do sau:

  1. Tôi không thích phải wrapcác inputđầu tiên và sau đó nhận được html, nó rất liên quan và dơ bẩn.

  2. Trình duyệt chéo JS rất tiện dụng và dường như trong trường hợp này có quá nhiều ẩn số đáng tin cậy để sử dụng typechuyển đổi (một lần nữa, hơi bẩn) và đặt valuethành''

Vì vậy, tôi cung cấp cho bạn giải pháp dựa trên jQuery của tôi:

$('#myinput').replaceWith($('#myinput').clone())

Nó làm những gì nó nói, nó thay thế đầu vào bằng một bản sao của chính nó. Bản sao sẽ không có tập tin được chọn.

Ưu điểm:

  1. Mã đơn giản và dễ hiểu
  2. Không có gói vụng về hoặc chuyển đổi loại
  3. Tương thích trình duyệt chéo (sửa tôi nếu tôi sai ở đây)

Kết quả: Chúc mừng lập trình viên


3
Cross browser compatibility... thử nghiệm của tôi cho thấy rằng các bản sao của FireFox .valuelà một phần của .clone(), do đó khiến nó trở nên vô dụng
rơi tự do vào

@freefaller tại sao không thay đổi giá trị trước khi gọi replaceWith? Tôi đang sử dụng clone()bản thân và nó hoạt động tốt trong firefox (Tôi không biết liệu đây có phải là trường hợp của bạn một năm sau không =))
Abdo

@Abdo - nếu bạn nhìn vào câu trả lời của tôi, bạn sẽ thấy tôi làm thế
rơi tự do

Câu hỏi không hỏi về jQuery; đó là hỏi về javascript.
Arel 18/03/19

0

Điều giúp tôi là, tôi đã cố gắng tìm nạp và tải lên tệp đã chọn cuối cùng bằng cách sử dụng một vòng lặp, thay vì xóa hàng đợi và nó đã hoạt động. Đây là mã.

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);
}

Hy vọng điều này có thể giúp một số.


0

Tôi đã thử hầu hết các giải pháp nhưng dường như không có ai làm việc. Tuy nhiên tôi tìm thấy một đi bộ xung quanh cho nó dưới đây.

Cấu trúc của biểu mẫu là: form=> label, inputsubmit button. Sau khi chúng tôi chọn một tệp, tên tệp sẽ được hiển thị bởi nhãn bằng cách thực hiện thủ công trong JavaScript.

Vì vậy, chiến lược của tôi là: ban đầu việc gửi buttonbị vô hiệu hóa, sau khi một tệp được chọn, disabledthuộc tính nút gửi sẽ bị xóa để tôi có thể gửi tệp. Sau khi tôi gửi, tôi xóa labelcái trông giống như tôi xóa tệp inputnhưng thực tế thì không. Sau đó, tôi sẽ vô hiệu hóa nút gửi lại để ngăn gửi biểu mẫu.

Bằng cách cài đặt gửi button disablehoặc không, tôi dừng tệp gửi nhiều lần trừ khi tôi chọn tệp khác.


0

Đây là hai xu của tôi, các tệp đầu vào được lưu trữ dưới dạng mảng, vì vậy đây là cách để loại bỏ nó

document.getElementById('selector').value = []

cái này trả về một mảng trống và hoạt động trên tất cả các trình duyệt


0

Tôi đã thay đổi để nhập văn bản và quay lại nhập vào tệp bằng setAttribution

'<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");
}
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.