बिल्कुल शानदार @claviska समाधान के आधार पर, जिनके लिए सभी क्रेडिट बकाया है।
सत्यापन और सहायता पाठ के साथ पूर्ण विशेषताओं वाले बूटस्ट्रैप 4 फ़ाइल इनपुट।
इनपुट समूह उदाहरण के आधार पर हमारे पास उपयोगकर्ता के लिए फ़ाइल नाम प्रदर्शित करने के लिए उपयोग किया जाने वाला एक डमी इनपुट टेक्स्ट फ़ील्ड है, जो onchange
लेबल बटन के पीछे छिपे वास्तविक इनपुट फ़ाइल फ़ील्ड पर ईवेंट से पॉपुलेट हो जाता है । इसके अलावा बूटस्ट्रैप 4 सत्यापन शामिल है समर्थन हमने फ़ाइल संवाद को खोलने के लिए इनपुट पर कहीं भी क्लिक करना संभव बना दिया है।
फ़ाइल इनपुट के तीन राज्य
डमी HTML इनपुट टैग विशेषता required
सेट के साथ तीन संभव राज्य अन-मान्य, वैध और अमान्य हैं ।
इनपुट के लिए एचटीएमएल मार्कअप
हम केवल 2 कस्टम वर्गों परिचय input-file-dummy
और input-file-btn
ठीक से शैली के लिए और वांछित व्यवहार तार। बाकी सब कुछ मानक बूटस्ट्रैप 4 मार्कअप है।
<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>
जावास्क्रिप्ट व्यवहार प्रावधान
डमी इनपुट को केवल मूल उदाहरण के अनुसार पढ़ा जाना चाहिए, ताकि उपयोगकर्ता को इनपुट को बदलने से रोका जा सके जो केवल खुले फ़ाइल संवाद के माध्यम से बदला जा सकता है। दुर्भाग्य से सत्यापन readonly
खेतों पर नहीं होता है, इसलिए हम फ़ोकस और ब्लर ( jquery ईवेंट onfocusin
और) पर इनपुट की editability को टॉगल करते हैंonfocusout
) और सुनिश्चित करें कि यह फिर से एक बार एक फ़ाइल का चयन किया जाता validatable हो जाता है।
टेक्स्ट फ़ील्ड को क्लिक करने योग्य बनाने के अलावा, बटन के क्लिक इवेंट को ट्रिगर करके, डमी फ़ील्ड को पॉप्युलेट करने की बाकी कार्यक्षमता @claviska द्वारा परिकल्पित की गई थी।
$(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();
});
});
});
कस्टम शैली tweaks
सबसे महत्वपूर्ण बात यह है कि हम नहीं चाहते हैं कि readonly
मैदान ग्रे बैकग्राउंड और सफेद के बीच कूद जाए ताकि हम यह सुनिश्चित कर सकें कि यह सफेद ही रहे। स्पैन बटन में एक पॉइंटर कर्सर नहीं होता है, लेकिन हमें इनपुट के लिए एक जोड़ना होगा।
.input-file-dummy, .input-file-btn {
cursor: pointer;
}
.input-file-dummy[readonly] {
background-color: white;
}
एन ज्वॉय!