วิธีการเริ่มต้นเหตุการณ์ในไฟล์เลือก


95

ฉันมีรูปแบบเป็น

<form  onSubmit="return disableForm(this);" action="upload.php" method="post" name="f" id="wizecho" enctype="multipart/form-data">
    <input type="file" name="file" />
    <button onClick="return disableForm(this),ajaxUpload(this.form,'wizecho_upload.php', '&lt;br&gt;Uploading image please wait.....&lt;br&gt;'); return false;">
        Upload Image
    </button>
</form>

มันคือการอัปโหลดภาพ

ที่นี่ฉันต้องคลิกที่ปุ่มเพื่ออัปโหลดภาพและฉันจะใช้onClickเหตุการณ์ ฉันต้องการลบปุ่มอัปโหลดและทันทีที่ไฟล์ถูกเลือกที่อินพุตฉันต้องการเริ่มต้นเหตุการณ์ ฉันจะทำอย่างไร ??


หากคุณกังวลเกี่ยวกับการเลือกไฟล์เดียวกันสองครั้ง @applecrusher มีวิธีแก้ปัญหาที่ดีกว่าคำตอบที่เลือกstackoverflow.com/a/40581284/1520304
Will Farley

คำตอบ:


130

ใช้เหตุการณ์การเปลี่ยนแปลงในการป้อนไฟล์

$("#file").change(function(){
         //submit the form here
 });

32
และจะเกิดอะไรขึ้นเมื่อคุณส่งแบบฟอร์มแบบอะซิงโครนัสอย่าออกนอกหน้าจากนั้นพยายามอัปโหลดไฟล์เดิมอีกครั้ง รหัสนี้จะดำเนินการเพียงครั้งเดียวครั้งที่สองการเลือกไฟล์เดียวกันจะไม่ดำเนินการเหตุการณ์การเปลี่ยนแปลง
Christopher Thomas

6
การคัดค้านของ @ChristopherThomas เป็นสาเหตุที่ทำให้ฉันมาที่นี่และโชคดีที่มีการตอบสนองต่ำมากด้านล่างซึ่งสามารถแก้ไขได้หลายปีต่อมา: stackoverflow.com/a/40581284/4526479
Kyle Baker

1
เหตุการณ์การเปลี่ยนแปลงไม่ทริกเกอร์เมื่อฉันเลือกไฟล์เดิมอีกครั้ง วิธีอื่นที่ได้ผลทุกครั้ง?
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

1
@ TᴀʀᴇǫMᴀʜᴍᴏᴏᴅดูความคิดเห็นด้านบนของคุณ
David Lopez

3
ความจริงที่ว่าคำตอบไม่ได้ใช้จาวาสคริปต์บริสุทธิ์นั้นผิด
Dimitris Filippou

69

คุณสามารถสมัครเข้าร่วมกิจกรรม onchange ในช่องป้อนข้อมูล:

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

แล้ว:

document.getElementById('file').onchange = function() {
    // fire the upload here
};

49

นี่เป็นคำถามที่เก่ากว่าซึ่งต้องการคำตอบที่ใหม่กว่าซึ่งจะกล่าวถึงข้อกังวลของ @Christopher Thomas ข้างต้นในความคิดเห็นของคำตอบที่ยอมรับ หากคุณไม่ออกจากหน้าแล้วเลือกไฟล์เป็นครั้งที่สองคุณต้องล้างค่าเมื่อคุณคลิกหรือทำการทัชสตาร์ต (สำหรับมือถือ) ด้านล่างนี้จะใช้งานได้แม้ว่าคุณจะออกจากเพจและใช้ jquery:

//the HTML
<input type="file" id="file" name="file" />



//the JavaScript

/*resets the value to address navigating away from the page 
and choosing to upload the same file */ 

$('#file').on('click touchstart' , function(){
    $(this).val('');
});


//Trigger now when you have selected any file 
$("#file").change(function(e) {
    //do whatever you want here
});

ข้ามเบราว์เซอร์นี้เข้ากันได้หรือไม่? ดูเหมือนเพิ่งใช้val('')งานซึ่งใช้ไม่ได้กับเบราว์เซอร์ส่วนใหญ่
Sean Kendle

เบราว์เซอร์ใดใช้งานไม่ได้กับที่คุณลอง ลองโคลนวัตถุด้วยตัวมันเองหากยังคงเป็นปัญหาสำหรับคุณ
applecrusher

2
ปัญหาของฉันคือการใช้element.setAttribute("value", "")ถ้าคุณไม่ได้ใช้ jQuery คุณต้องใช้element.value = ""เพื่อให้องค์ประกอบไฟล์ชัดเจนอย่างถูกต้อง
ฟิลิป

1

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

  $('#myFile').change(function () {
    LoadFile("myFile");//function to do processing of file.
    $('#myFile').val('');// set the value to empty of myfile control.
    });

1

วิธีแก้ปัญหาสำหรับผู้ใช้ vue การแก้ปัญหาเมื่อคุณอัปโหลดไฟล์เดียวกันหลาย ๆ ครั้งและเหตุการณ์ @change ไม่ทริกเกอร์:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }

<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" /> self. $ refs.inputFile.value = ''
Pragati Dugar


0

vanilla js โดยใช้ es6

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.