Textarea onchange डिटेक्शन


132

मैं जावास्क्रिप्ट का उपयोग करके textarea पर परिवर्तन घटना का पता कैसे लगाऊँ?
मैं यह पता लगाने की कोशिश कर रहा हूं कि आपके द्वारा टाइप किए गए वर्ण कितने बचे हैं।

मैंने ऑनचेंज इवेंट का उपयोग करने की कोशिश की, लेकिन जब फोकस बाहर होता है तो केवल किक करता है।

जवाबों:


97

आप उपयोग करने की आवश्यकता होगी onkeyup और onchange इस बात के लिए। ऑन्चेंज संदर्भ-मेनू चिपकाने को रोक देगा, और हर कीस्ट्रोकेक के लिए ऑनकीप फायर करेगा।

एक कोड नमूने के लिए textArea पर अधिकतम गति कैसे लागू करें पर मेरा जवाब देखें ।


3
बस इस बात पर जोर देना चाहते थे कि जोश ने पहले ही कहा था, कि आपको कीप का उपयोग करना चाहिए, इसके लिए कीडाउन नहीं: परिवर्तन को वास्तव में टेक्सारिया के लिए किए जाने से पहले कीडाउन कहा जाता है, इसलिए आप गलत लंबाई का उपयोग कर रहे हैं (और आप डॉन ' टी वास्तव में जानते हैं कि आप कैसे हैं: टाइपिंग या डिलीट हो सकते हैं, और पाठ चयनित अर्थ हो सकता है कि यह सिर्फ +/- 1 से अधिक है)।
ब्रायनमर्न्स

65
मैं यहाँ -1 दे रहा हूँ, क्षमा करें! onkeyupइनपुट का पता लगाने के लिए एक भयानक घटना है। का प्रयोग करें oninputऔर onpropertychange(IE समर्थन)।
एंडी ई

6
संदर्भ-मेनू कट / पेस्ट होने पर "केवल" समस्या को निकाल नहीं दिया onchangeजाता है।
टॉम

4
ऑनकीडाउन और सेटटाइमआउट का उपयोग करना बहुत अधिक उत्तरदायी है ताकि आपको कुंजी के रिलीज़ होने की प्रतीक्षा करने के बजाय तत्काल परिवर्तन का पता लग सके। यदि आपको कट और पेस्ट को पकड़ने की आवश्यकता है, तो कट और पेस्ट घटनाओं का उपयोग करें।
केविन बी

1
चेतावनी: onkeyup आपको परेशानी दे सकता है। उदाहरण: यदि इनपुट सामग्री बदली गई तो आपको केवल कुछ करना चाहिए। यदि आप मान लेते हैं कि कीप इनपुट को बदल देगा, तो यह सच नहीं है। इनपुट पर ध्यान केंद्रित करें। अगले फ़ील्ड पर जाने के लिए "टैब" का उपयोग करें। अब इनपुट पर वापस जाने के लिए "शिफ्ट + टैब" का उपयोग करें। कीप आग अभी तक इनपुट वास्तव में उपयोगकर्ता द्वारा बदल नहीं था।
जिग मेंडल

117

यह 2012 का समय है, पीसी के बाद का युग यहां है, और हमें अभी भी इसके साथ बुनियादी रूप से कुछ संघर्ष करना है। यह बहुत आसान होना चाहिए ।

जब तक वह सपना पूरा नहीं हो जाता है, तब तक यह करने का सबसे अच्छा तरीका है, क्रॉस-ब्राउज़र: जैसे और घटनाओं के संयोजन का उपयोगinputonpropertychange करें:

var area = container.querySelector('textarea');
if (area.addEventListener) {
  area.addEventListener('input', function() {
    // event handling code for sane browsers
  }, false);
} else if (area.attachEvent) {
  area.attachEvent('onpropertychange', function() {
    // IE-specific event handling code
  });
}

inputघटना का ख्याल रखता है IE9 +, एफएफ, क्रोम, ओपेरा और सफारी , और onpropertychangeका ख्याल रखता है IE8 (यह भी IE6 और 7 के साथ काम करता है, लेकिन वहाँ कुछ कीड़े हैं)।

उपयोग करने का लाभ inputऔर onpropertychangeयह है कि वे अनावश्यक रूप से फायर नहीं करते हैं (जैसे कि Ctrlया Shiftकुंजी दबाते समय ); इसलिए यदि आप टेक्स्टारिया सामग्री को बदलते समय अपेक्षाकृत महंगा ऑपरेशन चलाना चाहते हैं, तो यह रास्ता तय करना है

अब IE, हमेशा की तरह, इस का समर्थन करने का एक आधा काम करता है: न तो IE में आग inputऔर न ही onpropertychangeजब अक्षर textarea से हटा दिए जाते हैं । इसलिए यदि आपको IE में वर्णों को हटाने की आवश्यकता है, तो उपयोग करें keypress(जैसा कि उपयोग करने के विपरीत keyup/ keydown, क्योंकि वे केवल एक बार आग लगाते हैं भले ही उपयोगकर्ता दबाए और एक कुंजी दबाए रखता है)।

स्रोत: http://www.alistapart.com/articles/expanding-text-areas-made-elegant/

संपादित करें: ऐसा लगता है कि उपरोक्त समाधान भी सही नहीं है, जैसा कि टिप्पणियों में ठीक से बताया गया है: addEventListenerटेक्स्टारिया पर संपत्ति की उपस्थिति का मतलब यह नहीं है कि आप एक सेंस ब्राउज़र के साथ काम कर रहे हैं; इसी तरह attachEventसंपत्ति की उपस्थिति IE का अर्थ नहीं है। यदि आप चाहते हैं कि आपका कोड वास्तव में एयर-टाइट हो, तो आपको इसे बदलने पर विचार करना चाहिए। पॉइंटर्स के लिए टिम डाउन की टिप्पणी देखें ।


1
यह सबसे अच्छा तरीका है। मुझे यहां इंफ़ॉर्मेशन पसंद नहीं है (इसके लिए ब्राउज़र का समर्थन घटना के addEventListenerलिए समर्थन नहीं करता है input, या इसके विपरीत); सुविधा का पता लगाना बेहतर होगा। इस चर्चा के लिए इस ब्लॉग पोस्ट को देखें ।
टिम डाउन

इस पर टिम के साथ पूरी तरह से सहमत हैं। oninputयह है कि हमें ऐसा कैसे करना चाहिए, लेकिन आपका संभवतः addEventListenerब्राउज़र-समर्थन के लिए आपके परीक्षण के रूप में उपयोग नहीं किया जाना चाहिए । किसी भी मामले में +1।
बेन डी

1
असहमत, इनपुट IE9 का ख्याल नहीं रखेगा। संदर्भ के माध्यम से कट / पेस्ट दुर्भाग्य से भी इनपुट है, और इसलिए बैकस्पेस है। मैं परीक्षण करने की जहमत नहीं उठाता, लेकिन मैं IE10 + की शर्त पर कोई भी पैसा नहीं लगाता।
स्टेफेन स्टेगर

1
@StefanSteiger यही कारण है कि मेरा जवाब keypressIE9 में उस मामले को संभालने के लिए घटना का उपयोग करने का सुझाव देता है (और संभवतः बाद के संस्करण भी)।
विक्की चिजवानी

inputईवेंट हैंडलर को .oninputऑब्जेक्ट प्रॉपर्टी को लागू करके भी परिभाषित किया जा सकता है ।
संभालें

20
  • Google-Chrome के लिए, oninput पर्याप्त होगा (संस्करण 22.0.1229.94 मीटर के साथ विंडोज 7 पर परीक्षण किया गया)।
  • IE 9 के लिए, ओनिनपुट, रेफ़रमेनू और बैकस्पेस के माध्यम से कट को छोड़कर सब कुछ पकड़ लेगा।
  • IE 8 के लिए, onpropertychange को oninput के अलावा चिपकाने को पकड़ने की आवश्यकता होती है।
  • IE 9 + 8 के लिए, बैकस्पेस को पकड़ने के लिए ऑनकीप की आवश्यकता होती है।
  • IE 9 + 8 के लिए, ओनमेसमोव एकमात्र तरीका है जिसे मैंने रेफ़रमेनू के माध्यम से काटने के लिए पाया

फ़ायरफ़ॉक्स पर परीक्षण नहीं किया गया।

    var isIE = /*@cc_on!@*/false; // Note: This line breaks closure compiler...

    function SuperDuperFunction() {
        // DoSomething
    }


    function SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally() {
        if(isIE) // For Chrome, oninput works as expected
            SuperDuperFunction();
    }

<textarea id="taSource"
          class="taSplitted"
          rows="4"
          cols="50"
          oninput="SuperDuperFunction();"
          onpropertychange="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
          onmousemove="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();"
          onkeyup="SuperDuperFunctionBecauseMicrosoftMakesIEsuckIntentionally();">
Test
</textarea>

1
बहुत बढ़िया समारोह के नाम :)
जोनास ग्रोगर

