2010-10-13 12 views
18

क्या यह मैन्युअल रूप से किए बिना, कुंजीपटल पर दर्ज किया गया चरित्र बदलना संभव है?क्या मैं सशर्त रूप से कुंजीपटल पर इनपुट में दर्ज चरित्र को बदल सकता हूं?

उदाहरण के लिए, अगर मैं बड़े अक्षरों कुछ हालत के आधार पर बाध्य करना चाहते हैं, तो निम्न कार्य के लिए अच्छा होगा:

function onKeypressHandler(e) 
{ 
    if (condition) 
    { 
     e.which -= 32; 
    } 
} 

लेकिन निश्चित है कि काम नहीं करता है की।

नोट: यह नहीं बोर्ड uppercasing भर एक है, लेकिन केवल विशिष्ट वर्ण है। हालत ही महत्वपूर्ण नहीं है, लेकिन uppercasing केवल वर्तमान चरित्र नहीं पूरे इनपुट करने के लिए लागू करना चाहिए -

शायद मैं if (e.which >= 97 && e.which <= 102) या if (Wind.Direction == 'South') या जो कुछ भी कहना चाहता हूँ।


मैं इसे बदलते चरित्र को मैन्युअल रूप से जोड़कर कर सकता हूं, लेकिन यह ऐसा करने का एक बदसूरत और गन्दा तरीका है, और शायद यह धीमा हो सकता है।

function onKeypressHandler(e) 
{ 
    if (condition) 
    { 
     $j(this).val($j(this).val() + String.fromCharCode(e.which - 32)); 
     return false; 
    } 
} 

इस विधि के साथ एक विशिष्ट दोष - सभी इनपुट पाठ का चयन और एक कुंजी में प्रवेश, अगर यह इस में चला जाता है तो यह मौजूदा सामग्री को दूर नहीं करता है, लेकिन सामान्य रूप से सामग्री उपयोगकर्ता हटाया चाहते थे करने के लिए संलग्न कर देता है, तो। (इसे हल करने के लिए किसी भी चयनित पाठ का पता लगाने की जांच करने की आवश्यकता होगी, जो इसे एक भी उलझन में डाल देता है।)

क्या कोई बेहतर समाधान प्रदान कर सकता है?

+0

आप चिपकाने से कैसे निपटता हैं के लिए https://developer.mozilla.org/en/DOM/event.initKeyEvent इस्तेमाल किया, पूर्ववत करें/फिर, खींचकर और छोड़कर या कई पात्रों के अन्य उदाहरण जा रहा है एक ही समय में प्रवेश किया, या यह महत्वपूर्ण नहीं है? –

+0

एंडी, यह यहां बहुत महत्वपूर्ण नहीं है, लेकिन अभी भी संभालने में उपयोगी होगा - मुझे लगता है कि इसे बदले में ईवेंट के भीतर मैन्युअल रूप से स्ट्रिंग को चलाना होगा? –

+1

या * oninput * और * onpropertychange * घटनाएं। मैंने कुछ समय पहले अपने ब्लॉग पर इन्हें रेखांकित किया - http://whattheheadsaid.com/2010/09/effectively-detecting-user-input-in-javascript और मेरे पास कार्यों में इसके लिए लगभग पूरी jQuery प्लगइन है। –

उत्तर

17

निम्नलिखित कार्य करेगा। यह an answer I wrote to another question पर आधारित है। अपनी जरूरतों के अनुरूप transformTypedChar फ़ंक्शन को कस्टमाइज़ करें; मेरा उदाहरण केवल अक्षर ए-जी को कैपिटल करता है।

यदि आपको <input type="text"> की बजाय टेक्स्टरेरा पर इसकी आवश्यकता है तो ध्यान रखें कि आईई < = 8 में लाइन ब्रेक के साथ समस्याएं हैं जो निम्नलिखित कोड ब्रेवटी के लिए संभाल नहीं पाती हैं। तुम एक पाठ क्षेत्र यहाँ के भीतर चयन प्राप्त करने के लिए पार ब्राउज़र समारोह पा सकते हैं: Is there an Internet Explorer approved substitute for selectionStart and selectionEnd?

