2010-01-19 9 views
9

मेरे पास एक एकल फॉर्म फ़ील्ड है और मुझे यह पता लगाने में सक्षम होना चाहिए कि फ़ील्ड बदलता है और नया फ़ील्ड का मान का उपयोग करके कुछ अतिरिक्त कोड निष्पादित करता है। मैं केवल कोड को निष्पादित करना चाहता हूं यदि कुंजी धक्का वास्तव में टेक्स्ट बॉक्स के मान को बदलता है। यहां समाधान है जिसके साथ मैं आया था।मैं कुंजीपटल पर टेक्स्ट फ़ील्ड का नया मान कैसे देख सकता हूं?

function onkeypress(e) { 
    var value = this.value; 
    // do something with 
} 

function onkeyup(e) { 
    if (e.which == 8 || e.keyCode == 46) { // delete or backspace keys 
    this.onkeypress(e); 
    } 
} 

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

कोई विचार?

उत्तर

3
(32 जगह नहीं है)

जिस तरह से मैं यह करता हूं वह prevValue की रेखाओं के साथ एक चर के साथ है। कुंजी प्रेस फ़ंक्शन के अंत में, उस चर में मान संग्रहीत करें, और केवल फ़ंक्शन को फिर से निष्पादित करें यदि मान पिछले मान के बराबर नहीं है।

1

एक और सशर्त है:

if(e.keyCode > 31 && e.keyCode < 127) { 
    value = this.value + e; 
} 

यह किसी भी निम्न स्तर ascii प्रतीक विशेष वर्ण सीमा के बाहर कुंजीपटल द्वारा दर्ज पकड़ने होगा।

संपादित करें:

function onkeyup(e) {   
    if (e.which == 8 || e.keyCode == 46) { // delete or backspace keys 
    switch(e.keyCode) { 
     case 32: 
     case 48..90: 
     case 96..111: 
     case 188: 
     case 190..192: 
     case 219..222: 
      value = this.value + e; 
      break; 
     default: 
      break; 
    }  
    this.onkeypress(e);   
    }   
} 
+0

हाँ के बजाय onkeyup उपयोग करते हैं, कि मैं क्या अर्थ था :) अस्पष्टता के लिए खेद है। मुझे और अधिक विशिष्ट होना चाहिए था कि सशर्त को घोंसले की आवश्यकता होती है। –

+1

असल में, मुझे अभी एहसास हुआ कि यह काम नहीं करेगा, क्योंकि कुंजी कोड अनिवार्य रूप से एसीआईआई कोड से मेल नहीं खाते हैं। Https://developer.mozilla.org/en/DOM/Event/UIEvent/KeyEvent – spudly

+0

एह देखें, यह अभी भी काम करता है, आपको केवल संख्याओं को समायोजित करना होगा। मुझे सशर्त के संपादन का प्रयास करने दें। –

0

यह एक हैक की तरह है, लेकिन आप पाठ बॉक्स के एक संपत्ति में पिछले मान डाल सकते हैं (जिसे "expando गुण")

function onkeypress(e) { 
    this.oldvalue = this.value; 
} 

function onkeyup(e) { 
    if (this.value != this.oldvalue) { 
    // do something 
    } 
} 
0

आप पुराने मूल्य की दुकान और अगर यह बदल पता लगा सकता है:

function keyUpHandle(e) { 
    if (this.prevValue && this.prevValue != this.value) { 
    // do something 
    } 
    this.prevValue = this.value; 
} 
1

यहाँ मेरी अंतिम समाधान है, जो एक prevValue चर का उपयोग करता है लेकिन ग्लोबल नेम स्पेस (विंडो) या डोम तत्व के गुणों को दूषित नहीं करता है।

(function() { 
    var input = document.getElementById('input_box'), 
     prevValue; 

    input.onkeyup = function(e) { 
    if (this.value != prevValue) { 
     prevValue = this.value; 
     // execute some more code here... 
    } 
    } 
}()); 

कि onkeyup समारोह ऊपर सूचना prevValue चर के चारों ओर एक बंद के रूप में कार्य करता है। यह नेमस्पेस प्रदूषण को रोकता है इसलिए मुझे वैश्विक चर बनाने या इनपुट तत्व को एक संपत्ति संलग्न करने की आवश्यकता नहीं है। यह उतना ही सुरुचिपूर्ण है जितना मैं इसे प्राप्त कर सकता हूं। मैं वास्तव में jQuery में मेरा लिखा था लेकिन इस सवाल का जवाब ही शुद्ध जावास्क्रिप्ट होना चाहिए ...

4

इस आसान है सोचा, बस onkeypress

+4

आपको स्पष्टीकरण जोड़ने पर विचार करना चाहिए कि' ऑनकीप्रेस 'के बजाय' ऑनकीप 'क्यों काम करेगा। – adamdunson

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

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