इसलिए मुझे क्लिपिंग मास्क का उपयोग करने के बारे में टेमानी आफिफ़ का जवाब पसंद है। सोचो यह बहुत अच्छा है। मैं एक और समाधान (थोड़ा कम सुरुचिपूर्ण) प्रस्तावित करना चाहता था। मैंने इस समस्या का परीक्षण करने के लिए फ़ायरफ़ॉक्स का उपयोग किया, और पाठ क्षेत्र के बाहर क्लिक करने (फ़ोकस खोने) से 1 अंक फिर से प्रकट नहीं होता है या स्ट्रिंग वापस पाठ इनपुट में सामान्य हो जाती है।
मेरा मानना है कि मुद्दा यह है कि सीएसएस रिक्ति सीएसएस विशेषता आपके द्वारा निर्धारित की गई है: letter-spacing: 31px;और इस तथ्य पर कि मेरा मानना है कि यह "ब्लिंकिंग" के लिए लागू होगा जो कि अधिकांश ब्राउज़रों के पास है। Chrome का उपयोग करना, फ़ोकस खोने पर इसे हटाने के लिए लगता है, जबकि फ़ायरफ़ॉक्स फोकस को खोने के बाद भी इसे बरकरार रखता है।
इनपुट को फ़ोकस करने के लिए 1 समाधान मैन्युअल रूप से ब्लर () फ़ंक्शन को कॉल करने के लिए उपयोग करना था। क्रोम में यह काम करता है (सेल्फ-एक्ज़ीक्यूटिंग एनोनिमस फ़ंक्शन का उपयोग करके):
<input type="text" id="number_text" maxlength="6" onkeyup="(function()
{
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
})();"
pattern="\d{6}" value="1234" >
या यहां तक कि जैसे नंबर_टेक्स्ट इनपुट द्वारा परिभाषित एक परिभाषित फ़ंक्शन:
<script>
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){
x.blur()
return false
}
};
</script>
<input ... id='number_text' ... onkeyup="handleMaxInput()" ... >
आपको क्रोम में थोड़ी देरी दिखाई देगी, लेकिन फ़ायरफ़ॉक्स में कॉल करने से समस्या हल नहीं होगी।
हम अनिवार्य रूप से फ़ायरफ़ॉक्स में इसी व्यवहार को बाध्य कर सकते हैं। कुछ खेलने के बाद, मुझे लगा कि क्रोम रिफ्रेश हो रहा है / ब्लर पर अक्षर रिक्ति को फिर से जोड़ रहा है। मेरे खेलने के सत्र से पता चला कि आप फ़ायरफ़ॉक्स को इस मान को प्रोग्रामेटिक रूप से रिकॉल करने के लिए मजबूर कर सकते हैं:
- इनपुट के अक्षर-रिक्ति विशेषता की इनलाइन शैली को एक अलग मान में बदलें (क्योंकि हम क्रमिक रूप से बहुत प्रयास किए बिना क्रम संख्या के एक CSS वर्ग को संपादित नहीं कर सकते हैं, जैसे कि दस्तावेज़ के शैली अनुभाग में संपूर्ण शैली टैग को फिर से लिखना)।
- इनपुट से क्लास नंबर_टेक्स्ट निकालें।
- 1 और 2 विनिमेय हैं, आपको फ़ायरफ़ॉक्स को केवल उस इनलाइन शैली में वापस लाने की आवश्यकता है, जिसे 'मेमोरी में' सहेजे जाने के बिना क्लास की विशेषताओं के बिना सेट किया गया है।
- इनलाइन शैली को हटा दें और नंबर_टेक्स्ट सीएसएस वर्ग को फिर से अप्लाई करें। यह ब्राउजर को लेटर-सेपरेशन को रिकॉल करने के लिए मजबूर करेगा क्योंकि हमें इसकी जरूरत है।
कोड में, यह निम्न जावास्क्रिप्ट फ़ंक्शन की तरह दिखेगा:
handleMaxInput = function(){
var x = document.getElementById('number_text');
let value = x.value
if (value.length >= 6){ // if the input is 6 or more characters
x.classList.remove('number_text') // remove the class
x.style.letterSpacing = '0px' // reset the spacing
setTimeout(function() { // set time to let browser refresh updates
x.classList.add('number_text') // Re-add class after browser refresh
setTimeout(function() { // Remove inline-style after more reculculations
x.style.removeProperty('letter-spacing') // Remove inline style to let class styles apply
x.blur // optional, will force input field to lose focus. Else comment out to avoid that.
}, (1)); // waits 1 millisecond
}, (1)); // waits 1 millisecond
}
}
इसमें क्रोम के साथ फ़ायरफ़ॉक्स में वही झिलमिलाहट होगी, और सब ठीक हो जाएगा।
नोट : टाइमआउट फ़ंक्शन ब्राउज़र को ताज़ा करने के लिए समय देने के लिए हैं, और वास्तव में हमें जो आवश्यक है उसे अपडेट करें।
नोट : आप टेक्स्ट बॉक्स को फ़ोकस बनाने के लिए फ़ंक्शन में .blur () कॉल करना चुन सकते हैं, या इसे छोड़ सकते हैं और वे फिर भी अंकों के साथ त्रुटि के बिना इनपुट फ़ील्ड में रहेंगे।
आशा है कि यह आपकी वैचारिक समझ के साथ-साथ समस्या को हल करने में मदद करता है। कुछ अन्य व्यक्तियों ने अच्छे समाधान दिए जो पूरी झिलमिलाहट से बचते हैं, और फ़ायरफ़ॉक्स और क्रोम दोनों में काम करते हैं!