function transformTypedChar(charStr) { 
    return /[a-g]/.test(charStr) ? charStr.toUpperCase() : charStr; 
} 

document.getElementById("your_input_id").onkeypress = function(evt) { 
    var val = this.value; 
    evt = evt || window.event; 

    // Ensure we only handle printable keys, excluding enter and space 
    var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode; 
    if (charCode && charCode > 32) { 
     var keyChar = String.fromCharCode(charCode); 

     // Transform typed character 
     var mappedChar = transformTypedChar(keyChar); 

     var start, end; 
     if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") { 
      // Non-IE browsers and IE 9 
      start = this.selectionStart; 
      end = this.selectionEnd; 
      this.value = val.slice(0, start) + mappedChar + val.slice(end); 

      // Move the caret 
      this.selectionStart = this.selectionEnd = start + 1; 
     } else if (document.selection && document.selection.createRange) { 
      // For IE up to version 8 
      var selectionRange = document.selection.createRange(); 
      var textInputRange = this.createTextRange(); 
      var precedingRange = this.createTextRange(); 
      var bookmark = selectionRange.getBookmark(); 
      textInputRange.moveToBookmark(bookmark); 
      precedingRange.setEndPoint("EndToStart", textInputRange); 
      start = precedingRange.text.length; 
      end = start + selectionRange.text.length; 

      this.value = val.slice(0, start) + mappedChar + val.slice(end); 
      start++; 

      // Move the caret 
      textInputRange = this.createTextRange(); 
      textInputRange.collapse(true); 
      textInputRange.move("character", start - (this.value.slice(0, start).split("\r\n").length - 1)); 
      textInputRange.select(); 
     } 

     return false; 
    } 
}; 
+0

धन्यवाद टिम, ऐसा लगता है कि यह अभी भी मिली नई टेक्स्ट चयन समस्या को संभालने वाला है। इसे आज़माएं और देखें कि यह कैसे करता है। –

+0

ठीक है। मैंने बस textareas के साथ इसका उपयोग करने के बारे में एक नोट जोड़ा। –

+1

+1 अच्छा जवाब बहुत चालाक –

-1

क्या आप सीएसएस का उपयोग कर सकते हैं?

<input type="text" style="text-transform: uppercase;" /> 
+2

यह वास्तविक इनपुट मान नहीं बदलता है, और अधिक महत्वपूर्ण रूप से सशर्त रूप से लागू नहीं होता है। –

+1

क्या आप सबमिट किए गए मान को संसाधित करते समय अपरकेस पर कर सकते हैं? सशर्त रूप से आपका क्या मतलब है? –

+0

मैंने स्पष्ट करने के लिए प्रश्न को अद्यतन किया है - मैं केवल वर्तमान वर्ण को अपरकेस करना चाहता हूं, न कि संपूर्ण स्ट्रिंग - और अगर मैं इसे अपरकेस करता हूं तो यह किसी शर्त पर निर्भर करता है (सटीक जांच प्रश्न के लिए महत्वपूर्ण नहीं है)। –

0

वास्तव में यह सुनिश्चित नहीं है कि आप क्या चाहते हैं लेकिन यह काम करेगा?

$('#my_element').keyup(function(){ $(this).val().toUpperCase(); }); 

या उप स्ट्रिंग का उपयोग अंतिम वर्ण प्राप्त करने के लिए दबाया जाता है और उस पर toUpperCase() करते हैं?

(psst ... आप keydown या keypress भी उपयोग कर सकते हैं)।

+0

फिर, यह सशर्त नहीं है, और ToUpperCase वास्तव में String.fromCharCode() विधि पर कोई सुधार नहीं है। –

+0

सशर्त से आपका क्या मतलब है? –

+0

मैंने स्पष्ट करने के लिए प्रश्न को अद्यतन किया है - मैं केवल वर्तमान चरित्र को अपरकेस करना चाहता हूं, न कि संपूर्ण स्ट्रिंग - और अगर मैं इसे अपरकेस करता हूं तो यह किसी शर्त पर निर्भर करता है (सटीक जांच प्रश्न के लिए महत्वपूर्ण नहीं है)। –

