การล้าง <input type = 'file' /> โดยใช้ jQuery


549

เป็นไปได้หรือไม่ที่จะล้าง<input type='file' />ค่าควบคุมด้วย jQuery? ฉันได้ลองทำสิ่งต่อไปนี้แล้ว:

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

แต่มันไม่ทำงาน

คำตอบ:


529

ง่าย: คุณห่อ<form>รอบองค์ประกอบ, .unwrap()การตั้งค่าการโทรในแบบฟอร์มแล้วเอารูปแบบการใช้ ไม่เหมือนกับ.clone()โซลูชันอื่น ๆ ในชุดข้อความนี้คุณจะจบลงด้วยองค์ประกอบเดียวกันในตอนท้าย (รวมถึงคุณสมบัติที่กำหนดเองที่ตั้งค่าไว้)

ผ่านการทดสอบและทำงานใน Opera, Firefox, Safari, Chrome และ IE6 + นอกจากนี้ยังทำงานในประเภทอื่น ๆ 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>

JSFiddle

ดังที่ Timo บันทึกไว้ด้านล่างหากคุณมีปุ่มเพื่อเปิดใช้งานการรีเซ็ตฟิลด์ภายใน<form>คุณจะต้องโทรหา.preventDefault()เหตุการณ์เพื่อป้องกันไม่<button>ให้ส่งการเรียกใช้


แก้ไข

ไม่ทำงานใน IE 11 เนื่องจากข้อผิดพลาดที่ไม่ได้รวม ข้อความ (ชื่อไฟล์) จะถูกล้างในอินพุต แต่Fileรายการจะยังคงมีอยู่


14
ผู้ชนะเลิศ! ทำงานได้ในทุกเบราว์เซอร์และหลีกเลี่ยงการโคลนฟิลด์อินพุต แต่ถ้าปุ่มที่ชัดเจนอยู่ในรูปแบบโปรดเปลี่ยนชื่อreset()เป็นเช่น reset2()เพราะอย่างน้อยใน Chrome reset()ทุกสาขาจะถูกล้างออกถ้ามันเป็น และเพิ่ม event.preventDefault () หลังจากล้างการโทรเพื่อป้องกันการส่ง วิธีนี้: <button onclick="reset2($('#file'));event.preventDefault()">Reset file</button>. การทำงานเช่น: jsfiddle.net/rPaZQ/23
Timo Kähkönen

28
ปัญหาคืออย่างน้อยทำให้เอกสารไม่ถูกต้องชั่วคราว (แบบฟอร์มต้องไม่มีแบบฟอร์มอื่น ๆ ) ไม่ว่าจะใช้งานได้ในปัจจุบันหรือไม่ก็มีอิสระที่จะทำลายทุกเวลาที่ต้องการ
cHao

6
@cHao แน่นอนว่านี่เป็นจริงหากองค์ประกอบอินพุตเป็นจริงในรูปแบบซึ่งไม่จำเป็นต้องเป็น
Ninjakannon

7
ในการมีฟอร์มภายในฟอร์มคุณสามารถสร้างองค์ประกอบฟอร์มใหม่นอก DOM หรือผนวกเข้ากับเนื้อความได้หากต้องการจากนั้นย้ายองค์ประกอบอินพุตไปไว้ภายในฟอร์มนั้น จากนั้นคุณจะรีเซ็ตฟอร์มใหม่นั้นย้ายองค์ประกอบอินพุตกลับไปที่เดิมและลบองค์ประกอบฟอร์มเพิ่มเติม
Kevin Heidt

