OnKeyPress के दौरान एक इनपुट टेक्स्ट बॉक्स का टेक्स्ट कैसे प्राप्त करें?


85

मैं एक टेक्स्ट बॉक्स में पाठ को उपयोगकर्ता के प्रकारों में लाने की कोशिश कर रहा हूं ( jsfiddle खेल का मैदान ):

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onKeyPress="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

कोड, त्रुटियों के बिना चलाता है सिवाय इसके कि मूल्य की input text, बॉक्स के दौरान onKeyPressहमेशा मूल्य है से पहले परिवर्तन:

यहां छवि विवरण दर्ज करें

प्रश्न : मुझे पाठ बॉक्स का पाठ कैसे मिलता है onKeyPress?

बोनस चटर

HTML DOM में "उपयोगकर्ता टाइप कर रहा है " से संबंधित तीन घटनाएँ हैं :

  • onKeyDown
  • onKeyPress
  • onKeyUp

में विंडोज , के आदेश WM_Keyसंदेशों महत्वपूर्ण हो जाता है जब उपयोगकर्ता एक कुंजी को दबाए रखती है, और कुंजी दोहराने के लिए शुरू होता है:

  • WM_KEYDOWN('a')- उपयोगकर्ता ने Aकुंजी को नीचे धकेल दिया है
  • WM_CHAR('a')- aउपयोगकर्ता से एक चरित्र प्राप्त हुआ है
  • WM_CHAR('a')- aउपयोगकर्ता से एक चरित्र प्राप्त हुआ है
  • WM_CHAR('a')- aउपयोगकर्ता से एक चरित्र प्राप्त हुआ है
  • WM_CHAR('a')- aउपयोगकर्ता से एक चरित्र प्राप्त हुआ है
  • WM_CHAR('a')- aउपयोगकर्ता से एक चरित्र प्राप्त हुआ है
  • WM_KEYUP('a')- उपयोगकर्ता Aकुंजी जारी की है

एक पाठ नियंत्रण में प्रदर्शित होने वाले पांच वर्ण होंगे: aaaaa

महत्वपूर्ण बिंदु यह है कि आप WM_CHARसंदेश का जवाब देते हैं , जो दोहराता है। अन्यथा आप एक कुंजी दबाए जाने पर घटनाओं को याद करते हैं।

में एचटीएमएल बातें थोड़े अलग हैं:

  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyDown
  • onKeyPress
  • onKeyUp

Html एक KeyDownऔर KeyPressहर कुंजी दोहराता है। और KeyUpईवेंट केवल तभी उठाया जाता है जब उपयोगकर्ता कुंजी जारी करता है।

रास्ते ले लो

  • मैं इस पर प्रतिक्रिया दे सकता हूं onKeyDownया कर सकता हूं onKeyPress, लेकिन input.valueअद्यतन किए जाने से पहले दोनों उठाए गए हैं
  • मैं इसका जवाब नहीं दे सकता onKeyUp, क्योंकि यह पाठ-बॉक्स में पाठ के रूप में नहीं होता है।

प्रश्न: मुझे टेक्स्ट-बॉक्स का पाठ कैसे मिलता है onKeyPress?

बोनस पढ़ना


1
मेरा मानना ​​है कि आपको इसे वापस करने से पहले वर्तमान कीपर को वैल्यू में जोड़ना होगा; मान keyUp पर अपडेट हो जाता है, लेकिन डेटा आपको कीडाउन पर उपलब्ध है।
मैथलेटिक्स

कुंजी मेरे लिए काम करती है, आपको इस तरह से कुछ के लिए jQ की आवश्यकता नहीं है, जब तक कि आप ब्लोट को जोड़ना पसंद नहीं करते हैं
रयान बी

यह आपके कार्य के लिए केवल
onKeyUp पर

@ हम केवल संभाल रहे हैं onKeyUp पाठ बॉक्स में होने वाले परिवर्तनों को नहीं दिखाते हैं क्योंकि वे होते हैं।
इयान बॉयड

यदि आप किसी भी कुंजी को पकड़ना चाहते हैं और टेक्स्टबॉक्स में परिणाम प्राप्त करना चाहते हैं, तो इसके लिए आपको onKeyPress और onKeyDown दोनों आयोजनों का उपयोग करना चाहिए जोनाथन एम के बेला , लेकिन आप कुंजियों को दबाए बिना परिणाम प्राप्त करना चाहते हैं तो यह केवल onkeyup पर्याप्त है मेरी बेला
dmytro

