टेक्स्ट बॉक्स में onchange () ईवेंट के साथ पुराना मान कैसे प्राप्त करें


85

जब पृष्ठ लोड होता है तो मेरे पास एक टेक्स्ट बॉक्स और एक मान होता है। अब यदि उपयोगकर्ता टेक्स्ट बॉक्स में किसी भी चीज का परिवर्तन करता है, तो मैं परिवर्तित मूल्य (नया मूल्य) और पुराना मूल्य प्राप्त करना चाहता हूं, लेकिन जब मैं ELEMENT.value करता हूं, तब इसका केवल परिवर्तित मूल्य देता है

पुराने मूल्य प्राप्त करने के लिए कोई सुझाव?

नीचे मेरा कोड है

<head>
    <script type="text/javascript">
      function onChangeTest(changeVal) {
        alert("Value is " + changeVal.value);
      }
    </script>
  </head>
  <body>
    <form>
      <div>
          <input type="text" id="test" value ="ABS" onchange="onChangeTest(this)">  
      </div>
    </form>
  </body>
</html>

अग्रिम में धन्यवाद

जवाबों:


69

element.defaultValue आपको मूल मूल्य देगा।

कृपया ध्यान दें कि यह केवल प्रारंभिक मूल्य पर काम करता है।

यदि आपको हर बार बदलने पर "पुराने" मान को बनाए रखने के लिए इसकी आवश्यकता होती है, तो एक विस्तारक संपत्ति या इसी तरह की विधि आपकी आवश्यकताओं को पूरा करेगी


सिर्फ एक नोट। मुझे फ़ायरफ़ॉक्स एलिमेंट पर खोजा गया था। एट्रिब्यूट ("वैल्यू") भी मूल को प्रकट करता है ... मुझे यह बताने के लिए पर्याप्त नहीं है कि क्या यह क्रॉस-ब्राउज़र / मानक चीज़ है।
चेशायरकोव

47
element.defaultValue <input> टैग में सेट मान लौटाता है। यदि यह मान संपादन या किसी अन्य जावास्क्रिप्ट द्वारा बदल गया है, तो तत्व, defaultValue यह (नया) पुराना मान वापस नहीं करेगा।
सब्रेवुल्फी

धन्यवाद SabreWolfy, आपकी टिप्पणी को देखा और मेरी समस्या को हल किया। मूल्य को कई बार बदलना था इसलिए ऊपर करना अच्छा नहीं था।

175

आपको पुराने मूल्य को मैन्युअल रूप से संग्रहीत करने की आवश्यकता होगी। आप इसे विभिन्न तरीकों से संग्रहीत कर सकते हैं। आप प्रत्येक टेक्स्टबॉक्स के लिए मूल्यों को संग्रहीत करने के लिए एक जावास्क्रिप्ट ऑब्जेक्ट का उपयोग कर सकते हैं, या आप एक छिपे हुए फ़ील्ड का उपयोग कर सकते हैं (मैं इसकी अनुशंसा नहीं करूंगा - बहुत भारी HTML), या आप इस तरह से टेक्स्टबॉक्स पर एक एक्सपेंडो संपत्ति का उपयोग कर सकते हैं:

<input type="text" onfocus="this.oldvalue = this.value;" onchange="onChangeTest(this);this.oldvalue = this.value;" />

तब परिवर्तन को संभालने के लिए आपका जावास्क्रिप्ट फ़ंक्शन इस तरह दिखता है:

    <script type="text/javascript">
    function onChangeTest(textbox) {
        alert("Value is " + textbox.value + "\n" + "Old Value is " + textbox.oldvalue);
    }
    </script>

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

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

2
यदि आप मान को कई बार जोड़ रहे हैं तो यह बेहतर काम करता है। ऊपर दिया गया उत्तर (एलिमेंट। डेफॉल्ट वॉल्यू) केवल एक बार काम करता है। इस एक पर :)

4
सरल और प्रभावी। काश मैं तुम्हें +1 से ज्यादा दे पाता।
इयान केम्प

1
@GrijeshChauhan: नहीं। हम पुराने मूल्य को फोकस पर सेट कर रहे हैं। उसके बाद, हर परिवर्तन के बाद, हमने इसे फिर से सेट किया।
गेब्रियल मैकएडम्स

6

मै सुझाव दूंगा:

function onChange(field){
  field.old=field.recent;
  field.recent=field.value;

  //we have available old value here;
}

6

आपको HTML5 डेटा विशेषताओं का उपयोग करना चाहिए। आप अपनी विशेषताओं को बना सकते हैं और उनमें विभिन्न मूल्यों को बचा सकते हैं।


2

मेरे द्वारा उपयोग की जाने वाली एक गंदी चाल, 'नाम' विशेषता में चर छिपा रही है (जिसका उपयोग मैं आमतौर पर अन्य उद्देश्यों के लिए नहीं करता):

select onFocus=(this.name=this.value) onChange=someFunction(this.name,this.value)><option...

कुछ अप्रत्याशित रूप से, पुराने और नए मूल्य दोनों को तब सबमिट किया जाता है someFunction(oldValue,newValue)


7
हाँ जो गंदा है!
एलन मैकडोनाल्ड

2

मुझे यकीन नहीं है, लेकिन शायद यह तर्क काम करेगा।

var d = 10;
var prevDate = "";
var x = 0;
var oldVal = "";
var func = function (d) {
    if (x == 0 && d != prevDate && prevDate == "") {
        oldVal = d;
        prevDate = d;
    }
    else if (x == 1 && prevDate != d) {
        oldVal = prevDate;
        prevDate = d;
    }
    console.log(oldVal);
    x = 1;
};
/*
         ============================================
         Try:
         func(2);
         func(3);
         func(4);
*/

2

आप ऐसा कर सकते हैं: पुराने एलिमेंट विशेषता को html एलिमेंट में जोड़ें, जब यूजर क्लिक करें तो सेट ओल्डवेल्यू जोड़ें। फिर ऑन्चेंज इवेंट में पुरानेपन का उपयोग करें।

<input type="text" id="test" value ="ABS" onchange="onChangeTest(this)" onclick="setoldvalue(this)" oldvalue="">

<script>
function setoldvalue(element){
   element.setAttribute("oldvalue",this.value);
}

function onChangeTest(element){
   element.setAttribute("value",this.getAttribute("oldvalue"));
}
</script>

0

हो सकता है कि आप टेक्स्टबॉक्स के पिछले मूल्य को एक छिपे हुए टेक्स्टबॉक्स में संग्रहीत कर सकते हैं। फिर आप छिपे हुए से पहला मान प्राप्त कर सकते हैं और आखिरी मान टेक्स्टबॉक्स से ले सकते हैं। इससे संबंधित एक विकल्प, आपके टेक्स्टबॉक्स के ऑनफोकस इवेंट में आपके टेक्स्टबॉक्स के मूल्य को एक छिपे हुए क्षेत्र में सेट करता है और ऑनकॉन्ग इवेंट में पिछले मूल्य को पढ़ता है।


1
लेकिन, अगर हमारे पास कुछ 100+ टेक्स्ट बॉक्स हैं, तो इस मामले में हमें 100+ छिपे हुए चर रखने की आवश्यकता है, तो क्या कोई अन्य तरीका है जिससे हम पुराने मूल्य प्राप्त कर सकते हैं?
CFUser

0

हो सकता है कि आप "onfocus" इवेंट के साथ पुराने मान को सहेजने की कोशिश कर सकते हैं और बाद में इसे "onchange" इवेंट के साथ नए मान से तुलना कर सकते हैं।

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