4
ฉันเพิ่งพบว่ามันใช้งานไม่ได้ใน IE 11 เราใช้ PixelFileInput ซึ่งใช้วิธีนี้ และในขณะที่ข้อความและภาพขนาดย่อล้างวัตถุรายการไฟล์ที่ยังคงเหมือนเดิม :(
เอียนเกรนเจอร์

434

คำตอบด่วน: แทนที่

ในรหัสด้านล่างฉันใช้replaceWithวิธีการ jQuery เพื่อแทนที่การควบคุมด้วยโคลนของตัวเอง ในกรณีที่คุณมีตัวจัดการใด ๆ ที่ผูกไว้กับเหตุการณ์ในการควบคุมนี้เราจะต้องการรักษาสิ่งเหล่านั้นเช่นกัน ในการทำเช่นนี้เราจะส่งผ่านtrueเป็นพารามิเตอร์ตัวแรกของcloneวิธีการ

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

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

ซอ: http://jsfiddle.net/jonathansampson/dAQVM/

หากการโคลนขณะเก็บรักษาตัวจัดการเหตุการณ์แสดงปัญหาใด ๆ ที่คุณสามารถพิจารณาใช้การมอบหมายเหตุการณ์เพื่อจัดการการคลิกในการควบคุมนี้จากองค์ประกอบหลัก:

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

สิ่งนี้จะป้องกันความต้องการตัวจัดการใด ๆ ที่จะถูกโคลนพร้อมกับองค์ประกอบเมื่อตัวควบคุมกำลังถูกรีเฟรช


50
คุณสามารถใช้วิธี. clone () บนฟิลด์ $ ('# clone') replaceWith ($ (this) .clone ());
metric152

4
มันไม่ได้ทำอะไรเลย - ไม่มีข้อผิดพลาดใน firebug ฉันต้องเพิ่ม control.val (''); เพื่อให้มันล้างกล่องใส่ไฟล์ รหัสของคุณใช้งานได้ในโครเมี่ยมและ IE9 ตามปกติ
mnsr

10
มันยังไม่ทำงาน จะต้องมีการล้างก่อนที่จะเปลี่ยน ดังนั้นคุณต้องการ .val () ก่อน. แทนที่ด้วย () ดังนั้นมันจึงเป็น control.val ('') replaceWith (... );
mnsr

6
ฉันมีวิธีแก้ปัญหาด้านล่างที่สะอาดกว่านี้: stackoverflow.com/a/13351234/909944
slipheed

2
คำตอบนี้อยู่ที่นี่ด้วยเหตุผลทางประวัติศาสตร์ การสนับสนุนเบราว์เซอร์ที่ทันสมัยinput.value = null;
André Werlang

113

Jquery ควรดูแลปัญหาเบราว์เซอร์ข้ามเบราว์เซอร์ / เก่าสำหรับคุณ

สิ่งนี้ใช้ได้กับเบราว์เซอร์สมัยใหม่ที่ฉันทดสอบ: Chromium v25, Firefox v20, Opera v12.14

ใช้ jquery 1.9.1

HTML

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

jquery

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

บน jsfiddle

โซลูชันจาวาสคริปต์ต่อไปนี้ใช้ได้กับฉันในเบราว์เซอร์ที่กล่าวถึงข้างต้น

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

บน jsfiddle

ฉันไม่มีวิธีทดสอบกับ IE แต่ในทางทฤษฎีแล้วสิ่งนี้ควรใช้งานได้ หาก IE นั้นแตกต่างจากรุ่น Javascript ที่ใช้งานไม่ได้เพราะ MS ได้ทำไปในทางที่แตกต่างกันวิธี jquery ควรที่จะจัดการกับคุณสำหรับคุณมิฉะนั้นจะคุ้มค่าที่จะชี้ไปยังทีม jquery พร้อมกับ วิธีการที่ IE ต้องการ (ฉันเห็นคนพูดว่า "สิ่งนี้จะไม่ทำงานบน IE" แต่ไม่มีวานิลลาจาวาสคริปต์ที่จะแสดงว่ามันทำงานบน IE ได้อย่างไร (ควรจะเป็น "คุณลักษณะด้านความปลอดภัย") อาจรายงานว่าเป็นข้อผิดพลาดกับ MS เช่นกัน นับเป็นเช่นนี้) เพื่อให้ได้รับการแก้ไขในรีลีสที่ใหม่กว่า)

เช่นเดียวกับที่กล่าวถึงในคำตอบอื่นโพสต์ในฟอรั่ม jquery

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

แต่ jquery ได้ลบการสนับสนุนสำหรับการทดสอบเบราว์เซอร์แล้วjquery.browser

วิธีแก้ปัญหาจาวาสคริปต์นี้ใช้ได้สำหรับฉันมันเป็นวิธีการที่เทียบเท่ากับวิธีjquery.replaceWith

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

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

บน jsfiddle

