2013-07-04 6 views
5

के लिए एक ही कीडाउन ईवेंट लौटा रहा है, मैं फोन सत्यापन पर काम कर रहा हूं और फोन नंबर के साथ इनपुट को ऑटो स्वरूपण की आवश्यकता है और केवल संख्यात्मक वर्णों को जोड़ने की अनुमति है। हालांकि जब मैं कीडाउन और कीप्रेस का उपयोग करके इनपुट को प्रतिबंधित करने का प्रयास करता हूं, तो आईफोन मुझे # और * दर्ज करने की इजाजत देता है। जब मैंने कीडाउन वैल्यू की जांच की, तो वे क्रमश: 3 और 8 के साथ समान हैं (कीकोड 51 और 56)। यह एंड्रॉइड ब्राउज़र में पूरी तरह से काम करता है लेकिन आईफोन में विफल रहता है।आईफोन (हैश और 3) और (एस्टेरिस्क और 8)

किसी को भी इसी तरह के मुद्दे का सामना करना पड़ा।

$(formSelector + ' input[name^="phone"]').on('keydown keypress',function (e) {   
    // Allow: backspace, delete, tab, escape, and enter 
    if (e.keyCode == 46 || e.keyCode == 8 || e.keyCode == 9 || e.keyCode == 27 || e.keyCode == 13 || 
     // Allow: Ctrl+A 
     (e.keyCode == 65 && e.ctrlKey === true) || 
     // Allow: home, end, left, right 
     (e.keyCode >= 35 && e.keyCode <= 39) 
    ) {     
     // let it happen, don't do anything 
     return; 
    } else { 
     // Ensure that it is a number and stop the keypress 
     if (e.shiftKey || (e.keyCode < 48 || e.keyCode > 57) && (e.keyCode < 96 || e.keyCode > 105)) { 
      e.preventDefault(); 
     }    

}); 

मैं भी एक अन्य तरीका है जिसके stackoverflow में सुझाव दिया गया था 'इनपुट propertychange' की घटनाओं के साथ इनपुट बाध्य करने के लिए और फिर पैटर्न मिलान का उपयोग करने की कोशिश की। लेकिन यह आईफोन में सही काम करता है, लेकिन एंड्रॉइड में विफल रहता है।

$(formSelector + ' input[name^="phone"]').bind('input propertychange', function() { 
    var text = $(this).val(); 
    if (isNaN(text)) { 
     $(this).val(text.replace(/[^\d]/gi, '')); 
    } 
}); 

क्या किसी के पास इस समस्या का कोई सामान्य समाधान है ??

+1

[jQuery डेमो] (http://api.jquery.com/keydown/) की घटनाओं में कोई अंतर दिखाने करता है का प्रयास करें? – tom

+0

jQUeryDemo एक ही कुंजीकोड दिखाता है। 3 और # समान हैं और 8 और * समान हैं। लेकिन मोबाइल बनाम कंप्यूटर ब्राउज़र में पाया गया एक भिन्नता यह है कि # और * दर्ज करते समय कंप्यूटर में शिफकी सच हो जाती है, लेकिन मोबाइल में यह भी गलत है क्योंकि हम किसी भी शिफ्ट कुंजी का उपयोग नहीं कर रहे हैं – Anooj

+0

क्या अन्य सभी गुण हैं (जैसे 'shiftKey ') भी वही? – tom

उत्तर

5
on('keydown keypress',function (e){}); 

पहले अग्रिम धन्यवाद, iOS पर दो बार से चलाता है (कोई सुराग नहीं क्यों), और bind फ़ायर्फ़ॉक्स पर विफल रहता है, तो बस $().keypress का उपयोग करें।

आपका फ़िल्टरिंग आपके इच्छित नंबरों के लिए सही कीकोड्स के माध्यम से दे रहा था, लेकिन, उन पात्रों को पकड़ नहीं रहा जिन्हें आपको पकड़ने के लिए आवश्यक था, सबसे पहले मुझे एक समाधान चल रहा था जो गलत व्यवहार कुंजी के बाद जाने के लिए e.orginialEvent.keyIdentifier का उपयोग करता था, लेकिन यह नाटकीय रूप से फ़ायरफ़ॉक्स पर विफल रहा।

उस समस्या का समाधान ढूंढने में मैंने इस page about keycodes and charcodes in Firefox से कोड पाया और संशोधित किया।

$(formSelector).keypress(function (e) { 
    var k = e.keyCode || e.charCode; 
    var c = e.charCode; 
    var isArrow = (c == 0 && k >= 37 && k <= 40); 
    var isSpecial = ((k == 8) || (k == 9) || (k == 127)) || isArrow; // backspace, tab, delete 
    var isOK = (k >= 48 && k <= 57) ; // numbers 
    return isOK || isSpecial; 
    }); 

लाइव संस्करण:

Good Version, Tested on: iOS, Chrome, Firefox, Tested

keyIdentifier version, Failed on: Firefox

+1

यह दो बार ट्रिगर करता है क्योंकि एक कुंजी दबाए जाने पर तीनों में से दो घटनाओं को दबाया जाता है (कीडाउन, कीप, कीप्रेस)। – skyline3000

+0

धन्यवाद, यह काम किया। – Anooj

0

आप कर सकता है: <input oninput="filter(this,'1|2|3|4|5|6|7|8|9|0')">
और यह कार्य हो आप में सूची:
function filter(`obj,allowed) { var allowed = split("|");
var c = 0 for(c; c < allowed.length; c++) {
oqj.value=obj.value.replace(allowed[c],"")
}
}

1

<input type="number">

या

<input pattern="[0-9]">

संबंधित मुद्दे