8

मुझे पता है कि यह बिल्कुल आपका सवाल नहीं है, लेकिन मुझे लगा कि यह उपयोगी हो सकता है। कुछ अनुप्रयोगों के लिए यह महत्वपूर्ण है कि हर एक बार एक कुंजी दबाए जाने पर परिवर्तन फ़ंक्शन आग न हो। इसे कुछ इस तरह से हासिल किया जा सकता है:

var text = document.createElement('textarea');
text.rows = 10;
text.cols = 40;
document.body.appendChild(text);

text.onkeyup = function(){
var callcount = 0;
    var action = function(){
        alert('changed');
    }
    var delayAction = function(action, time){
        var expectcallcount = callcount;
        var delay = function(){
            if(callcount == expectcallcount){
                action();
            }
        }
        setTimeout(delay, time);
    }
    return function(eventtrigger){
        ++callcount;
        delayAction(action, 1200);
    }
}();

यह परीक्षण करके काम करता है यदि हाल ही में एक निश्चित घटना को एक निश्चित विलंब अवधि के भीतर निकाल दिया गया हो। सौभाग्य!


1
'थ्रॉटलिंग' के लिए +1 विलंबित कार्रवाई! मैं अपने ऐप में कुछ इसी तरह का उपयोग करता हूं।
प्यूलसक

