Aynı dosya seçildiğinde tetiklenmeyen HTML giriş dosyası seçim etkinliği


205

Kullanıcının inputtür fileöğesinin HTML'si için yaptığı her dosya seçimini algılama şansı var mı ?

Bu daha önce birçok kez sorulmuştur, ancak onchangekullanıcı aynı dosyayı tekrar seçerse genellikle önerilen olay tetiklenmez.


7
Bu durumda, kullanıcı İptal düğmesine basarsa kodunuzun da açılması gerekir mi? Biri İptal'e basmanın hiçbir şey yapmamasını bekler ve bence çoğu kullanıcı aynı dosyayı yeniden seçmenin İptal ile aynı etkiye sahip olmasını bekler. Bunun mümkün olup olmadığını bilmiyorum ama yine de bu tasarımı tekrar gözden geçirmenizi öneririm.
KRyan

1
İptal edildiğinde ateşlenmemeli veya başka türlü tespit edilebilir olmalıdır. Bir UI ceveat'ı kaldırmak daha doğrudur: Dosya seçildikten sonra bazı eylemler çağrılırsa, kullanıcı genellikle dosyayı tekrar seçerse eylemin tekrarlanmasını bekler.
dronus

Belki de inputs ile değerini '' ile bir şey yaptıktan sonra '' olarak ayarlarsak bu davranışa sahip olabiliriz . Ancak bu görünür dosya adını da kaldıracaktır. Ancak, dosya gerçekten işlendiğinden ve bu eylemin sonucu başka bir yerde görünebileceğinden bu sorun olmayabilir.
dronus

Plz Que açıklamak Ne yapmak istiyorsun?
Şampiyon

1
Tek istediğim, masaüstü uygulamalarının sahip olduğu eski okul davranışlarını simüle etmektir. Aynı dosyayı bir masaüstü uygulamasında tekrar 'açarsam', genellikle yeniden yüklenir veya dosya ile bazı işlemler yapılırsa (örneğin başka bir formatta dönüştürmek gibi) bu eylem tekrar yapılır. Masaüstü kullanıcılarının bir web uygulamasından da bekleyebilecekleri budur, ancak fileinput onchangeetkinliği benzer değildir.
dronus

Yanıtlar:


279

Değerini ayarlayın inputiçin nullher biri üzerinde onclickolay. Bu, inputdeğerini sıfırlar ve onchangeaynı yol seçilse bile olayı tetikler .

input.onclick = function () {
    this.value = null;
};

input.onchange = function () {
    alert(this.value);
};​

İşte bir DEMO .

Not: Dosyanıza 'C: \ fakepath \' ön eki konulması normaldir. Bu, JavaScript'in dosyanın mutlak yolunu bilmesini engelleyen bir güvenlik özelliğidir. Tarayıcı hala dahili olarak biliyor.


