2010-08-11 3 views
5

मैं केवल नई दबाए गए कुंजी के बिना मूल्य पुनर्प्राप्त कर सकता हूं। कीप इवेंट का उपयोग करना एक विकल्प नहीं है, क्योंकि अगर उपयोगकर्ता कुंजी जारी नहीं करता है तो यह आग नहीं होता है। यह महत्वपूर्ण है क्योंकि मैं हर एक कीप्रेस पर कार्य करना चाहता हूं।मैं jQuery के माध्यम से एक कीप्रेस ईवेंट के दौरान HTML टेक्स्ट इनपुट का नया मान कैसे प्राप्त कर सकता हूं?

घटना के तर्कों से पहुंचने योग्य कुंजीकोड के साथ पुराने मान को जोड़ना स्वीकार्य नहीं है, क्योंकि यह गारंटी नहीं है कि उपयोगकर्ता टेक्स्टबॉक्स में स्ट्रिंग के अंत तक टाइप करेगा।

+0

इनपुट फ़ील्ड में परिवर्तन ईवेंट का उपयोग करने के बारे में क्या? – Adam

+1

परिवर्तन ईवेंट केवल तभी होता है जब इनपुट फ़ील्ड फोकस खो देता है, इसलिए यह काम नहीं करेगा .. – darma

+0

Bacon.js के साथ काम करने के बाद, मैं पूरी तरह से इसे – jcollum

उत्तर

2

कुंजीपटल के बाद मूल्य क्या होगा यह काम करना संभव है। यह गैर IE ब्राउज़र और IE में जटिल काम में आसान है, लेकिन निम्नलिखित यह करना होगा:

document.getElementById("your_input").onkeypress = function(evt) { 
    var val = this.value; 
    evt = evt || window.event; 
    var charCode = typeof evt.which == "number" ? evt.which : evt.keyCode; 
    if (charCode) { 
     var keyChar = String.fromCharCode(charCode); 
     var start, end; 
     if (typeof this.selectionStart == "number" && typeof this.selectionEnd == "number") { 
      start = this.selectionStart; 
      end = this.selectionEnd; 
     } 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; 
     } 
     var newValue = val.slice(0, start) + keyChar + val.slice(end); 
     alert(newValue); 
    } 
}; 
+0

कहून, क्या इससे आपकी मदद मिलती है? –

+0

धन्यवाद, यह जो मैं प्राप्त करना चाहता था उसके सबसे नज़दीक है। हालांकि एक प्रमुख मुद्दा: यह अभी भी इनपुट में मनमाने ढंग से डेटा की प्रतिलिपि बनाने और चिपकाने से बचा नहीं है। – kahoon

+0

ठीक है। आपने इस सवाल में उल्लेख नहीं किया था। अधिकांश ब्राउज़रों में आप इसे सरल 'document.getElementById ("your_input") से रोक सकते हैं।onpaste = function() {झूठी वापसी; }; '। फ़ायरफ़ॉक्स 2 और मुझे लगता है कि ओपेरा के सभी संस्करण पेस्ट इवेंट का समर्थन नहीं करते हैं। –

6

setTimeout(function() { ... }, 0) में अपना हैंडलर कोड लपेटें।

यह value अद्यतन होने के बाद, अगले संदेश लूप में कोड निष्पादित करेगा।

+0

+1 से निपटने के लिए पूरी तरह से निपटूंगा, यह काम करता है: http: // jsfiddle .NET/3tRMx/ – Ender

+0

लेकिन फिर मैं घटना को रोकने का अवसर खो दूंगा। हालांकि अगर मैं इसे जेफ टी के सुझाव के साथ जोड़ता हूं, तो मुझे इनपुट के मान को पिछले स्थिति में रोलबैक कर सकता है यदि मुझे यह अमान्य लगता है। हालांकि मैं अभी भी अन्य विचारों के लिए खुला हूं। – kahoon

+0

यदि आप पिछले स्थिति में रोलबैक करने में सक्षम होना चाहते हैं, तो आप सेटटाइमआउट दर्ज करने से पहले मान को सहेज सकते हैं, और यदि आपको रोलबैक की आवश्यकता दिखाई देती है तो उसे वापस देखें। यहां अपडेट किया गया jsFiddle: http://jsfiddle.net/3tRMx/1/ काम पर रोलबैक देखने के लिए 'xx' दर्ज करने का प्रयास करें। – Ender

1

यहां एक ऐसा विचार है जो काम कर सकता है। कीप्रेस का प्रयोग करें और उस बिंदु पर वैल को स्टोर करें ताकि आप हमेशा मौजूदा मान की तुलना अंतिम मूल्य से कर सकें और तारों में अंतर पा सकें। अंतर दबाया जाएगा कि कुंजी दबाया जाएगा।

एक तरह से यह करने के लिए विन्यास में तार कर देते हैं और 2 सरणियों तुलना करने के लिए किया जाएगा जैसे वे यहाँ कर रहे हैं: JavaScript array difference

कभी इस तरह कुछ भी करने की कोशिश की तो यह व्यवहार्य नहीं हो सकता है लेकिन एक शॉट के लायक हो सकता है ।

0

मैं टैब कुंजी है, जो KeyUp में e.target में परिवर्तन के साथ एक विशेष मामले के लिए किया था, ताकि समाधान है - करने के लिए बाँध कंटेनर तत्व, कुंजीडाउन हैंडलर में लक्ष्य इनपुट पकड़ो, keyUp की सदस्यता लें और मान पढ़ें।

$("#container").keydown(function (e) { 
    //here you decide whether to handle the key event, and grab the control that sent the event 
    var myInput = e.target; 
    $("#container").one('keyup', function() { 
     console.log(myInput.val()); 
     // do smth here 
    }); 
}); 
संबंधित मुद्दे

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