Xóa <input type = 'file' /> bằng jQuery


549

Có thể xóa <input type='file' />giá trị kiểm soát với jQuery không? Tôi đã thử như sau:

$('#control').attr({ value: '' }); 

Nhưng nó không hoạt động.

Câu trả lời:


529

Dễ dàng: bạn bọc một <form>phần tử xung quanh, gọi lại thiết lập trên biểu mẫu, sau đó xóa biểu mẫu bằng cách sử dụng .unwrap(). Không giống như các .clone()giải pháp khác trong luồng này, bạn kết thúc với cùng một phần tử ở cuối (bao gồm các thuộc tính tùy chỉnh được đặt trên nó).

Đã thử nghiệm và làm việc trong Opera, Firefox, Safari, Chrome và IE6 +. Cũng hoạt động trên các loại yếu tố hình thức khác, ngoại trừ type="hidden".

window.reset = function(e) {
  e.wrap('<form>').closest('form').get(0).reset();
  e.unwrap();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<form>
  <input id="file" type="file">
  <br>
  <input id="text" type="text" value="Original">
</form>

<button onclick="reset($('#file'))">Reset file</button>
<button onclick="reset($('#text'))">Reset text</button>

Câu đố

Như Timo lưu ý bên dưới, nếu bạn có các nút để kích hoạt thiết lập lại trường bên trong <form>, bạn phải gọi .preventDefault()sự kiện để ngăn không cho <button>kích hoạt gửi.


BIÊN TẬP

Không hoạt động trong IE 11 do lỗi không được trộn. Văn bản (tên tệp) bị xóa trên đầu vào, nhưng Filedanh sách của nó vẫn được điền.


14
Người chiến thắng! Hoạt động trong mọi trình duyệt và tránh trường nhân bản. Nhưng nếu các nút rõ ràng ở trong biểu mẫu, vui lòng đổi tên reset()thành vd. reset2(), bởi vì ít nhất trong Chrome, tất cả các trường sẽ bị xóa nếu có reset(). Và thêm event.preventDefault () sau khi xóa cuộc gọi để ngăn gửi. Cách này : <button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>. Ví dụ hoạt động: jsfiddle.net/rPaZQ/23 .
Timo Kähkönen

28
Vấn đề là, điều này ít nhất là tạm thời làm cho tài liệu không hợp lệ. (Các biểu mẫu không thể chứa các biểu mẫu khác.) Cho dù hiện tại nó có hoạt động hay không, bạn có thể tự do phá vỡ bất kỳ lúc nào nó muốn.
cHao

6
@cHao, tất nhiên điều này chỉ đúng nếu phần tử đầu vào thực sự ở dạng, mà nó không phải như vậy.
Ninjakannon

7
Liên quan đến việc có một biểu mẫu trong một biểu mẫu, bạn luôn có thể tạo một phần tử biểu mẫu mới bên ngoài DOM hoặc nối nó vào phần thân nếu bạn muốn, sau đó di chuyển phần tử đầu vào vào bên trong biểu mẫu đó. Sau đó, bạn sẽ đặt lại biểu mẫu mới đó, di chuyển phần tử đầu vào trở lại vị trí của nó và xóa phần tử biểu mẫu bổ sung.
Kevin Heidt

4
Tôi vừa thấy rằng điều này không hoạt động trong IE 11. Chúng tôi đang sử dụng PixelFileInput - sử dụng phương pháp này. Và trong khi văn bản và hình thu nhỏ bị xóa, danh sách tệp của đối tượng vẫn giữ nguyên :(
Ian Grainger

434

Trả lời nhanh: thay thế nó.

Trong đoạn mã dưới đây, tôi sử dụng replaceWithphương thức jQuery để thay thế điều khiển bằng bản sao của chính nó. Trong trường hợp bạn có bất kỳ trình xử lý nào bị ràng buộc với các sự kiện trong điều khiển này, chúng tôi cũng sẽ muốn bảo vệ chúng. Để làm điều này, chúng ta truyền vào truenhư là tham số đầu tiên của clonephương thức.

<input type="file" id="control"/>
<button id="clear">Clear</button>
var control = $("#control");

$("#clear").on("click", function () {
    control.replaceWith( control = control.clone( true ) );
});

Câu đố: http://jsfiddle.net/jonathansampson/dAQVM/

Nếu nhân bản, trong khi bảo quản trình xử lý sự kiện, sẽ trình bày bất kỳ vấn đề nào bạn có thể xem xét khi sử dụng phân quyền sự kiện để xử lý các nhấp chuột vào điều khiển này từ phần tử cha:

$("form").on("focus", "#control", doStuff);

Điều này ngăn không cho bất kỳ trình xử lý nào được sao chép cùng với phần tử khi điều khiển đang được làm mới.


50
Bạn cũng có thể sử dụng phương thức .clone () trên trường $ ('# clone'). Thay thếWith ($ (this) .clone ());
152

4
Nó hoàn toàn không làm gì cả - không có lỗi trong fireorms. Tôi đã phải thêm control.val (''); cho nó để xóa hộp nhập tập tin. Mã của bạn đã làm việc trong chrome và eg9 như là mặc dù.
mnsr

10
Nó vẫn không hoạt động. Nó cần phải được xóa trước khi thay thế. Vì vậy, bạn muốn .val () trước .replaceWith (). Vì vậy, nó sẽ là control.val (''). Thay thếWith (...);
mnsr

6
Tôi đã có một giải pháp bên dưới sạch hơn nhiều so với điều này: stackoverflow.com/a/13351234/909944
trượt vào

2
Câu trả lời này ở đây vì lý do lịch sử. hỗ trợ trình duyệt hiện đạiinput.value = null;
André Werlang

113

Jquery có nhiệm vụ giải quyết các vấn đề về trình duyệt chéo / trình duyệt cũ hơn cho bạn.

Điều này hoạt động trên các trình duyệt hiện đại mà tôi đã thử nghiệm: Chromium v25, Firefox v20, Opera v12.14

Sử dụng jquery 1.9.1

HTML

<input id="fileopen" type="file" value="" />
<button id="clear">Clear</button>

Jquery

$("#clear").click(function () {
    $("#fileopen").val("");
});

Trên jsfiddle

Giải pháp javascript sau đây cũng hoạt động với tôi trên các trình duyệt được đề cập ở trên.

document.getElementById("clear").addEventListener("click", function () {
    document.getElementById("fileopen").value = "";
}, false);

Trên jsfiddle

Tôi không có cách nào để kiểm tra với IE, nhưng về mặt lý thuyết thì nó sẽ hoạt động. Nếu IE đủ khác để phiên bản Javascript không hoạt động vì MS đã thực hiện theo cách khác, thì theo tôi, phương pháp jquery sẽ giải quyết nó cho bạn, nếu không thì nó sẽ đáng để chỉ ra cho nhóm jquery cùng với phương pháp mà IE yêu cầu. (Tôi thấy mọi người nói rằng "cái này sẽ không hoạt động trên IE", nhưng không có javascript nào để hiển thị cách nó hoạt động trên IE (được cho là "tính năng bảo mật"?), Có lẽ cũng báo cáo đó là một lỗi cho MS (nếu họ cũng sẽ đếm nó như vậy), để nó được sửa trong bất kỳ bản phát hành mới nào)

Giống như được đề cập trong một câu trả lời khác, một bài đăng trên diễn đàn jquery

 if ($.browser.msie) {
      $('#file').replaceWith($('#file').clone());
 } else {
      $('#file').val('');
 }

Nhưng jquery hiện đã gỡ bỏ hỗ trợ để kiểm tra trình duyệt, jquery.browser.

Giải pháp javascript này cũng hoạt động với tôi, nó là vanilla tương đương với phương thức jquery.replaceWith .

document.getElementById("clear").addEventListener("click", function () {
    var fileopen = document.getElementById("fileopen"),
        clone = fileopen.cloneNode(true);

    fileopen.parentNode.replaceChild(clone, fileopen);
}, false);

Trên jsfiddle

Điều quan trọng cần lưu ý là phương thức cloneNode không bảo tồn các trình xử lý sự kiện liên quan.

Xem ví dụ này.

document.getElementById("fileopen").addEventListener("change", function () {
    alert("change");
}, false);

document.getElementById("clear").addEventListener("click", function () {
    var fileopen = document.getElementById("fileopen"),
        clone = fileopen.cloneNode(true);

    fileopen.parentNode.replaceChild(clone, fileopen);
}, false);

Trên jsfiddle

Nhưng jquery.clone cung cấp điều này [* 1]

$("#fileopen").change(function () {
    alert("change");
});

$("#clear").click(function () {
    var fileopen = $("#fileopen"),
        clone = fileopen.clone(true);

    fileopen.replaceWith(clone);
});

Trên jsfiddle

[* 1] jquery có thể làm điều này nếu các sự kiện được thêm vào bằng các phương thức của jquery vì nó giữ một bản sao trong jquery.data , nó không hoạt động khác, vì vậy đó là một chút gian lận / xung quanh và có nghĩa là mọi thứ không tương thích giữa các phương pháp hoặc thư viện khác nhau.

document.getElementById("fileopen").addEventListener("change", function () {
    alert("change");
}, false);

$("#clear").click(function () {
    var fileopen = $("#fileopen"),
        clone = fileopen.clone(true);

    fileopen.replaceWith(clone);
});

Trên jsfiddle

Bạn không thể lấy trình xử lý sự kiện đính kèm trực tiếp từ chính phần tử.

Đây là nguyên tắc chung trong javascript vanilla, đây là cách jquery tất cả các thư viện khác làm điều đó (đại khái).

(function () {
    var listeners = [];

    function getListeners(node) {
        var length = listeners.length,
            i = 0,
            result = [],
            listener;

        while (i < length) {
            listener = listeners[i];
            if (listener.node === node) {
                result.push(listener);
            }

            i += 1;
        }

        return result;
    }

    function addEventListener(node, type, handler) {
        listeners.push({
            "node": node,
                "type": type,
                "handler": handler
        });

        node.addEventListener(type, handler, false);
    }

    function cloneNode(node, deep, withEvents) {
        var clone = node.cloneNode(deep),
            attached,
            length,
            evt,
            i = 0;

        if (withEvents) {
            attached = getListeners(node);
            if (attached) {
                length = attached.length;
                while (i < length) {
                    evt = attached[i];
                    addEventListener(clone, evt.type, evt.handler);

                    i += 1;
                }
            }
        }

        return clone;
    }

    addEventListener(document.getElementById("fileopen"), "change", function () {
        alert("change");
    });

    addEventListener(document.getElementById("clear"), "click", function () {
        var fileopen = document.getElementById("fileopen"),
            clone = cloneNode(fileopen, true, true);

        fileopen.parentNode.replaceChild(clone, fileopen);
    });
}());

Trên jsfiddle

Tất nhiên jquery và các thư viện khác có tất cả các phương thức hỗ trợ khác cần thiết để duy trì một danh sách như vậy, đây chỉ là một minh chứng.


Những công việc này! (ít nhất là bit JS vanilla khi bắt đầu câu trả lời này). Tôi đã thử nghiệm điều này trong Chrome, Firefox và IE mới nhất (11).
PhilT

4
Tôi đã định thêm một số câu trả lời rất giống nhau của bạn, nhưng chủ yếu là vậy .val(''). Không phải nó đơn giản hơn việc nhân bản thành phần tải lên hoặc thêm một hình thức lồng nhau sao? +1.
Erenor Paz

3
Giải pháp JQuery đầu tiên (sử dụng .val("")) đã hoạt động hoàn hảo, cảm ơn. Đơn giản hơn nhiều so với nhân bản đầu vào và thay thế nó, quá.
Hugo Zink

51

Vì lý do bảo mật rõ ràng, bạn không thể đặt giá trị của đầu vào tệp, ngay cả thành một chuỗi trống.

Tất cả những gì bạn phải làm là đặt lại biểu mẫu nơi trường hoặc nếu bạn chỉ muốn đặt lại mục nhập tệp của biểu mẫu có chứa các trường khác, hãy sử dụng:

function reset_field (e) {
    e.wrap('<form>').parent('form').trigger('reset');
    e.unwrap();
}​

Đây là một ví dụ: http://jsfiddle.net/v2SZJ/1/


6
Không hoạt động chính xác trong IE. Giá trị trực quan được đặt lại, nhưng el.value vẫn báo cáo phiên bản trước. Nó giúp thiết lập lại el.value, nhưng chỉ trong IE10 +. jsfiddle.net/9uPh5/2
gregor

2
Giải pháp tương tự như trên
PhilT

2
Điều đó sai, chúng tôi không thể đặt trường thành một giá trị nhất định nhưng hy vọng, chúng tôi có thể xóa nó.
fralbo


20

Trong IE8, họ đã tạo trường Tải lên tệp chỉ đọc để bảo mật. Xem bài đăng trên blog của nhóm IE :

Trong lịch sử, Kiểm soát tải lên tệp HTML () là nguồn gốc của một số lỗ hổng công bố thông tin đáng kể. Để giải quyết các vấn đề này, hai thay đổi đã được thực hiện đối với hành vi của kiểm soát.

Để chặn các cuộc tấn công dựa vào việc đánh cắp các tổ hợp phím của Google để lén lút lừa người dùng nhập một đường dẫn tệp cục bộ vào điều khiển, hộp chỉnh sửa Đường dẫn tệp hiện chỉ đọc. Người dùng phải chọn rõ ràng một tệp để tải lên bằng hộp thoại Duyệt tệp.

Ngoài ra, đường dẫn thư mục cục bộ của Bao gồm khi tải lên tập tin, URL URLAction đã được đặt thành "Tắt" cho Vùng Internet. Thay đổi này ngăn chặn rò rỉ thông tin hệ thống tệp cục bộ có khả năng nhạy cảm với Internet. Chẳng hạn, thay vì gửi đường dẫn đầy đủ C: \ users \ ericlaw \ Documents \ secret \ image.png, Internet Explorer 8 giờ đây sẽ chỉ gửi tên tệp image.png.


16

$("#control").val('')là tất cả những gì bạn cần! Đã thử nghiệm trên Chrome bằng JQuery 1.11

Những người dùng khác cũng đã thử nghiệm trên Firefox.


2
Như nhiều bài viết khác ở đây giải thích, đây không phải là trình duyệt thân thiện.
Tisch

Đối với sự hiểu biết của tôi những trình duyệt này không thành công trong?
The Hamopes 6/12/2015

1
Thất bại trong Internet Explorer dưới dạng tệp loại đầu vào chỉ đọc trong IE>
Lucky

4
Hoạt động trong chrome và firefox. Quá đủ.
naimul64

12

Tôi đã bị mắc kẹt với tất cả các tùy chọn ở đây. Đây là một bản hack mà tôi đã thực hiện:

<form>
 <input type="file">
 <button type="reset" id="file_reset" style="display:none">
</form>

và bạn có thể kích hoạt thiết lập lại bằng jQuery với một mã tương tự như sau:

$('#file_reset').trigger('click');

(jsfiddle: http://jsfiddle.net/eCbd6/ )


3
ok nhưng nó sẽ xóa toàn bộ biểu mẫu .. không nhập tệp cụ thể
Ashish Ratan

8

Tôi đã kết thúc với điều này:

if($.browser.msie || $.browser.webkit){
  // doesn't work with opera and FF
  $(this).after($(this).clone(true)).remove();  
}else{
  this.setAttribute('type', 'text');
  this.setAttribute('type', 'file'); 
}

có thể không phải là giải pháp tao nhã nhất, nhưng nó hoạt động theo như tôi có thể nói.



không hoạt động trong chrome 34 (linux). Phương thức thay thếithith () hoạt động trong cả hai trình duyệt (chrome, firefox)
Gaurav Sharma

Đầu tiên tôi phải chú ý "$ .browser đã bị xóa khỏi jquery 1.9" nhưng hai dòng cuối cùng (Thay đổi thuộc tính loại thành văn bản và sau đó đặt lại vào tệp) đã hoạt động. Ngoài ra, tôi đã cố gắng đặt $ ('# control'). Val (''); hoặc trong tài liệu javascript.getEuityById (control) .value = ''; và cũng làm việc và không biết tại sao chúng ta không nên sử dụng phương pháp này!? Cuối cùng, tôi quyết định sử dụng cả hai.
QMaster

8

Tôi đã sử dụng https://github.com/malsup/form/blob/master/jquery.form.js , có một chức năng được gọi clearInputs()là crossbrowser, được kiểm tra tốt, dễ sử dụng và xử lý cả vấn đề IE và xóa trường ẩn Nếu cần thiết. Có thể một giải pháp dài để chỉ xóa đầu vào tệp, nhưng nếu bạn đang xử lý tải lên tệp crossbrowser, thì giải pháp này được khuyến nghị.

Việc sử dụng rất dễ dàng:

// Xóa tất cả các trường tệp:
$ ("đầu vào: tệp"). clearInputs ();

// Xóa các trường cũng ẩn:
$ ("input: file"). clearInputs (true);

// Xóa các trường cụ thể:
$ ("# myfilefield1, # ​​myfilefield2"). ClearInputs ();
/ **
 * Xóa các phần tử biểu mẫu đã chọn.
 * /
$ .fn.clearFields = $ .fn.clearInputs = function (includeHidden) {
    var re = / ^ (?: màu | ngày | datetime | email | tháng | số | mật khẩu | phạm vi | tìm kiếm | tel | văn bản | thời gian | url | tuần) $ / i; // 'hidden' không có trong danh sách này
    trả về this.each (function () {
        var t = this.type, tag = this.tagName.toLowerCase ();
        if (re.test (t) || tag == 'textarea') {
            this .value = '';
        }
        khác nếu (t == 'hộp kiểm' | | t == 'radio') {
            this .checked = false;
        }
        khác if (tag == 'select') {
            this.selected Index = -1;
        }
        khác nếu (t == "tập tin") {
            if (/MSIE/.test(navigator.userAgent)) {
                $ (này) .replaceWith ($ (này) .clone (đúng));
            } khác {
                $ (này) .val ('');
            }
        }
        khác nếu (bao gồm cả)
            // includeHidden có thể là giá trị true hoặc nó có thể là chuỗi chọn
            // chỉ ra một bài kiểm tra đặc biệt; ví dụ:
            // $ ('# myForm'). clearForm ('. Special: hidden')
            // ở trên sẽ dọn sạch các đầu vào ẩn có lớp 'đặc biệt'
            if ((includeHidden === true && /hidden/.test(t)) ||
                 (typeof includeHidden == 'string' && $ (this) .is (includeHidden)))
                this .value = '';
        }
    });
};

Tôi không hiểu tại sao câu trả lời này không được nâng cao hơn?!
AlexB

1
@AlexB: Bởi vì, như Timo đã giải thích, sẽ quá mức cần thiết để xóa một trường nhập tệp.
TheCarver 14/2/2015

Không biết nếu nó hoạt động nhưng không còn nữa trên FF 45.0.2 :(
fralbo

5

Giá trị của đầu vào tệp chỉ được đọc (vì lý do bảo mật). Bạn không thể xóa nó theo chương trình (ngoài cách gọi phương thức reset () của biểu mẫu, có phạm vi rộng hơn chỉ trường đó).


16
Tôi bối rối - Tôi đã thử $ ("# inputControl"). Val ("") và nó thực sự đã làm trống trường. Tui bỏ lỡ điều gì vậy?
Sampson

1
@Jonathan, cũng hoạt động với tôi, nhưng nếu bạn đặt nó thành bất cứ điều gì khác thì đó là lỗi bảo mật. Đã thử nghiệm trong FF4.
Brenden

reset () là một phương thức gốc của JS, vì vậy nếu bạn chọn biểu mẫu thông qua jQuery, bạn cần đưa phần tử ra khỏi phạm vi jQuery. $ ("mẫu # myForm") [0] .reset ();
Chris Stephens

4
@Jonathan Nó hoạt động cho bạn vì bạn đã không làm điều đó trong IE. Vấn đề bảo mật này là điều mà chỉ IE dừng lại. Xóa giá trị thường xuyên hoạt động trong cả Chrome và Firefox, nhưng không phải IE
VoidKing

5

Tôi đã có thể làm cho tôi làm việc với mã sau đây:

var input = $("#control");    
input.replaceWith(input.val('').clone(true));

5

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 dành 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>


4

Các .clone()điều nào không làm việc trong Opera (và có thể những người khác). Nó giữ nội dung.

Phương pháp gần nhất ở đây đối với tôi là của Jonathan trước đó, tuy nhiên đảm bảo rằng trường giữ nguyên tên, các lớp, v.v. được tạo cho mã lộn xộn trong trường hợp của tôi.

Một cái gì đó như thế này có thể hoạt động tốt (cũng nhờ Quentin):

function clearInput($source) {
    var $form = $('<form>')
    var $targ = $source.clone().appendTo($form)
    $form[0].reset()
    $source.replaceWith($targ)
}

Điều này đã được thử nghiệm trong tất cả các trình duyệt chính?
Shawn

Nó dường như hoạt động tốt trong phiên bản Chrome / FF / Opera mới nhất và trong IE8. Tôi không thể thấy bất kỳ lý do nào khiến nó không hoạt động trên bất cứ thứ gì - tùy chọn đặt lại trên các biểu mẫu đã có từ lâu.
SpoonNZ

4

Tôi đã quản lý để làm cho điều này hoạt động bằng cách sử dụng ...

function resetFileElement(ele) 
{
    ele.val(''); 
    ele.wrap('<form>').parent('form').trigger('reset');   
    ele.unwrap();
    ele.prop('files')[0] = null;
    ele.replaceWith(ele.clone());    
}

Điều này đã được thử nghiệm trong IE10, FF, Chrome & Opera.

Có hai hãy cẩn thận ...

  1. Vẫn không hoạt động chính xác trong FF, nếu bạn làm mới trang, phần tử tệp sẽ được điền lại với tệp đã chọn. Nơi mà nó nhận được thông tin này là ngoài tôi. Những gì khác liên quan đến một yếu tố đầu vào tập tin tôi có thể cố gắng để xóa?

  2. Hãy nhớ sử dụng ủy quyền cho bất kỳ sự kiện nào bạn đã đính kèm vào phần tử nhập tệp, để chúng vẫn hoạt động khi bản sao được tạo.

Điều tôi không hiểu là ai trên trái đất nghĩ rằng không cho phép bạn xóa trường nhập liệu khỏi lựa chọn tệp không hợp lệ là một ý tưởng tốt?

OK, đừng để tôi tự động đặt nó với một giá trị để tôi không thể lọc các tệp từ HĐH của người dùng, nhưng hãy để tôi xóa lựa chọn không hợp lệ mà không đặt lại toàn bộ biểu mẫu.

Dù sao thì nó cũng không giống như 'chấp nhận', ngoài bất kỳ bộ lọc nào và trong IE10, nó thậm chí còn không hiểu các loại mime MS Word, đó là một trò đùa!


Điều này gần như hoạt động. Một điều bạn cần làm để làm cho công việc này trong Firefox là sử dụng .pop()trên mảng các tệp thay vì đặt nó thành null. Điều này dường như để xóa các tập tin đúng.
kmacdonald

2

Trên Firefox 40.0.3 của tôi chỉ hoạt động với cái này

 $('input[type=file]').val('');
 $('input[type=file]').replaceWith($('input[type=file]').clone(true));

1
$ ('input [type = file]'). thayWith ($ ('input [type = file]'). clone (true) .val (''));
Andrei

2

nó hoạt động với tôi trong mọi trình duyệt.

        var input = $(this);
        var next = this.nextSibling;
        var parent = input.parent();
        var form = $("<form></form>");
        form.append(input);
        form[0].reset();
        if (next) {
            $(next).before(input);
        } else {
            parent.append(input);
        }

1

Tôi đã thử với hầu hết các kỹ thuật mà người dùng đề cập, nhưng không có kỹ thuật nào trong số đó làm việc trong tất cả các trình duyệt. tức là: clone () không hoạt động trong FF cho đầu vào tệp. Tôi đã kết thúc việc sao chép thủ công đầu vào tập tin, và sau đó thay thế bản gốc bằng bản sao chép. Nó hoạt động trong tất cả các trình duyệt.

<input type="file" id="fileID" class="aClass" name="aName"/>

var $fileInput=$("#fileID");
var $fileCopy=$("<input type='file' class='"+$fileInput.attr("class")+" id='fileID' name='"+$fileInput.attr("name")+"'/>");
$fileInput.replaceWith($fileCopy);

0

$("input[type=file]").wrap("<div id='fileWrapper'/>");
$("#fileWrapper").append("<div id='duplicateFile'   style='display:none'>"+$("#fileWrapper").html()+"</div>");
$("#fileWrapper").html($("#duplicateFile").html());

1
Xin chào Niraj. Chào mừng bạn Câu trả lời này có thể đúng nhưng nó có thể sử dụng một số lời giải thích.
tomfanning

0

Điều này hoạt động với Chrome, FF và Safari

$("#control").val("")

Có thể không hoạt động với IE hoặc Opera


1
Trông gần giống với chính vấn đề trong OP
Trindaz

1
không phải là một tiêu chuẩn ecmascript, giá trị của tệp loại đầu vào là một thuộc tính bảo vệ vì lý do bảo mật.
điện tử

0

Làm cho nó không đồng bộ và đặt lại sau khi các hành động mong muốn của nút đã được thực hiện.

    <!-- Html Markup --->
    <input id="btn" type="file" value="Button" onchange="function()" />

    <script>
    //Function
    function function(e) {

        //input your coding here           

        //Reset
        var controlInput = $("#btn");
        controlInput.replaceWith(controlInput = controlInput.val('').clone(true));
    } 
    </script>

0
function clear() {
    var input = document.createElement("input");
    input.setAttribute('type', 'file');
    input.setAttribute('value', '');
    input.setAttribute('id', 'email_attach');

    $('#email_attach').replaceWith( input.cloneNode() );
}

0

nó không hoạt động với tôi:

$('#Attachment').replaceWith($(this).clone());
or 
$('#Attachment').replaceWith($('#Attachment').clone());

Vì vậy, trong asp mvc tôi sử dụng các tính năng dao cạo để thay thế đầu vào tập tin. lúc đầu, hãy tạo một biến cho chuỗi đầu vào bằng Id và Tên, sau đó sử dụng nó để hiển thị trên trang và thay thế vào nút đặt lại, nhấp:

@{
    var attachmentInput = Html.TextBoxFor(c => c.Attachment, new { type = "file" });
}

@attachmentInput

<button type="button" onclick="$('#@(Html.IdFor(p => p.Attachment))').replaceWith('@(attachmentInput)');">--</button>

0

Một cách dễ dàng là thay đổi loại đầu vào và thay đổi lại.

Một cái gì đó như thế này:

var input = $('#attachments');
input.prop('type', 'text');
input.prop('type', 'file')

-1

Bạn có thể thay thế nó bằng bản sao của nó như vậy

var clone = $('#control').clone();

$('#control').replacewith(clone);

Nhưng bản sao này với giá trị của nó quá để bạn có thể thích

var emtyValue = $('#control').val('');
var clone = emptyValue.clone();

$('#control').replacewith(clone);

-4

Thật dễ dàng lol (hoạt động trong tất cả các trình duyệt [trừ opera]):

$('input[type=file]').each(function(){
    $(this).after($(this).clone(true)).remove();
});

Câu đố về JS: http://jsfiddle.net/cw84x/1/


Tôi không quan tâm đến opera. Chỉ cần bọc nó trong mẫu sau đó nếu bạn quan tâm. Cá nhân tôi không quan tâm và tôi sẽ sử dụng phương pháp của mình.
Ẩn danh

2
Đây hoàn toàn không phải là một câu trả lời hay nhưng vấn đề chính là thái độ thực sự tồi tệ
Sam P

-5

Gì? Trong chức năng xác nhận của bạn, chỉ cần đặt

document.onlyform.upload.value="";

Giả sử tải lên là tên:

<input type="file" name="upload" id="csv_doc"/>

Tôi đang sử dụng JSP, không chắc điều đó có làm nên sự khác biệt ...

Làm việc cho tôi, và tôi nghĩ rằng nó dễ dàng hơn.

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.