जवाबों:


19

inputईवेंट को संभालना एक सुसंगत समाधान है: यह और के लिए समर्थित हैtextareainput सभी समकालीन ब्राउज़रों में तत्वों तत्वों के है और यह ठीक उसी समय फायर करता है जब आपको इसकी आवश्यकता होती है:

function edValueKeyPress() {
    var edValue = document.getElementById("edValue");
    var s = edValue.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: " + s;
}
<input id="edValue" type="text" onInput="edValueKeyPress()"><br>
<span id="lblValue">The text box contains: </span>

मैं इसे थोड़ा फिर से लिखूंगा, हालांकि:

function showCurrentValue(event)
{
    const value = event.target.value;
    document.getElementById("lblValue").innerText = value;
}
<input id="edValue" type="text" onInput="showCurrentValue(event)"><br>
The text box contains: <span id="lblValue"></span>


54

इसे सरल रखें। दोनों का उपयोग करें onKeyPress()और onKeyUp():

<input id="edValue" type="text" onKeyPress="edValueKeyPress()" onKeyUp="edValueKeyPress()">

यह सबसे अद्यतन स्ट्रिंग मूल्य (कुंजी के बाद) प्राप्त करने का ध्यान रखता है और यह भी अद्यतन करता है कि उपयोगकर्ता कुंजी दबाए रखता है या नहीं।

jsfiddle: http://jsfiddle.net/VDd6C/8/


चूँकि arnaud576875 के जवाब को छोड़ना पड़ा और onKeyUp(उपयोग करने के उद्देश्य को धता बताते हुए onKeypress) वापस जाना पड़ा , यह सबसे सरल, सबसे साफ और निकटतम उत्तर है किसी का भी देखना। केवल सबसे सावधानीपूर्वक पर्यवेक्षक उपयोगकर्ता प्रतिक्रिया को नोटिस करेगा जो उन्होंने दर्ज किया है।
इयान बॉयड

@ इयान, मदद करने में खुशी है। "फीडबैक का आपके द्वारा दर्ज किए गए मिलान से मेल नहीं खाता" से आपका क्या अभिप्राय है? क्या समायोजन की आवश्यकता है?
जोनाथन एम।

मुझे याद है कि मैं अब क्या मतलब है! प्रतिक्रिया मैं जा रहा हूँ <input>तत्व लाल, या हरे रंग रंग, या उपयोगकर्ता को कुछ अन्य प्रतिक्रिया दे रही है कि वे टाइप किया है अच्छा या बुरा है। हालांकि आपका स्वीकृत उत्तर अभी भी हमेशा "ऑफ-बाय-वन" चरित्र की समस्या से ग्रस्त है : केवल सबसे अधिक चौकस उपयोगकर्ता यह नोटिस करेगा कि फीडबैक उनके द्वारा दर्ज किए गए से मेल नहीं खाता है। वास्तव में, ऑफ-बाय- वन-एरर केवल की-रिपीट के दौरान होता है (यानी वे चाबी को नीचे रख रहे हैं) कोई नहीं (मेरे अलावा) समस्या को नोटिस करने जा रहा है।
इयान बोयड

19

onKeyPress के दौरान इनपुट टेक्स्ट बॉक्स का मूल्य हमेशा परिवर्तन से पहले मूल्य होता है

यह उद्देश्य पर है: यह ईवेंट श्रोता को कीबोर्ड को रद्द करने की अनुमति देता है।

यदि ईवेंट श्रोता इवेंट को रद्द कर देता है , तो मान अपडेट नहीं किया जाता है। यदि ईवेंट रद्द नहीं किया गया है, तो मान अपडेट किया जाता है, लेकिन ईवेंट श्रोता को कॉल करने के बाद

फ़ील्ड मान अद्यतन किए जाने के बाद मान प्राप्त करने के लिए, अगले ईवेंट लूप पर चलने के लिए फ़ंक्शन शेड्यूल करें। यह करने के लिए हमेशा की तरह कॉल करने के लिए है setTimeoutकी एक समय समाप्ति के साथ 0:

$('#field').keyup(function() {
    var $field = $(this);

    // this is the value before the keypress
    var beforeVal = $field.val();

    setTimeout(function() {

        // this is the value after the keypress
        var afterVal = $field.val();
    }, 0);
});

