cara mengaktifkan acara pada file pilih

95

Saya sudah berbentuk sebagai

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

Ini untuk mengunggah gambar.

Di sini saya perlu mengklik tombol untuk mengunggah gambar dan saya telah menggunakan onClickacara. Saya ingin menghapus tombol unggah dan segera setelah file dipilih di masukan, saya ingin mengaktifkan acara tersebut. Bagaimana aku melakukan itu??

ptamzz.dll
sumber
Jika Anda khawatir tentang memilih file yang sama dua kali, @applecrusher memiliki solusi yang lebih baik daripada jawaban yang dipilih stackoverflow.com/a/40581284/1520304
Will Farley

Jawaban:

130

Gunakan acara perubahan pada input file.

$("#file").change(function(){
         //submit the form here
 });
Vincent Ramdhanie
sumber
32
dan apa yang terjadi jika Anda mengirimkan formulir secara asinkron, tidak keluar dari halaman, lalu mencoba mengupload file yang sama lagi? Kode ini hanya akan dijalankan sekali, kedua kalinya, memilih file yang sama tidak akan menjalankan peristiwa perubahan
Christopher Thomas
6
Keberatan @ChristopherThomas adalah alasan mengapa saya ada di sini, dan untungnya ada tanggapan yang kurang diperhatikan di bawah ini yang menyelesaikannya, bertahun-tahun kemudian: stackoverflow.com/a/40581284/4526479
Kyle Baker
1
peristiwa perubahan tidak terpicu ketika saya memilih file yang sama lagi. Adakah cara lain yang dapat berhasil setiap saat?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ
1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ Lihat komentar tepat di atas komentar Anda.
David Lopez
3
Fakta bahwa jawabannya tidak menggunakan javascript murni adalah salah
Dimitris Filippou
68

Anda dapat berlangganan acara onchange di kolom input:

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

lalu:

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

Ini adalah pertanyaan lama yang membutuhkan jawaban lebih baru yang akan menjawab kekhawatiran @Christopher Thomas di atas dalam komentar jawaban terima. Jika Anda tidak keluar dari halaman lalu memilih file untuk kedua kalinya, Anda perlu menghapus nilainya saat mengklik atau melakukan touchstart (untuk seluler). Di bawah ini akan berfungsi bahkan ketika Anda keluar dari halaman dan menggunakan 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
});
penghancur apel
sumber
Apakah ini kompatibel lintas-browser? Sepertinya ini hanya digunakan val(''), yang tidak berfungsi di sebagian besar browser.
Sean Kendle
Peramban mana yang tidak berfungsi saat Anda mencoba? Coba kloning objek dengan dirinya sendiri jika masih menjadi masalah bagi Anda.
penghancur apel
2
Masalah saya adalah menggunakan element.setAttribute("value", "")Jika Anda tidak menggunakan jQuery yang perlu Anda gunakan element.value = ""untuk mendapatkan elemen file agar benar-benar jelas.
Phil
1

Lakukan apa pun yang ingin Anda lakukan setelah file berhasil dimuat. Tepat setelah selesai pemrosesan file Anda, atur nilai kontrol file ke string kosong. Sehingga .change () akan selalu dipanggil meskipun nama file berubah atau tidak. seperti misalnya Anda dapat melakukan hal ini dan bekerja untuk saya seperti pesona

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

Solusi untuk pengguna vue, memecahkan masalah saat Anda mengunggah file yang sama beberapa kali dan peristiwa @change tidak memicu:

 <input
      ref="fileInput"
      type="file"
      @click="onClick"
    />
  methods: {
    onClick() {
       this.$refs.fileInput.value = ''
       // further logic for file...
    }
  }
Alb Bolush
sumber
<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" /> self. $ refs.inputFile.value = ''
Pragati Dugar
0

<input type = "file" @ change = "onFileChange" class = "input upload-input" ref = "inputFile" />

onFileChange(e) {
//upload file and then delete it from input 
 self.$refs.inputFile.value = ''
}
Pragati Dugar
sumber
0

vanilla js menggunakan es6

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
InkieBeard
sumber