1
Demoyu denedim, ancak (Chrome 21'i kullanarak) `` C: \ fakepath` + sonra seçtiğim dosya adını (yol hariç) almaya devam ediyorum. Uyarı aynı dosyanın her seçiminde gösterilir.
Jasper de Vries

1
@JasperdeVries Bu, JavaScript'in bir dosyanın mutlak yolunu bilmesini engelleyen bir güvenlik özelliğidir. Tarayıcı yolu hala dahili olarak biliyor.
Brian Ustas

1
Bir kenara, <input type = "file"> için izin verilen tek değer null. Yani, tanımsız olarak ayarlamaya ve bir istisna almaya çalışıyorsanız, bunun nedeni budur.
Noel Abrahams

5
Küçük bir değişiklik yapmazsanız IE11'de iyi çalışmaz: demo .

21
this.value = nullSonuna koymak daha iyidir , onchangeçünkü bir giriş öğesini üzerine tıklamadan etkinleştirmek mümkündür (klavyeyi kullanarak). Daha input.filessonra başvurmanız gerekirse saklayabilirsiniz .
Halcyon

24
<form enctype='multipart/form-data'>
    <input onchange="alert(this.value); this.value=null; return false;" type='file'>
    <br>
    <input type='submit' value='Upload'>
</form>

this.value=null; yalnızca Chrome için gereklidir, Firefox yalnızca return false;

İşte bir FIDDLE


2
basit ve etkili sadece son IE ve krom test ve bir cazibe gibi çalışır. Paylaştığınız için teşekkürler
Atul Chaudhary

8

Bu makalede, "Seçmek için form girişini kullanma" başlığı altında

http://www.html5rocks.com/en/tutorials/file/dndfiles/

<input type="file" id="files" name="files[]" multiple />

<script>
function handleFileSelect(evt) {

    var files = evt.target.files; // FileList object

    // files is a FileList of File objects. List some properties.
    var output = [];
    for (var i = 0, f; f = files[i]; i++) {
     // Code to execute for every file selected
    }
    // Code to execute after that

}

document.getElementById('files').addEventListener('change', 
                                                  handleFileSelect, 
                                                  false);
</script>

'Değişiklik' için bir olay dinleyicisi ekler, ancak test ettim ve aynı dosyayı seçseniz bile iptal ederseniz bile tetikler.


Bu durumda "değişim" in potansiyel olarak belirsiz anlamını göz önünde bulundurarak, bunu birden fazla tarayıcıda denediniz mi? Web'de olduğu gibi hangisini denediğinizi belirtmek isteyebilirsiniz, tarayıcılar bunlar hakkında her zaman fikir birliği içinde değildir.
Thor84no

2
Testiniz için hangi ortamı kullanıyorsunuz? Chrome ile ilgili deneyimim, soruda belirttiğim changeolaydı , etkinlik yalnızca dosya adı değişikliklerinde tetiklenecekti.
dronus

7

Kullanıcı alanı her tıkladığında, hedef girdinin değerini temizlemek için onClick olayını kullanın. Bu, onChange olayının aynı dosya için de tetiklenmesini sağlar. Benim için çalıştı :)

onInputClick = (event) => {
    event.target.value = ''
}

<input type="file" onChange={onFileChanged} onClick={onInputClick} />

TypeScript Kullanma

onInputClick = ( event: React.MouseEvent<HTMLInputElement, MouseEvent>) => {
    const element = event.target as HTMLInputElement
    element.value = ''
}

Çözüm için teşekkürler.
Deepak Tekchandani

1

Dosya başarıyla yüklendikten sonra yapmak istediğiniz her şeyi yapın. Sadece dosya işleme işleminizin tamamlanmasından sonra dosya denetiminin değerini boş string olarak ayarlayın. örneğin bu şeyi yapabilir ve benim için cazibe gibi çalışabilirsin

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

1
handleChange({target}) {
    const files = target.files
    target.value = ''
}

1
Hey ngCourse! Yalnızca kod yanıtları sorunu çözebilir, ancak nasıl çözdüklerini açıklarsanız çok daha kullanışlıdır. Topluluk, cevabınızı tam olarak anlamak için hem teori hem de kod gerektirir.
RBT

Bu kod, sorunun nasıl ve neden çözüldüğüne dair bir açıklama da dahil olmak üzere soruyu çözebilir, ancak gönderinizin kalitesini artırmaya yardımcı olabilir ve muhtemelen daha fazla oyla sonuçlanır. Sadece şimdi soran kişi için değil, gelecekte okuyucular için soruyu cevapladığınızı unutmayın. Lütfen açıklama eklemek için yanıtınızı düzenleyin ve hangi sınırlamaların ve varsayımların geçerli olduğunu belirtin. Şu kaynaktan
double-beep

1

Benim için çalışılan 0. girdi endeksinin değerini silmek . Lütfen aşağıdaki kodu deneyin, umarım bu işe yarar (AngularJs).

          scope.onClick = function() {
            input[0].value = "";
                input.click();
            };
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.