यहाँ कोशिश करें: http://jsfiddle.net/Q57gY/2/

संपादित करें : कुछ ब्राउज़र (जैसे क्रोम) बैकस्पेस के लिए कीपर घटनाओं को ट्रिगर नहीं करते हैं; कोड में कीप को बदल दिया।


यह पोस्ट करने वाला था। यहाँ jsFiddle मैंने किया है।
१६:०२ पर kaap

आप सही हैं, लगता है कि Chrome बैकस्पेस के लिए कीपर ईवेंट को ट्रिगर नहीं कर रहा है; अद्यतन
अरनौद ले ब्लैंक

@ इयान, क्या ओपी यह चाहता है कि इसे एक कुंजी के रूप में अपडेट किया जाए? यदि यह एक आवश्यकता थी तो बहुत निश्चित नहीं था। हालांकि इस समाधान में वह कार्यक्षमता नहीं है।
जोनाथन एम।

स्पष्ट होने के लिए: बैकस्पेस के लिए कीपर घटनाओं को ट्रिगर करने के लिए मानक के अनुसार नहीं है: "कुंजी जो एक चरित्र मान पैदा करती है" - अन्य कुंजी के लिए "कीडाउन" (परिवर्तन से पहले, रद्द करने योग्य) या "कीप" (परिवर्तन के बाद) का उपयोग करें
sebilasch

5

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

function edValueKeyPress()
{
    document.getElementById("lblValue").innerText =""+document.getElementById("edValue").value;
}

यही सब आप चाहते हैं, और यह तेज है!


3
<asp:TextBox ID="txtMobile" runat="server" CssClass="form-control" style="width:92%;  margin:0px 5px 0px 5px;" onkeypress="javascript:return isNumberKey(event);" MaxLength="12"></asp:TextBox>

<script>
    function isNumberKey(evt) {
        var charCode = (evt.which) ? evt.which : event.keyCode;
        if (charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }
        return true;
    }
</script>

3

अब तक कोई भी उत्तर पूर्ण समाधान प्रदान नहीं करता है। पता करने के लिए काफी कुछ मुद्दे हैं:

  1. सभी कीपर को पास नहीं किया जाता है keydownऔर keypressहैंडलर (जैसे बैकस्पेस और डिलीट कीज को कुछ ब्राउजर द्वारा दबा दिया जाता है)।
  2. संभालना keydownअच्छा विचार नहीं है। ऐसी परिस्थितियाँ होती हैं जहाँ कीपैड में कीपैड नहीं होता है!
  3. setTimeout() जब तक उपयोगकर्ता टाइप करना बंद नहीं करता, तब तक Google क्रोम / ब्लिंक वेब ब्राउज़र के तहत स्टाइल सॉल्यूशन में देरी होती है।
  4. माउस और टच इवेंट का उपयोग कट, कॉपी और पेस्ट जैसी क्रियाओं को करने के लिए किया जा सकता है। वे ईवेंट कीबोर्ड ईवेंट को ट्रिगर नहीं करेंगे।
  5. इनपुट विधि के आधार पर, ब्राउजर अधिसूचना को वितरित नहीं कर सकता है कि जब तक उपयोगकर्ता क्षेत्र से दूर नहीं जाता है तब तक तत्व बदल गया है।

एक और अधिक सही समाधान संभाल लेंगे keypress, keyup, input, और changeघटनाओं।

उदाहरण:

<p><input id="editvalue" type="text"></p>
<p>The text box contains: <span id="labelvalue"></span></p>

<script>
function UpdateDisplay()
{
    var inputelem = document.getElementById("editvalue");
    var s = inputelem.value;

    var labelelem = document.getElementById("labelvalue");
    labelelem.innerText = s;
}

// Initial update.
UpdateDisplay();

// Register event handlers.
var inputelem = document.getElementById("editvalue");
inputelem.addEventListener('keypress', UpdateDisplay);
inputelem.addEventListener('keyup', UpdateDisplay);
inputelem.addEventListener('input', UpdateDisplay);
inputelem.addEventListener('change', UpdateDisplay);
</script>

बेला:

http://jsfiddle.net/VDd6C/2175/