7

मुझे पता है कि यह सवाल जावास्क्रिप्ट के लिए विशिष्ट था, हालांकि, ऐसा प्रतीत होता है कि कोई भी अच्छा, साफ रास्ता नहीं है, जब सभी मौजूदा ब्राउज़रों में एक textarea बदल जाता है। मैंने सीखा है कि jquery ने हमारे लिए इसका ध्यान रखा है। यहां तक ​​कि यह पाठ क्षेत्रों के संदर्भ मेनू परिवर्तन को भी संभालता है। इनपुट प्रकार की परवाह किए बिना एक ही वाक्य रचना का उपयोग किया जाता है।

    $('div.lawyerList').on('change','textarea',function(){
      // Change occurred so count chars...
    });

या

    $('textarea').on('change',function(){
      // Change occurred so count chars...
    });

4
मैंने पाया कि परिवर्तन की घटना सादे js के साथ jQuery के साथ अधिक सुसंगत नहीं थी। मैंने jQuery का उपयोग किया bind("input cut paste"...और यह एक आकर्षण की तरह काम करता है - कीबोर्ड या संदर्भ मेनू का उपयोग करके टाइपिंग, कट और पेस्ट; पाठ का ड्रैग / ड्रॉप भी।
लॉरेंस डॉल

2
दुर्भाग्य से, एफएफ के changeलिए आग की घटना नहीं है textarea
dma_k

4

आप टैक्स्टारिया के परिवर्तन पर ईवेंट सुन सकते हैं और अपने अनुसार परिवर्तन कर सकते हैं। यहाँ एक उदाहरण है।

(() => {
	const textArea = document.getElementById('my_text_area');
  textArea.addEventListener('input', () => {
    let textLn =  textArea.value.length;
    if(textLn >= 100) {
      textArea.style.fontSize = '10pt';
    }

  })
})()
<html>
<textarea id='my_text_area' rows="4" cols="50" style="font-size:40pt">
This text will change font after 100.
</textarea>
</html>


1

एचटीएमएल 5 इनपुट सत्यापन / पैटर्न विशेषता के साथ जोड़े जाने पर कीप को पर्याप्त होना चाहिए। तो, इनपुट को मान्य करने और .checkValidity () स्थिति पर कार्य करने के लिए एक पैटर्न (रेगेक्स) बनाएं। नीचे कुछ काम कर सकता है। आपके मामले में आप एक रेगेक्स से मैच की लंबाई चाहते हैं। मेरा समाधान यहाँ ऑनलाइन उपयोग / डेमो-सक्षम है

<input type="text" pattern="[a-zA-Z]+" id="my-input">

var myInput = document.getElementById = "my-input";

myInput.addEventListener("keyup", function(){
  if(!this.checkValidity() || !this.value){
    submitButton.disabled = true;
  } else {
    submitButton.disabled = false;
  }
});

0

कोड I का उपयोग IE 11 के लिए बिना jquery के लिए और सिर्फ एक टेक्स्टारिया के लिए किया गया है:

जावास्क्रिप्ट:

// Impede que o comentário tenha mais de num_max caracteres
var internalChange= 0; // important, prevent reenter
function limit_char(max)
{ 
    if (internalChange == 1)
    {
        internalChange= 0;
        return;
    }
    internalChange= 1;
    // <form> and <textarea> are the ID's of your form and textarea objects
    <form>.<textarea>.value= <form>.<textarea>.value.substring(0,max);
}

और HTML:

<TEXTAREA onpropertychange='limit_char(5)' ...

-1

इसको आजमाओ। यह सरल है, और 2016 के बाद से मुझे यकीन है कि यह अधिकांश ब्राउज़रों पर काम करेगा।

<textarea id="text" cols="50" rows="5" onkeyup="check()" maxlength="15"></textarea> 
<div><span id="spn"></span> characters left</div>

function check(){
    var string = document.getElementById("url").value
    var left = 15 - string.length;
    document.getElementById("spn").innerHTML = left;
}

तो आप आईडी द्वारा यूआरएल प्राप्त कर रहे हैं, लेकिन यह आपके कोड में नहीं दिखाया गया है।
सम्पूर्ण

-8

सबसे अच्छी बात जो आप कर सकते हैं वह है कि किसी दिए गए समय पर कॉल करने के लिए एक फ़ंक्शन सेट करें और यह फ़ंक्शन आपके टेक्टेरा की सामग्री की जांच करने के लिए।

self.setInterval('checkTextAreaValue()', 50);

7
मतदान एक बहुत बुरा विचार है। यह सिर्फ प्रदर्शन को नष्ट कर देगा। इसके अलावा, अन्य पोस्ट की तरह, कुछ समाधान मौजूद हैं
पियर-ओलिवियर थिबॉल्ट

2
यही इक्कीसवीं सदी है। किसी भी ब्राउज़र को हर 50 एमएस की तुलना में एक स्ट्रिंग को संभालने में परेशानी नहीं होनी चाहिए। अपने चयनकर्ताओं को कैश करें और यह पूरी तरह से स्वीकार्य समाधान है।
अशक्तता
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.