dosya seçiminde olay nasıl tetiklenir


95

Bir formum var

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

Bir görüntü yüklemektir.

Burada görüntüyü yüklemek için butona tıklamam gerekiyor ve onClickolayı kullanmam gerekiyor . Yükle düğmesini kaldırmak istiyorum ve girişte dosya seçilir seçilmez olayı tetiklemek istiyorum. Bunu nasıl yaparım??


Eğer iki kez aynı dosyayı seçme hakkında endişeleriniz varsa, @applecrusher seçilen cevabı daha iyi bir çözüm vardır stackoverflow.com/a/40581284/1520304
Will Farley

Yanıtlar:


130

Dosya girişindeki değişiklik olayını kullanın.

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

32
ve formu eşzamansız olarak gönderdiğinizde, sayfadan uzaklaşıp aynı dosyayı tekrar yüklemeyi denemediğinizde ne olur? Bu kod yalnızca bir kez çalıştırılır, ikinci kez aynı dosyanın seçilmesi bir değişiklik olayı yürütmez
Christopher Thomas

6
@ChristopherThomas'ın itirazı tam olarak neden buradayım ve neyse ki, yıllar sonra bunu çözen çok az göze çarpmayan bir yanıt var: stackoverflow.com/a/40581284/4526479
Kyle Baker

1
Aynı dosyayı tekrar seçtiğimde değişiklik olayı tetiklenmiyor. Her seferinde işe yarayabilecek başka bir yol var mı?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

1
@ Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ Sizinkinin hemen üzerindeki yoruma bakın.
David Lopez

3
Cevabın saf javascript kullanmadığı gerçeği sadece yanlış
Dimitris Filippou

69

Giriş alanında onchange olayına abone olabilirsiniz:

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

ve sonra:

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

49

Bu, @Christopher Thomas'ın yukarıdaki yanıt yanıtının yorumlarındaki endişesini ele alacak daha yeni bir yanıta ihtiyaç duyan eski bir sorudur. Sayfadan başka bir yere gitmezseniz ve ardından dosyayı ikinci kez seçerseniz, tıkladığınızda veya dokunarak başlattığınızda değeri temizlemeniz gerekir (mobil için). Aşağıdakiler, sayfadan uzaklaştığınızda ve jquery kullandığınızda bile çalışacaktır:

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

Bu tarayıcılar arası uyumlu mu? Görünüşe göre sadece kullanıyor val(''), bu çoğu tarayıcıda çalışmıyor.
Sean Kendle

Denediğiniz tarayıcı hangi tarayıcıda çalışmıyor? Hala sizin için bir sorunsa, nesneyi kendisiyle birlikte klonlamayı deneyin.
applecrusher

2
Benim sorunum element.setAttribute("value", "")kullanıyordu jQuery kullanmıyorsanız element.value = "", dosya öğesini gerçekten düzgün bir şekilde temizlemek için kullanmanız gerekir.
Phil

1

Dosya başarıyla yüklendikten sonra yapmak istediğinizi yapın. Dosya işlemeniz tamamlandıktan hemen sonra dosya kontrolünün değerini boş dizeye ayarlayın. Böylece .change (), dosya adı değişse de değişse de her zaman çağrılacaktır. Mesela bu şeyi yapabilirsin ve benim için cazibe gibi çalıştı

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

1

Vue kullanıcıları için çözüm, aynı dosyayı birden çok kez yüklediğinizde sorunu çözüyor ve @change olayı tetiklemiyor:

 <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

<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 = ''
}

0

es6 kullanarak vanilya js

document.querySelector('input[name="file"]').addEventListener('change', (e) => {
 const file = e.target.files[0];
  // todo: use file pointer
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.