सभी चार घटनाओं को संभालने से सभी किनारे के मामलों को पकड़ता है। उपयोगकर्ता से इनपुट के साथ काम करते समय, सभी प्रकार के इनपुट तरीकों पर विचार किया जाना चाहिए और क्रॉस-ब्राउज़र और क्रॉस-डिवाइस कार्यक्षमता को सत्यापित किया जाना चाहिए। उपर्युक्त कोड को फ़ायरफ़ॉक्स, एज और क्रोम में डेस्कटॉप पर और साथ ही मेरे पास मोबाइल उपकरणों पर परीक्षण किया गया है।


सिर्फ inputघटना ही क्यों ?
याकॉव

inputहमेशा आग नहीं लगाता। कोई भी घटना सभी स्थितियों को कवर नहीं करती है।
क्यूबिकलसॉफ्ट

यदि आप "हमेशा नहीं" का अधिक विस्तार से वर्णन करते हैं, तो आप के लिए अच्छा होगा, जैसे कि आपने keypressउत्तर के लिए निर्दिष्ट किया है
याकॉव

1

मैं आम तौर पर क्षेत्र के मूल्य (यानी अद्यतन होने से पहले) कुंजी घटना के साथ जुड़े कुंजी से जुड़ा हुआ हूं। निम्नलिखित हाल ही में जेएस का उपयोग करता है इसलिए पुराने IE के समर्थन में समायोजन की आवश्यकता होगी।

जेएस का हालिया उदाहरण

document.querySelector('#test').addEventListener('keypress', function(evt) {
    var real_val = this.value + String.fromCharCode(evt.which);
    if (evt.which == 8) real_val = real_val.substr(0, real_val.length - 2);
    alert(real_val);
}, false);

पुराने IE के उदाहरण के लिए समर्थन

//get field
var field = document.getElementById('test');

//bind, somehow
if (window.addEventListener)
    field.addEventListener('keypress', keypress_cb, false);
else
    field.attachEvent('onkeypress', keypress_cb);

//callback
function keypress_cb(evt) {
    evt = evt || window.event;
    var code = evt.which || evt.keyCode,
        real_val = this.value + String.fromCharCode(code);
    if (code == 8) real_val = real_val.substr(0, real_val.length - 2);
}

[संपादित करें - यह दृष्टिकोण, डिफ़ॉल्ट रूप से, बैक स्पेस, CTRL + A जैसी चीजों के लिए कुंजी दबाता है। उपरोक्त कोड पूर्व के लिए समायोजित है, लेकिन बाद के लिए अनुमति देने के लिए और कुछ अन्य घटनाओं के लिए और अधिक छेड़छाड़ की आवश्यकता होगी। इयान बॉयड की टिप्पणी नीचे देखें।]


1
@ bažmegakapa या deleteकुंजी के साथ , या यदि उपयोगकर्ता एक कुंजी दबाता है जो सामग्री ( Ctrl+A) को संशोधित नहीं करता है , या यदि उपयोगकर्ता कुछ पाठ का चयन करता है और फिर aएक उपसेट को बदलने के लिए दबाता है। यह एक अच्छा विचार है, उटकानोस, लेकिन एक नाजुक।
इयान बॉयड

1
माना। मैं इसे छोड़ दूंगा क्योंकि इसमें कुछ माइलेज है लेकिन, जैसा कि आप कहते हैं, आपको इन कैविएट्स के लिए भत्ते का निर्माण करना होगा।
Mitya

1

आसान...

अपने कीप्रेस इवेंट हैंडलर में, लिखें

void ValidateKeyPressHandler(object sender, KeyPressEventArgs e)
{
    var tb = sender as TextBox;
    var startPos = tb.SelectionStart;
    var selLen= tb.SelectionLength;

    var afterEditValue = tb.Text.Remove(startPos, selLen)
                .Insert(startPos, e.KeyChar.ToString()); 
    //  ... more here
}

यदि कुंजी है तो क्या होता e.KeyCharहै Backspace? या Deleteकुंजी? या Ctrl+A?
इयान बॉयड

क्या यह जावास्क्रिप्ट भी है? void? object? पहले ऊपरी मामले के तरीके?
याकॉव

1

