इनपुट तत्व पर जावास्क्रिप्ट परिवर्तन की घटना केवल फोकस खोने पर होती है


84

मेरे पास एक इनपुट तत्व है और मैं सामग्री की लंबाई की जांच करना चाहता हूं और जब भी लंबाई एक विशेष आकार के बराबर हो जाती है, तो मैं सबमिट बटन को सक्षम करना चाहता हूं, लेकिन मैं घटना के रूप में जावास्क्रिप्ट के ऑन्चेंज घटना के साथ एक समस्या का सामना कर रहा हूं। आग तभी लगती है जब इनपुट तत्व दायरे से बाहर हो जाता है और तब नहीं जब सामग्री बदल जाती है।

<input type="text" id="name" onchange="checkLength(this.value)" />

---- ऑनकॉन्ग नाम की सामग्री को बदलने पर आग नहीं लगाता है, लेकिन केवल तभी ध्यान केंद्रित करता है जब नाम ध्यान से बाहर हो जाता है।

क्या इस घटना को सामग्री परिवर्तन पर काम करने के लिए मैं कुछ कर सकता हूं? या किसी अन्य घटना मैं इसके लिए उपयोग कर सकते हैं? मुझे onkeyup फ़ंक्शन का उपयोग करके एक वर्कअराउंड मिला, लेकिन जब हम ब्राउज़र के ऑटो कंपाइलर से कुछ सामग्री का चयन करते हैं तो यह आग नहीं लगती है।

मैं कुछ चाहता हूं जो काम कर सकता है जब क्षेत्र की सामग्री कीबोर्ड या माउस से बदल जाती है ... कोई विचार?


आप उपयोग कर सकते हैं onkeyupऔर onchange?
जेम्स एलार्डिस

1
मेरे पास एकमात्र मुद्दा यह है कि ब्राउज़र का स्वतः पूर्ण चयन इन घटनाओं के होने का कोई कारण नहीं होगा।
सचिन मिड्ढा

यह किस तरह का इनपुट फील्ड है?
powtac

ओह ... मैं इसे सैंपल कोड, इसके टेक्स्ट फील्ड में जोड़ना भूल गया।
सचिन मिड्ढा

1
मुझे लगा कि यह एक बहुत ही सामान्य मुद्दा रहा होगा और बहुत से लोगों ने इसका सामना किया होगा, लेकिन अब यह दूसरा रास्ता लगता है ... :)
सचिन मिधा

जवाबों:


120
(function () {
    var oldVal;

    $('#name').on('change textInput input', function () {
        var val = this.value;
        if (val !== oldVal) {
            oldVal = val;
            checkLength(val);
        }
    });
}());

यह पकड़ेगा change, कीस्ट्रोक्स, paste, textInput, input(उपलब्ध होने पर)। और आवश्यकता से अधिक अग्नि नहीं।

http://jsfiddle.net/katspaugh/xqeDj/


संदर्भ:

textInput- एक W3C DOM लेवल 3 ईवेंट प्रकार। http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

एक या अधिक वर्ण दर्ज किए जाने पर उपयोगकर्ता एजेंट को इस घटना को भेजना होगा। ये वर्ण विभिन्न प्रकार के स्रोतों से उत्पन्न हो सकते हैं, उदाहरण के लिए, किसी कुंजी को दबाने या कीबोर्ड डिवाइस पर जारी किए जाने वाले वर्णों से, इनपुट विधि संपादक के प्रसंस्करण से, या एक वॉइस कमांड से उत्पन्न होता है। जहां एक "पेस्ट" ऑपरेशन वर्णों का एक सरल अनुक्रम उत्पन्न करता है, अर्थात, बिना किसी संरचना या शैली की जानकारी के एक पाठ मार्ग, यह घटना प्रकार भी उत्पन्न किया जाना चाहिए।

input- एक HTML5 घटना प्रकार।

जब उपयोगकर्ता मान बदलता है तो नियंत्रण में फायर किया गया

फ़ायरफ़ॉक्स, क्रोम, IE9 और अन्य आधुनिक ब्राउज़र इसका समर्थन करते हैं।

यह घटना ऑन्चेंज इवेंट के विपरीत, संशोधन के तुरंत बाद होती है, जो तब होती है जब तत्व फोकस खो देता है।


1
इसका कोई काम नहीं ... क्या आपने अपने कोड की जाँच अपने अंत में की है ?? क्या यह एक ऑटोकम्प्लीटर से चयन पर काम कर रहा था ...?
सचिन मिड्ढा

मैंने textInputक्रोम 15 में जाँच की और यह काम करता है। मैं inputIE9 में घटना की जाँच की और यह भी काम करता है। फ़ायरफ़ॉक्स को समर्थन करना चाहिए DOMAttrModified, लेकिन मैंने इसे स्थापित नहीं किया है। ये दो घटनाएं सबसे अच्छी हैं जिनसे आप उम्मीद कर सकते हैं, क्योंकि वे किसी भी तरह के टेक्स्ट इनपुट पर आग लगाते हैं।
katspaugh

1
बहुत बढ़िया समाधान .... इनपुट मेरे लिए एक आशीर्वाद की तरह काम करता है ... इनपुट के अलावा और कुछ नहीं चाहिए, जो स्वयं पर्याप्त काम करता है। यह ff4 पर काम करता है, लेकिन 3.x पर नहीं है, और मेरे पास मेरे डेस्कटॉप पर 3.6 था और इसने कभी काम नहीं किया ...
सचिन मिड्ढा

