Tüm kredinin borçlu olduğu kesinlikle parlak @claviska çözümüne dayanmaktadır.
Doğrulama ve yardım metni içeren tam özellikli Bootstrap 4 dosya girişi.
Giriş grubu örneğine dayanarak , dosya adını görüntülemek için kullanılan onchange
, etiket düğmesinin arkasında gizlenmiş gerçek giriş dosyası alanındaki olaydan doldurulan bir sahte giriş metin alanına sahibiz . Bootstrap 4 doğrulama desteğinin yanı sıra , dosya iletişim kutusunu açmak için girişin herhangi bir yerine tıklamayı da mümkün kıldık.
Dosya girişinin üç durumu
Üç olası durum doğrulanmamış, geçerli ve geçersiz kukla html giriş etiketi öznitelik required
seti ile geçersizdir .
Giriş için HTML işaretlemesi
Biz sadece 2 özel sınıflarını tanıtmak input-file-dummy
ve input-file-btn
düzgün stiline ve istenilen davranışı tel. Diğer her şey standart Bootstrap 4 işaretlemesidir.
<div class="input-group">
<input type="text" class="form-control input-file-dummy" placeholder="Choose file" aria-describedby="fileHelp" required>
<div class="valid-feedback order-last">File is valid</div>
<div class="invalid-feedback order-last">File is required</div>
<label class="input-group-append mb-0">
<span class="btn btn-primary input-file-btn">
Browse… <input type="file" hidden>
</span>
</label>
</div>
<small id="fileHelp" class="form-text text-muted">Choose any file you like</small>
JavaScript davranışsal hükümleri
Kullanıcının yalnızca açık dosya iletişim kutusu aracılığıyla değiştirilebilecek girişi değiştirmesini önlemek için orijinal örneğe göre sahte girişin salt okunur olması gerekir. Maalesef readonly
alanlarda doğrulama yapılmadığından , odak ve bulanıklaştırma ( jquery olayları onfocusin
ve onfocusout
) girişinin düzenlenebilirliğini değiştiririz ve bir dosya seçildikten sonra tekrar doğrulanabilir olmasını sağlarız.
Metin alanını tıklanabilir hale getirmenin yanı sıra, düğmenin tıklama etkinliğini tetikleyerek, kukla alanı doldurma işlevinin geri kalanı @claviska tarafından tasarlandı.
$(function () {
$('.input-file-dummy').each(function () {
$($(this).parent().find('.input-file-btn input')).on('change', {dummy: this}, function(ev) {
$(ev.data.dummy)
.val($(this).val().replace(/\\/g, '/').replace(/.*\//, ''))
.trigger('focusout');
});
$(this).on('focusin', function () {
$(this).attr('readonly', '');
}).on('focusout', function () {
$(this).removeAttr('readonly');
}).on('click', function () {
$(this).parent().find('.input-file-btn').click();
});
});
});
Özel stil ayarları
En önemlisi, readonly
alanın gri arkaplan ve beyaz arasında atlamasını istemiyoruz, böylece beyaz kalmasını sağlıyoruz. Span düğmesinin işaretçi imleci yok ancak yine de giriş için bir tane eklememiz gerekiyor.
.input-file-dummy, .input-file-btn {
cursor: pointer;
}
.input-file-dummy[readonly] {
background-color: white;
}
Njoy!