2009-06-17 19 views
8

क्या किसी के पास एक गतिशील जावास्क्रिप्ट इनपुट फ़िल्टर है जो एकाधिक ब्राउज़रों में टेक्स्ट इनपुट को सीमित करता है?जावास्क्रिप्ट कुंजी बोर्ड इनपुट फ़िल्टरिंग

मैंने कई उदाहरण ऑनलाइन देखे हैं, लेकिन उनमें से अधिकतर त्रुटियों या बहुप्रवाह समर्थन का अभाव है।

मेरा वर्तमान प्रयास नीचे पोस्ट किया गया है, लेकिन यह फ़ायरफ़ॉक्स के तहत स्थानांतरित संख्याओं में विफल रहा है, और मैंने अभी तक अन्य ब्राउज़रों का प्रयास नहीं किया है।

http://www.quirksmode.org/js/keys.html दिखाता है, यह एक आसान समस्या नहीं है।

क्या किसी के पास बेहतर समाधान है?

var numb = /[0-9]/; 
var lwr = /[a-z]/; 
var upr = /[A-Z]/; 
var alpha = /a-zA-Z]/; //not checked 
var alphaNum = /a-zA-Z0-9/; //not checked 

function onKeyPressAcceptValues(e, reg){ 
    var key = window.event ? e.keyCode : e.which; 
    //permit backspace, tab, delete, arrow buttons, (key == 0 for arrow keys) 

    alert(key); 
    if(key == 8 || key == 9 || key == 46 ||(key>32 && key <41 ||key == 0)){ 
     return true; 
    } 
    var keychar = String.fromCharCode(key); 
    return reg.test(keychar); 
} 

function isNumberKey(parm) {return onKeyPressAcceptValues(parm,numb);} 
function isLowerKey(parm) {return onKeyPressAcceptValues(parm,lwr);} 
function isUpperKey(parm) {return onKeyPressAcceptValues(parm,upr);} 
function isAlphaKey(parm) {return onKeyPressAcceptValues(parm,alpha);} 
function isAlphanumKey(parm) {return onKeyPressAcceptValues(parm,alphaNum);} 

यह

के माध्यम से इस्तेमाल किया जाएगा

<input type="text" name="pw[first_name]" size="15" maxlength="15" onkeypress="return isAlphaKey(event)">

+0

मुझे यह भी जिक्र करना चाहिए कि यह असंगत रूप से अन्य कुंजियों को स्थानांतरित करने की अनुमति देता है, जैसे स्थानांतरित संख्या कुंजी। हमें शायद सुधार के बजाय प्रतिस्थापन की आवश्यकता है। – lief79

उत्तर

2

फँसाने कीबोर्ड की घटनाओं चाल वैसे भी काम नहीं चलेगा क्योंकि उपयोगकर्ता हमेशा संपादित उपयोग कर सकते हैं | पेस्ट करें। यहां तक ​​कि यदि आप इसे संभालने के लिए क्रॉस-ब्राउज़र समाधान के साथ आते हैं, तो उपयोगकर्ता हमेशा जावास्क्रिप्ट को अक्षम करके सबकुछ बाईपास कर सकता है।

दूसरे शब्दों में, अपना समय बर्बाद न करें। जब उपयोगकर्ता अमान्य डेटा जमा करने का प्रयास करते हैं तो बस उपयोगकर्ता को एक त्रुटि दें।

+0

एक त्वरित स्थानीय प्रतिक्रिया होने और कुछ ओवरहेड दूर जाने में मूल्य हो सकता है, लेकिन रीजिक्स के माध्यम से पूरा फ़ील्ड की जांच करने वाली सैनिटी एक आसान दृष्टिकोण है। इस एप्लिकेशन के लिए, मुझे जावास्क्रिप्ट फ़ंक्शन के साथ-साथ सर्वर-साइड के लिए डेटा जांच की आवश्यकता थी। दुर्भाग्यवश, इसका अर्थ डुप्लिकेट चेक है। यह AJAX के माध्यम से किया जा सकता था, और अंतिम पोस्ट में सैनिटी जांच के रूप में एक ही कॉल का इस्तेमाल किया। यह अब सबसे अच्छा दृष्टिकोण प्रतीत होता है। – lief79