5
चीजों को अद्यतन रखने के लिए, वर्तमान में इस समाधान ने FF22 में एकल इनपुट परिवर्तन पर कई बार गोलीबारी की, आपको कीप या टेक्स्टिनपुट घटनाओं का उपयोग करने की आवश्यकता नहीं है, इनपुट और प्रॉपर्टीचेक को पर्याप्त होना चाहिए
साइबर-गार्ड

1
मैंने पाया कि change, keyupऔर inputIE9 और फ़ायरफ़ॉक्स (36.0.4) को कवर करने के लिए सबसे अच्छा संयोजन था। keypressघटना IE9 में काम करने के लिए नहीं लगता था क्योंकि यह हटाएँ और बैकस्पेस, और जैसी चीजों पर कब्जा नहीं किया inputकीबोर्ड के साथ और संदर्भ मेनू के साथ चिपकाने घटना कवर।
टीएलएस

9

कटस्पा के उत्तर के लिए एक उद्धरण के रूप में, यहाँ एक ऐसा तरीका है जो एक css वर्ग का उपयोग करके कई तत्वों के लिए करता है।

   $('.myclass').each(function(){
        $(this).attr('oldval',$(this).val());
   });

   $('.myclass').on('change keypress paste focus textInput input',function(){
       var val = $(this).val();
       if(val != $(this).attr('oldval') ){
           $(this).attr('oldval',val); 
           checkLength($(this).val());
        }
    });

4

इसे खोजने में मुझे 30 मिनट का समय लगा, लेकिन यह जून 2019 में काम कर रहा है।

<input type="text" id="myInput" oninput="myFunction()">

और यदि आप js में प्रोग्राम श्रोता को एक कार्यक्रम जोड़ना चाहते हैं

inputElement.addEventListener("input", event => {})

3

यह jQuery तरीका है:

<input type="text" id="name" name="name"/>


$('#name').keyup(function() {
  alert('Content length has changed to: '+$(this).val().length);
});

1
यह भी केवल तभी निकाल दिया जाएगा जब फ़ील्ड फ़ोकस खो देता है।
फेलिक्स क्लिंग

@ फेलिक्स क्लिंग, सच, ने इसे कीप ();) में बदल दिया
powtac

फिर से कीप के साथ एक ही समस्या ... मैंने इसका इस्तेमाल किया है और मुझे इसके साथ एक समस्या थी। मेरा पूरा प्रश्न पढ़ें।
सचिन मिड्ढा

0

आप onkeyup का उपयोग कर सकते हैं

<input id="name" onkeyup="checkLength(this.value)" />

मैंने onkeyup का उपयोग किया है ... लेकिन मेरी समस्या यह है कि जब उपयोगकर्ता ब्राउज़र के ऑटोकंप्लीटर से चयन करता है, तो यह ईवेंट ट्रिगर नहीं होता है ... मैंने पहले उपयोग किए गए वर्कअराउंड में अपने प्रश्न में यह लिखा है ...
सचिन मिधा

0

आप के संयोजन का उपयोग करने के लिए होता onkeyupहै और onclick(या onmouseup) यदि आप हर संभावना को पकड़ने के लिए चाहते हैं।

<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />

अच्छी कोशिश, लेकिन यहाँ मुद्दा यह है कि मैं इनपुट तत्व पर माउस नहीं दबा रहा हूं, लेकिन ऑटो-कंपाइलर पर, जो इस घटना को ट्रिगर नहीं करेगा ...
सचिन मिधा

केवल एक और चीज जिसके बारे में मैं सोच सकता हूं, और वह है गंदा बुरा, setTimeoutसमय-समय पर क्षेत्र के मूल्य की जांच करना ... वास्तव में आप क्या करना चाहते हैं?
डेवग्रैंडमे विगत

यह बहुत बुरा है ...: D यह एक पासवर्ड स्ट्रेंथ इंडिकेटर के समान है, यह आपको पासवर्ड की ताकत बताता है क्योंकि आप इसमें प्रवेश करते रहते हैं। मैं केवल एक बटन को सक्षम करना चाहता हूं जब दर्ज की गई स्ट्रिंग की लंबाई 10 है और इसे अक्षम रखें। मुझे आशा है कि आपको यह मिल गया होगा ...
सचिन मिधा

0

यहां एक और समाधान है जो मैं उसी समस्या के लिए विकसित करता हूं। हालांकि मैं कई इनपुट बॉक्स का उपयोग करता हूं इसलिए मैं पुराने मान को तत्वों के उपयोगकर्ता-परिभाषित विशेषता के रूप में रखता हूं: "डेटा-मूल्य"। JQuery का उपयोग करना प्रबंधन करना बहुत आसान है।

        $(document).delegate('.filterBox', 'keyup', { self: this }, function (e) {
            var self = e.data.self;

            if (e.keyCode == 13) {
                e.preventDefault();
                $(this).attr('data-value', $(this).val());
                self.filterBy(this, true)
            }
            else if (e.keyCode == 27) {
                $(this).val('');
                $(this).attr('data-value', '');
                self.filterBy(this, true)
            }
            else {
                if ($(this).attr('data-value') != $(this).val()) {
                    $(this).attr('data-value', $(this).val());
                    self.filterBy(this);
                }
            }
        });

यहाँ, मैंने 5-6 इनपुट बॉक्स का उपयोग किया है जिसमें 'फिल्टरबॉक्स' वर्ग है, मैं फ़िल्टरबाय विधि को केवल तभी चलाता हूँ जब डेटा-वैल्यू अपने स्वयं के मूल्य से भिन्न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.