-1

पीटर,

आप यहाँ कुछ प्रेरणा मिल सकती है:

http://www.maconstateit.net/tutorials/JSDHTML/JSDHTML15/jsdhtml15-05.htm

मूल रूप से विभिन्न तरीकों कुंजी दबाने की घटनाओं और है कि 'क्षेत्र' के आसपास कार्यों को देखने के लिए चारों ओर चलता है।

1

डिफ़ॉल्ट कार्रवाई को रोकने और फिर कुंजीपटल ट्रिगर करने के बारे में कैसे? कुछ,

function onKeypressHandler(e) 
{ 
    if (condition) 
    { 
     e.preventDefault(); 
     // create new event object (you may clone current e) 
     var ne = new jQuery.Event("keypress"); 
     ne.which = e.which - 32; 
     $(e.target).trigger(ne); // you may have to invoke with setTimeout 
    } 
} 
+0

काम नहीं करेगा। आप ब्राउज़र में एक कीप्रेस के प्रभावों का अनुकरण नहीं कर सकते हैं। –

+0

दोह! यह तब तक आशाजनक प्रतीत होता था जब तक कि मैंने टिम की टिप्पणी नहीं देखी। वैसे भी अच्छा विचार है। :( –

+0

@Tim, जानकारी के लिए धन्यवाद। बीटीडब्ल्यू, jquery दस्तावेज़ों से उदाहरण घटना को ट्रिगर करने के लिए .keypress() का उपयोग करता है। तो इस तरह के मामले में क्या होता है - क्या केवल ईवेंट हैंडलर को चरित्र प्राप्त करने के लिए w/o नियंत्रण प्राप्त होता है? – VinayC

1

आप इस देखने के लिए .. मैं यह काम करने के लिए प्राप्त करने के बाद अपने आप के साथ बहुत खुश था मिल गया है ..

आप स्पष्ट रूप से यहां एक लूप में जाने से बचने के लिए पर्याप्त मानदंड शामिल करना चाहते हैं।

स्थिति नीचे वास्तविक होने पर गलत कोड लौटाता है, लेकिन यह एक ही घटना को एक अलग चारकोड के साथ निकाल देता है जो झूठी वापसी नहीं करेगा।

document.getElementById("input1").onkeypress = Handler; 
function Handler(e) 
{ 
    e = e || window.event; 
    if (e.charCode == 97) 
    { 
     var evt = document.createEvent("KeyboardEvent"); 
     evt.initKeyEvent("keypress",true, true, window, false, false,false, false, 0, e.charCode -32); 
     this.dispatchEvent(evt); 
     return false; 
    } 
    return true; 
} 

आप IE में fireEvent इस्तेमाल कर सकते हैं ... मैं http://help.dottoro.com/ljrinokx.php और संदर्भ

+0

दिलचस्प है। यह केवल मोज़िला में काम करता है, हालांकि। सौभाग्य से इसका दायरा सीमित लगता है: कीबोर्ड शॉर्टकट जैसे कि Ctrl-B (बुकमार्क के लिए) को ट्रिगर करने का प्रयास कर रहा है, Ctrl-A (सभी का चयन करें) काम नहीं करता है। मुझे पता नहीं था कि आप यह बहुत कुछ कर सकते हैं। –

+0

बिल्कुल नहीं .. आईई भी फायरिंग घटनाओं का समर्थन करता है .. प्रेषण के बजाय, आप fireEvent का उपयोग करते हैं और ईवेंट बनाने के लिए, आप object.createEventObject का उपयोग करते हैं। Http://help.dottoro.com/ljhlvomw.php देखें। मैं लिनक्स पर हूं इसलिए कोड/परीक्षण के साथ आपकी मदद नहीं कर सकता। लेकिन ऐसा लगता है कि –

+0

ऐसा लगता है कि क्रॉसब्रोसर माउस इवेंट हैंडलिंग के लिए कोड पहले से ही उस लिंक में प्रदान किया गया है। –

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