สิ่งสำคัญที่ควรทราบก็คือเมธอดcloneNodeจะไม่เก็บตัวจัดการเหตุการณ์ที่เกี่ยวข้อง

ดูตัวอย่างนี้

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

บน jsfiddle

แต่jquery.cloneเสนอ[* 1] นี้

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

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

    fileopen.replaceWith(clone);
});

บน jsfiddle

[* 1] jquery สามารถทำสิ่งนี้ได้หากเหตุการณ์ถูกเพิ่มเข้ามาโดยวิธีการของ jquery เนื่องจากมันเก็บสำเนาไว้ในjquery.dataมันไม่ทำงานเป็นอย่างอื่นดังนั้นจึงเป็นการโกง / การแก้ไขและหมายความว่าสิ่งต่าง ๆ ไม่ได้ เข้ากันได้ระหว่างวิธีการต่าง ๆ หรือห้องสมุด

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

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

    fileopen.replaceWith(clone);
});

บน jsfiddle

คุณไม่สามารถรับตัวจัดการเหตุการณ์ที่แนบมาโดยตรงจากองค์ประกอบเอง

นี่คือหลักการทั่วไปในวานิลลาจาวาสคริปต์นี่คือวิธีที่ jQuery ที่ห้องสมุดอื่น ๆ ทำกัน (คร่าวๆ)

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

บน jsfiddle

แน่นอนว่า jquery และไลบรารีอื่น ๆ มีวิธีการสนับสนุนอื่น ๆ ที่จำเป็นสำหรับการบำรุงรักษารายการดังกล่าวนี่เป็นเพียงการสาธิต


มันใช้งานได้! (อย่างน้อยก็บิตวานิลลา JS ตอนเริ่มต้นของคำตอบนี้) ฉันได้ทำการทดสอบใน Chrome ล่าสุด Firefox และ IE (11)
PhilT

4
ผมกำลังจะเพิ่มบางส่วนของคำตอบเดียวกันมากของคุณ .val('')แต่ส่วนใหญ่ที่ มันง่ายกว่าการโคลนนิ่งองค์ประกอบการอัพโหลดหรือการเพิ่มฟอร์มซ้อนกันใช่หรือไม่ +1
Erenor Paz

3
วิธีการแก้ปัญหา JQuery แรก (โดยใช้.val("")) ทำงานได้อย่างสมบูรณ์ขอบคุณ ง่ายกว่าการโคลนอินพุตและแทนที่มันด้วย
Hugo Zink

51

เพื่อเหตุผลด้านความปลอดภัยที่ชัดเจนคุณไม่สามารถตั้งค่าอินพุตไฟล์ได้แม้จะเป็นสตริงว่าง

สิ่งที่คุณต้องทำคือรีเซ็ตแบบฟอร์มที่เขตข้อมูลหรือหากคุณต้องการรีเซ็ตไฟล์อินพุตของฟอร์มที่มีฟิลด์อื่นให้ใช้สิ่งนี้:

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

นี่คือตัวอย่าง: http://jsfiddle.net/v2SZJ/1/


6
ทำงานไม่ถูกต้องใน IE ค่าสายตาจะถูกรีเซ็ต แต่ el.value ยังคงรายงานรุ่นก่อนหน้า มันช่วยในการรีเซ็ต el.value แต่เฉพาะใน IE10 + jsfiddle.net/9uPh5/2
gregor

2
วิธีการแก้ปัญหาแบบเดียวกับข้างบน
PhilT

2
เป็นความผิดพลาดเราไม่สามารถตั้งค่าฟิลด์เป็นค่าที่กำหนด แต่หวังว่าเราจะสามารถล้างมันได้
โบ

44

มันใช้งานได้สำหรับฉัน

$("#file").replaceWith($("#file").clone());

http://forum.jquery.com/topic/how-to-clear-a-file-input-in-ie

หวังว่ามันจะช่วย


1
ใช้งานได้สำหรับฉัน! เป็นที่น่าสังเกตว่าถ้าคุณมีผู้ฟังเหตุการณ์ใด ๆ ที่ถูกทริกเกอร์โดยการเปลี่ยนแปลงในอินพุตไฟล์คุณจะต้องกำหนดใหม่เมื่อคุณแทนที่อินพุทแล้ว
JCollerton

