2011-08-18 16 views
61

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

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

---- onchange नाम की सामग्री को बदलने पर आग नहीं है, लेकिन केवल सक्रिय होता है नाम फोकस के बाहर चला जाता है।

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

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

+0

आप 'onkeyup' और'change 'का उपयोग कर सकते हैं? –

+1

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

+0

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

उत्तर

94
(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 डोम स्तर 3 घटना प्रकार। http://www.w3.org/TR/DOM-Level-3-Events/#events-textevents

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

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

नियंत्रण पर निकाल दिया उपयोगकर्ता मूल्य

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

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

+1

इसका कोई काम नहीं है ... क्या आपने अपना कोड अपने अंत में देखा है ?? क्या यह एक स्वत: पूर्ण से चयन पर काम कर रहा था ...? –

+0

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

+0

फ़ायरफ़ॉक्स 4 में 'इनपुट' की जांच की - काम करता है। – katspaugh

2

Do it the jQuery way:

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


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

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

+0

@ फ़ेलिक्स क्लिंग, सच, इसे keyup() में बदल दिया;) – powtac

+0

फिर से कुंजीपटल के साथ एक ही समस्या ... मैंने इसका उपयोग किया है और मुझे इसके साथ कोई समस्या है। मेरा पूरा प्रश्न पढ़ें। –

0

आप

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

मैंने ऑनकीप का उपयोग किया है ... लेकिन मेरी समस्या तब होती है जब उपयोगकर्ता ब्राउज़र के स्वत: पूर्ण से चुनता है, तो यह घटना ट्रिगर नहीं होती है ... मैंने इसे अपने प्रश्न में पहले से ही लिखा है जो मैंने उपयोग किया है ... –

0

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

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

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

+0

एकमात्र अन्य चीज जिसे मैं सोच सकता हूं, और यह बुरा बुरा है, है 'setTimeout' पर और समय-समय पर फ़ील्ड के मान की जांच करें ... आप वास्तव में क्या करना चाहते हैं? – DaveRandom

+0

बहुत बुरा है ...: डी यह पासवर्ड की ताकत संकेतक के समान कुछ है, यह आपको पासवर्ड की ताकत बताता है जैसे आप इसमें प्रवेश करते रहते हैं। मैं केवल एक बटन सक्षम करना चाहता हूं जब दर्ज स्ट्रिंग लंबाई की हो और 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 इनपुट बॉक्स वर्ग 'filterBox', है मैं filterBy विधि रन बनाने ही अगर डेटा-मूल्य का अपना मूल्य से अलग है।

7

कैट्सफ़ोफ़ के जवाब के विस्तार के रूप में, यहां एक सीएसएस वर्ग का उपयोग करके कई तत्वों के लिए ऐसा करने का एक तरीका है।

$('.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()); 
     } 
    }); 
संबंधित मुद्दे