+0

मैं क्लाइंट-साइड पर एक सैनिटी चेक रखने के मान को समझता हूं, लेकिन इसका मतलब यह नहीं है कि आपको इसे प्रत्येक कीस्ट्रोक पर करने की आवश्यकता है। जब वे फॉर्म जमा करते हैं, तो अपना सत्यापन करें और अगर आपको कोई त्रुटि मिलती है तो सबमिशन जारी न करें। पीड़ारहित! –

-1

यहाँ एक तरीका है यह करने के लिए:

  • एक "छद्म क्षेत्र" बनाएं - यह वह जगह है जब क्लिक किया, जहां इनपुट उपयोगकर्ता
  • के लिए दिखाई देगा, एक छिपी हुई फ़ील्ड को फ़ोकस सेट
  • छिपा क्षेत्र में क्या टाइप किया जा रहा है पर
  • देखो उपयोगकर्ता प्रकार है और छद्म क्षेत्र के लिए मान्य वर्ण कॉपी

उपयोगकर्ता सोचता है कि वे मैदान में टाइप कर रहे हैं, लेकिन वे नहीं हैं।

+0

दिलचस्प, क्या आप इस दृष्टिकोण के किसी भी सार्वजनिक नमूने के बारे में जानते हैं? – lief79

2

इनपुट कार्य के बाद अमान्य मूल्यों की जांच और निकालना होगा?

चारकोड और कीकोड की जांच करना ब्राउज़र में काफी कठिन हो सकता है क्यों वास्तव में टेक्स्ट फ़ील्ड में जोड़ा गया मान जांचें?

अपने नियमित अभिव्यक्तियों को बदलें और वे नहीं चाहते हैं। एक बार जब आप अपने इनपुट बॉक्स में डाले गए डेटा को प्रतिस्थापित करने के लिए बस अपनी उलटा नियमित अभिव्यक्ति का उपयोग करें जो आप नहीं चाहते हैं।

http://jsbin.com/ulibu पर बनाया गया एक त्वरित उदाहरण एक टेक्स्ट बॉक्स है जो केवल पूर्णांक स्वीकार करता है। यह एक छोटा सा जावास्क्रिप्ट ब्लॉक जो क्षेत्र से गैर अंक स्ट्रिप्स है:

function checktext(e) { 
    //Remove digits 
    //Yes, the global search/replace is important. If we don't use a global 
    //replace ctrl+v will remove only the first invalid character instead of 
    //them. 
    e.value = e.value.replace(/[^\d]/g , ''); 
} 

और इनपुट बॉक्स एक KeyUp घटना के साथ घोषित किया जाता है कुछ भी टाइप किया पकड़ने के लिए:

<input type="text" id="text" onkeyup="checktext(this);"/> 

यह निश्चित नहीं है उत्तम।जिन चीजों को आपको अभी भी करने की आवश्यकता होगी:

  1. सर्वर पक्ष मान्य करें। ग्राहक पक्ष सत्यापन आपके सभी उपयोगकर्ताओं की गलतियों को कभी नहीं पकड़ पाएगा। वैसे भी हमेशा सर्वर पक्ष को मान्य करें।
  2. चेक को सही करें। यह एक साधारण regexp है, कुछ अधिक जटिल हो सकता है
  3. पेस्ट घटनाओं को पकड़ें ताकि माउस पेस्ट ईवेंट उसी तरीके से परिवर्तित हो जाएं।
  4. उपयोगकर्ता को कुछ चेतावनी प्रदर्शित करें कि यदि आपको टेक्स्ट को हटाना है तो "केवल X की अनुमति है"। अन्यथा वे सोच सकते हैं कि "ब्राउज़र मजेदार काम कर रहा है"।
संबंधित मुद्दे