20

ใน IE8 พวกเขาสร้างฟิลด์อัปโหลดไฟล์เป็นแบบอ่านอย่างเดียวเพื่อความปลอดภัย ดูโพสต์บล็อกทีม IE :

ในอดีตการควบคุมการอัปโหลดไฟล์ HTML () เป็นแหล่งที่มาของช่องโหว่การเปิดเผยข้อมูลจำนวนมาก เมื่อต้องการแก้ไขปัญหาเหล่านี้ทำการเปลี่ยนแปลงที่สองกับลักษณะการทำงานของตัวควบคุม

เมื่อต้องการบล็อกการโจมตีที่อาศัยการกดแป้น "ขโมย" เพื่อหลอกผู้ใช้อย่างลับ ๆ ล่อๆให้พิมพ์เส้นทางของไฟล์ในเครื่องไปยังตัวควบคุมตอนนี้กล่องแก้ไขเส้นทางไฟล์จะเป็นแบบอ่านอย่างเดียว ผู้ใช้ต้องเลือกไฟล์ที่จะอัพโหลดอย่างชัดเจนโดยใช้กล่องโต้ตอบเรียกดูไฟล์

นอกจากนี้ URL "การรวมเส้นทางในเครื่องเมื่ออัพโหลดไฟล์" URLAction ได้รับการตั้งค่าเป็น "ปิดใช้งาน" สำหรับโซนอินเทอร์เน็ต การเปลี่ยนแปลงนี้ป้องกันการรั่วไหลของข้อมูลระบบไฟล์ในท้องถิ่นที่มีความอ่อนไหวต่ออินเทอร์เน็ต ตัวอย่างเช่นแทนที่จะส่งเส้นทางแบบเต็ม C: \ users \ ericlaw \ เอกสาร \ secret \ image.png ตอนนี้ Internet Explorer 8 จะส่งเฉพาะชื่อไฟล์ image.png


16

$("#control").val('')คือทั้งหมดที่คุณต้องการ! ทดสอบกับ Chrome โดยใช้ JQuery 1.11

ผู้ใช้รายอื่นได้ทดสอบใน Firefox เช่นกัน


2
ดังที่โพสต์อื่น ๆ ที่นี่อธิบายว่านี่ไม่ได้เป็นเบราว์เซอร์ที่เป็นมิตร
Tisch

เพื่อความเข้าใจว่าเบราว์เซอร์ใดที่ล้มเหลว
TheHamstring

1
ล้มเหลวใน Internet Explorer เนื่องจากไฟล์ประเภทอินพุตเป็นแบบอ่านอย่างเดียวใน IE>
โชคดี

4
ทำงานได้ในโครเมี่ยมและ Firefox มากเกินพอ
naimul64

12

ฉันติดกับตัวเลือกทั้งหมดที่นี่ นี่คือแฮ็คที่ฉันทำซึ่งใช้งานได้:

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

และคุณสามารถทริกเกอร์การรีเซ็ตโดยใช้ jQuery ด้วยรหัสที่คล้ายกับสิ่งนี้:

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

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


3
โอเค แต่มันจะเคลียร์ทั้งฟอร์ม .. ไม่ใช่ไฟล์เฉพาะ
Ashish Ratan

8

ฉันลงเอยด้วยสิ่งนี้:

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

อาจไม่ใช่วิธีที่หรูหราที่สุด แต่ก็ใช้ได้เท่าที่ฉันสามารถบอกได้



ไม่ทำงานใน chrome 34 (linux) replaceWith () วิธีการทำงานในทั้งสองเบราว์เซอร์ (chrome, firefox)
Gaurav Sharma

ในตอนแรกฉันต้องสังเกตุว่า "$ .browser ถูกลบออกจาก jquery 1.9" แต่สองบรรทัดสุดท้าย (การเปลี่ยนแอตทริบิวต์ประเภทเป็นข้อความแล้วตั้งค่ากลับเป็นไฟล์) นอกจากนี้ฉันพยายามตั้งค่า $ ('# control'). val (''); หรือใน javascript document.getElementById (ตัวควบคุม) .value = ''; และทำงานด้วยและไม่รู้ว่าทำไมเราไม่ควรใช้วิธีนี้! ในที่สุดฉันตัดสินใจใช้ทั้งสองอย่าง
QMaster