इसलिए प्रत्येक घटना के फायदे और नुकसान हैं। घटनाओं onkeypressऔर onkeydownनवीनतम मूल्य को पुनः प्राप्त नहीं है, और onkeypressकुछ ब्राउज़रों में गैर-मुद्रण योग्य पात्रों के लिए आग नहीं है। onkeyupघटना जब एक चाबी कई पात्रों के लिए नीचे आयोजित किया जाता है पता नहीं लगा पाया।

यह थोड़ा हैकरी है, लेकिन कुछ ऐसा कर रहा है

function edValueKeyDown(input) {
    var s = input.value;

    var lblValue = document.getElementById("lblValue");
    lblValue.innerText = "The text box contains: "+s;

    //var s = $("#edValue").val();
    //$("#lblValue").text(s);    
}
<input id="edValue" type="text" onkeydown="setTimeout(edValueKeyDown, 0, this)" />

सभी दुनिया के सर्वश्रेष्ठ को संभालने के लिए लगता है।


1

Event.key का उपयोग करके हम HTML इनपुट टेक्स्ट बॉक्स में पूर्व प्रवेश मान प्राप्त कर सकते हैं। यहाँ कोड है।

function checkText()
{
  console.log("Value Entered which was prevented was - " + event.key);
  
  //Following will prevent displaying value on textbox
  //You need to use your validation functions here and return value true or false.
  return false;
}
<input type="text" placeholder="Enter Value" onkeypress="return checkText()" />


इसके अलावा गिर जाता है जब पाठ कुछ है कि है के माध्यम से बदल गया है नहीं एक कुंजी दबाने (कट, पेस्ट, चयनित हटा, आदि)
इयान बॉयड

@IanBoyd हाँ सहमत हुए। उदाहरण को सरल रखने के लिए मैंने केवल कुंजीपट सत्यापन को लागू किया है।
vibs2006

0

आपके द्वारा प्राप्त मूल्य के लिए ईवेंट चारकोड को संक्षिप्त करने का प्रयास करें। यहाँ मेरे कोड का एक नमूना है:

<input type="text" name="price" onkeypress="return (cnum(event,this))" maxlength="10">
<p id="demo"></p>

js:

function cnum(event, str) {
    var a = event.charCode;
    var ab = str.value + String.fromCharCode(a);
    document.getElementById('demo').innerHTML = ab;
}

मूल्य abको इनपुट क्षेत्र में नवीनतम मूल्य मिलेगा।


क्षमा करें, मैंने इस पोस्ट को पोस्ट करने के बाद इस पृष्ठ में और भी बेहतर दृष्टिकोण के साथ देखा। मैंने पोस्ट करने से पहले ऐसा नहीं देखा। लेकिन मुझे लगता है कि मेरा कॉन्सेप्ट समझने में सरल है।
राम कृष्ण

जब कुंजी को हटा दिया जाता है , तो यह बहुत तेजी से गिरता है , बैकस्पेस , Ctrl + X या Ctrl + V , या जब माउस सभी पाठ का चयन करता है और मैं स्पेस
इयान बॉयड

मैंने सिर्फ अपना आइडिया लिखा। आप कीकोड या अन्य तरीकों का उपयोग करके अपनी आवश्यकता के अनुसार इसे लागू कर सकते हैं। यह महज मेरा विचार है।
राम कृष्ण

1
विचार उत्तर नहीं हैं। एसओ के उत्तर संक्षिप्त समाधान होने चाहिए जो निश्चित रूप से ओपी के प्रश्न का उत्तर दें ताकि सभी को लाभ मिल सके। यह स्पष्ट रूप से उस मानदंड को पूरा नहीं करता है।
क्यूबिकलसॉफ्ट

0

ऐसा करने का एक बेहतर तरीका है। कंकट विधि का उपयोग करें। उदाहरण

एक वैश्विक चर घोषित करें। यह कोणीय 10 पर अच्छा काम करता है, बस इसे वेनिला जावास्क्रिप्ट पर पास करें। उदाहरण:

एचटीएमएल

<input id="edValue" type="text" onKeyPress="edValueKeyPress($event)"><br>
<span id="lblValue">The text box contains: </span>

कोड

emptyString = ''

edValueKeyPress ($event){
   this.emptyString = this.emptyString.concat($event.key);
   console.log(this.emptyString);
}

और महत्वपूर्ण है जब Delete, Ctrl+ X, Ctrl+ V, Backspace? या अगर उन्होंने कुछ पाठ का चयन किया है, और फिर दबाएं A?
इयान बॉयड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.