8

ฉันใช้https://github.com/malsup/form/blob/master/jquery.form.jsซึ่งมีฟังก์ชันที่เรียกว่าclearInputs()ซึ่งเป็น crossbrowser ทดสอบอย่างดีใช้งานง่ายและจัดการปัญหา IE และเขตข้อมูลที่ซ่อนอยู่ หากมีความจำเป็น. อาจเป็นวิธีแก้ปัญหาเพียงเล็กน้อยในการล้างอินพุตไฟล์เท่านั้น แต่หากคุณกำลังจัดการกับการอัพโหลดไฟล์ crossbrowser แนะนำให้ใช้โซลูชันนี้

การใช้งานง่าย:

// ล้างฟิลด์ไฟล์ทั้งหมด:
$ ( "การป้อนข้อมูล: ไฟล์") clearInputs ();.

// ล้างเขตข้อมูลที่ซ่อนอยู่:
$ ( "การป้อนข้อมูล: ไฟล์") clearInputs (จริง).

// ล้างข้อมูลเฉพาะ:
$ ( "# myfilefield1 # myfilefield2") clearInputs ().
/ **
 * ล้างองค์ประกอบของฟอร์มที่เลือก
 * /
$ .fn.clearFields = $ .fn.clearInputs = ฟังก์ชั่น (includeHidden) {
    var re = / ^ (?: สี | วันที่ | วันที่และเวลา | อีเมล | เดือน | หมายเลข | รหัสผ่าน | ช่วง | ค้นหา | โทร | ข้อความ | เวลา | URL | สัปดาห์) $ / i; // 'ซ่อน' ไม่ได้อยู่ในรายการนี้
    กลับ this.each (ฟังก์ชั่น () {
        var t = this.type, tag = this.tagName.toLowerCase ();
        if (re.test (t) || tag == 'textarea') {
            this.value = '';
        }
        อื่นถ้า (t == 'ช่องทำเครื่องหมาย' || t == 'radio') {
            this.checked = false;
        }
        อื่นถ้า (แท็ก == 'เลือก') {
            this.selectedIndex = -1;
        }
        อื่นถ้า (t == "ไฟล์") {
            if (/MSIE/.test(navigator.userAgent)) {
                $ (นี้) .replaceWith ($ (นี้) .clone (จริง));
            } อื่น {
                $ (นี้) .val ( '');
            }
        }
        อื่นถ้า (รวมถึงซ่อน) {
            // includeHidden สามารถเป็นค่าจริงหรืออาจเป็นสตริงตัวเลือก
            // ระบุการทดสอบพิเศษ; ตัวอย่างเช่น:
            // $ ('# myForm'). clearForm ('. special: hidden')
            // ด้านบนจะล้างอินพุตที่ซ่อนอยู่ซึ่งมีคลาส 'พิเศษ'
            if ((includeHidden === true && /hidden/.test(t)) ||
                 (typeof includeHidden == 'string' && $ (นี่) .is (includeHidden))
                this.value = '';
        }
    });
};

ฉันไม่เข้าใจว่าทำไมคำตอบนี้จึงไม่ได้รับการโหวตเพิ่มเติม
AlexB

1
@AlexB: เพราะอย่างที่ Timo อธิบายมันเกินความจริงเพียงแค่เคลียร์ฟิลด์อินพุตไฟล์หนึ่งฟิลด์
TheCarver

ไม่ทราบว่าสามารถใช้งานได้หรือไม่ แต่ไม่ใช้ FF 45.0.2 :(
fralbo

5

ค่าอินพุตไฟล์อ่านได้อย่างเดียว (เพื่อเหตุผลด้านความปลอดภัย) คุณไม่สามารถทำให้มันว่างเปล่าโดยทางโปรแกรม (นอกเหนือจากการเรียกใช้เมธอด reset () ของฟอร์มซึ่งมีขอบเขตที่กว้างกว่าฟิลด์นั้น)


16
ฉันสับสน - ฉันลอง $ ("# inputControl"). val ("") และมันทำให้ฟิลด์นั้นว่างเปล่า ฉันพลาดอะไรไปรึเปล่า?
Sampson

1
@ โจนาธานก็ทำงานให้ฉันด้วย แต่ถ้าคุณตั้งให้เป็นอย่างอื่นนั่นเป็นข้อผิดพลาดด้านความปลอดภัย ทดสอบใน FF4
Brenden

รีเซ็ต () เป็นวิธีการดั้งเดิมของ JS ดังนั้นหากคุณเลือกแบบฟอร์มผ่าน jQuery คุณจะต้องนำองค์ประกอบออกจากขอบเขต jQuery $ ( "รูปแบบ # myForm") [0] .reset ();
Chris Stephens

4
@ Jonathan มันเหมาะกับคุณเพราะคุณไม่ได้ทำใน IE ปัญหาด้านความปลอดภัยนี้เป็นสิ่งที่ IE หยุดเท่านั้น การล้างค่าทำงานเป็นประจำทั้งใน Chrome และ Firefox แต่ไม่ใช่ IE
VoidKing

5

ฉันสามารถทำงานของฉันด้วยรหัสต่อไปนี้:

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

5

ฉันกำลังมองหาวิธีที่ง่ายและสะอาดในการล้างอินพุตไฟล์ HTML คำตอบข้างต้นนั้นยอดเยี่ยม แต่ไม่มีคำตอบใดที่ฉันกำลังมองหาจนกระทั่งฉันเข้ามาในเว็บด้วยวิธีที่ง่ายและสง่างามในการทำ:

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

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

ทั้งหมดเครดิตเดินทางไปยังคริส 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

.clone()สิ่งที่ไม่ได้ทำงานในโรงละครโอเปร่า (และอาจอื่น ๆ ) มันเก็บเนื้อหา

วิธีที่ใกล้เคียงที่สุดสำหรับฉันคือโจนาธานมาก่อนหน้านี้ แต่รับรองว่าฟิลด์จะรักษาชื่อคลาสและอื่น ๆ ไว้สำหรับรหัสที่ยุ่งเหยิงในกรณีของฉัน

บางสิ่งเช่นนี้อาจทำงานได้ดี (ขอบคุณ Quentin ด้วย):

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

สิ่งนี้ได้รับการทดสอบในเบราว์เซอร์หลักทั้งหมดหรือไม่
Shawn

ดูเหมือนว่าจะทำงานได้ดีใน Chrome / FF / Opera เวอร์ชันล่าสุดและใน IE8 ฉันไม่เห็นเหตุผลที่จะไม่ทำงานกับสิ่งใด - ตัวเลือกรีเซ็ตในแบบฟอร์มใช้เวลานานมาก
SpoonNZ

4

ฉันจัดการเพื่อให้เรื่องนี้ทำงานโดยใช้สิ่งต่อไปนี้ ...

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

สิ่งนี้ได้รับการทดสอบใน IE10, FF, Chrome & Opera

มีสองประการคือ ...

  1. ยังคงทำงานไม่ถูกต้องใน FF หากคุณรีเฟรชหน้าองค์ประกอบไฟล์จะได้รับการเติมข้อมูลอีกครั้งด้วยไฟล์ที่เลือก การรับข้อมูลนี้จากที่ใดนั้นเกินกว่าฉัน มีอะไรเกี่ยวข้องกับองค์ประกอบอินพุตไฟล์ที่เป็นไปได้ที่ฉันสามารถลองล้างได้

  2. อย่าลืมใช้การมอบหมายในเหตุการณ์ใด ๆ ที่คุณแนบกับองค์ประกอบอินพุตไฟล์ดังนั้นจึงยังคงทำงานได้เมื่อทำการโคลน

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

ตกลงอย่าให้ฉันตั้งค่าแบบไดนามิกดังนั้นฉันจึงไม่สามารถกรองไฟล์จากระบบปฏิบัติการของผู้ใช้ได้ แต่ให้ฉันล้างการเลือกที่ไม่ถูกต้องโดยไม่ต้องรีเซ็ตทั้งฟอร์ม

มันไม่เหมือนกับ 'accept' ทำอะไรอย่างอื่นนอกจากตัวกรอง แต่อย่างใดและใน IE10 มันไม่เข้าใจแม้แต่ชนิด MS Word mime มันเป็นเรื่องตลก!


เกือบจะใช้งานได้แล้ว สิ่งหนึ่งที่คุณต้องทำเพื่อให้งานนี้ใน Firefox คือการใช้.pop()กับอาเรย์ของไฟล์แทนที่จะตั้งเป็นโมฆะ ดูเหมือนว่าจะล้างไฟล์อย่างถูกต้อง
kmacdonald

2

ใน Firefox 40.0.3 ของฉันใช้งานได้กับสิ่งนี้เท่านั้น

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

1
. $ ( 'อินพุต [ประเภทไฟล์ =]') replaceWith (. $ ( 'อินพุต [ประเภทไฟล์ =]') โคลน (จริง) .val ( ''));
Andrei

2

มันทำงานได้สำหรับฉันในทุกเบราว์เซอร์

        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

ฉันได้ลองใช้เทคนิคส่วนใหญ่ที่ผู้ใช้กล่าวถึง แต่ไม่มีการใช้งานในเบราว์เซอร์ทั้งหมด ie: clone () ไม่ทำงานใน FF สำหรับอินพุตไฟล์ ฉันสิ้นสุดการคัดลอกอินพุตไฟล์ด้วยตนเองจากนั้นแทนที่ต้นฉบับด้วยไฟล์ที่คัดลอก มันทำงานได้ในทุกเบราว์เซอร์

<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
สวัสดี Niraj ยินดีต้อนรับ คำตอบนี้อาจถูกต้อง แต่อาจใช้คำอธิบายบางอย่าง
tomfanning

0

ใช้งานได้กับ Chrome, FF และ Safari

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

อาจไม่ทำงานกับ IE หรือ Opera


1
ดูเหมือนเกือบจะเหมือนกับปัญหาที่เกิดขึ้นใน OP
Trindaz

1
ไม่ใช่มาตรฐาน ecmascript ค่าของไฟล์ประเภทอินพุตเป็นคุณสมบัติการป้องกันด้วยเหตุผลด้านความปลอดภัย
e-info128

0

ทำให้แบบอะซิงโครนัสและรีเซ็ตหลังจากการกระทำที่ต้องการของปุ่มเสร็จสิ้น

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

มันไม่ทำงานสำหรับฉัน:

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

ดังนั้นใน asp mvc ฉันใช้คุณสมบัติมีดโกนเพื่อแทนที่ไฟล์อินพุต ตอนแรกสร้างตัวแปรสำหรับสายอักขระการป้อนข้อมูลด้วยรหัสและชื่อแล้วใช้มันเพื่อแสดงในหน้าและแทนที่ด้วยปุ่มรีเซ็ตคลิก:

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

@attachmentInput

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

0

วิธีง่ายๆคือการเปลี่ยนประเภทอินพุตและเปลี่ยนกลับมาอีกครั้ง

บางสิ่งเช่นนี้

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

-1

คุณสามารถแทนที่ด้วยโคลนอย่างนั้น

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

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

แต่โคลนนิ่งนี้มีค่าเหมือนกันดังนั้นคุณก็จะมีความสุขมากกว่านี้

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

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

-4

มันง่ายมาก ๆ (ใช้ได้กับเบราว์เซอร์ทั้งหมด [ยกเว้นโอเปร่า])

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

JS Fiddle: http://jsfiddle.net/cw84x/1/


ฉันไม่สนใจเรื่องโอเปร่า เพียงแค่ห่อในแบบฟอร์มแล้วถ้าคุณสนใจ โดยส่วนตัวฉันไม่สนใจและฉันจะใช้วิธีการของฉัน
ไม่ระบุชื่อ

2
นี่ไม่ใช่คำตอบที่ดีเลย แต่ปัญหาหลักคือทัศนคติที่ไม่ดีจริงๆ
Sam P

-5

อะไร? ในฟังก์ชันการตรวจสอบของคุณเพียงแค่ใส่

document.onlyform.upload.value="";

สมมติว่าการอัปโหลดเป็นชื่อ:

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

ฉันกำลังใช้ JSP ไม่แน่ใจว่ามันสร้างความแตกต่างหรือไม่

ใช้งานได้สำหรับฉันและฉันคิดว่ามันง่ายกว่า

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