วิธีรับค่าเก่าด้วยเหตุการณ์ onchange () ในกล่องข้อความ


88

ฉันมีกล่องข้อความและค่าที่สร้างขึ้นเมื่อโหลดหน้าเว็บ ตอนนี้ถ้าผู้ใช้เปลี่ยนสิ่งใด ๆ ในกล่องข้อความฉันต้องการรับค่าที่เปลี่ยนแปลง (ค่าใหม่) และค่าเก่า แต่เมื่อฉันทำ 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>

ขอบคุณล่วงหน้า

คำตอบ:


70

element.defaultValue จะให้ค่าดั้งเดิมแก่คุณ

โปรดทราบว่าสิ่งนี้ใช้ได้กับค่าเริ่มต้นเท่านั้น

หากคุณต้องการสิ่งนี้เพื่อคงค่า "เก่า" ทุกครั้งที่มีการเปลี่ยนแปลงคุณสมบัติ expando หรือวิธีการที่คล้ายกันจะตอบสนองความต้องการของคุณ


เพียงแค่ทราบ ฉันค้นพบใน firefox element.getAttribute ("value") ดูเหมือนว่าจะเปิดเผยต้นฉบับ ... ฉันไม่รู้เพียงพอที่จะบอกได้ว่านี่เป็นการข้ามเบราว์เซอร์ / สิ่งมาตรฐานหรือไม่
cheshirekow

48
element.defaultValue ส่งคืนค่าที่กำหนดในแท็ก <input> หากค่านี้มีการเปลี่ยนแปลงโดยการแก้ไขหรือ JavaScript องค์ประกอบ defaultValue จะไม่ส่งคืนค่าเก่า (ใหม่) นี้
SabreWolfy

ขอบคุณ SabreWolfy เห็นความคิดเห็นของคุณและแก้ไขปัญหาของฉัน ต้องเปลี่ยนค่าหลายครั้งดังนั้นการทำข้างต้นจึงไม่ดี

179

คุณจะต้องจัดเก็บค่าเก่าด้วยตนเอง คุณสามารถจัดเก็บได้หลายวิธี คุณสามารถใช้ออบเจ็กต์จาวาสคริปต์เพื่อเก็บค่าสำหรับแต่ละกล่องข้อความหรือคุณอาจใช้ฟิลด์ที่ซ่อนอยู่ (ฉันไม่แนะนำ - html หนักเกินไป) หรือคุณสามารถใช้คุณสมบัติ expando บนกล่องข้อความได้เช่นนี้:

<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>

25
ฉันเข้าใจว่าคุณโหวตคำตอบหากไม่ได้ผลหรือเป็นคำตอบที่ไม่เหมาะสม ฉันให้คำตอบที่ตอบสนองความต้องการของผู้ใช้ รหัสนี้ได้รับการทดสอบ เป็นที่เรียบร้อย และมันทำสิ่งที่คำตอบที่ยอมรับไม่ได้ (คุณสามารถดูคุณสมบัติ defaultValue ได้ตลอดเวลา แต่ถ้าผู้ใช้เปลี่ยนค่ามากกว่าหนึ่งครั้งล่ะ?)
Gabriel McAdams

การเปลี่ยนแปลงที่แนะนำที่นี่ไม่ถูกต้อง ก่อนอื่นเมื่อมีการแจ้งเตือนเกิดขึ้นเขตข้อมูลจะสูญเสียโฟกัส การเปลี่ยนแปลงใด ๆ หลังจากนั้นจะเกิดขึ้นหลังจากที่เหตุการณ์ออนโฟกัสเริ่มทำงาน ประการที่สองเหตุการณ์ onchange ของช่องอินพุตจะไม่เริ่มทำงานจนกว่าจะสูญเสียโฟกัส
Gabriel McAdams

2
วิธีนี้จะทำงานได้ดีขึ้นหากคุณปรับเปลี่ยนค่าหลายครั้ง คำตอบด้านบน (element.defaultValue) ใช้งานได้เพียงครั้งเดียว อัพอันนี้ :)

4
ง่ายและมีประสิทธิภาพ หวังว่าฉันจะให้คุณมากกว่า +1
Ian Kemp

1
@GrijeshChauhan: ไม่เรากำลังตั้งค่าเก่าที่โฟกัส หลังจากนั้นหลังจากเปลี่ยนทุกครั้งเราก็ตั้งค่าใหม่อีกครั้ง
Gabriel McAdams

6

ฉันจะแนะนำ:

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

  //we have available old value here;
}

6

คุณควรใช้แอตทริบิวต์ข้อมูล HTML5 คุณสามารถสร้างแอตทริบิวต์ของคุณเองและบันทึกค่าต่างๆไว้ในนั้นได้


2

เคล็ดลับสกปรกที่ฉันใช้บ่อยครั้งคือการซ่อนตัวแปรในแอตทริบิวต์ "name" (ซึ่งโดยปกติฉันไม่ได้ใช้เพื่อวัตถุประสงค์อื่น):

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

ค่อนข้างไม่คาดคิดทั้งค่าเก่าและใหม่จะถูกส่งไปยัง someFunction(oldValue,newValue)


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

คุณสามารถทำได้: เพิ่มแอตทริบิวต์ oldvalue ให้กับองค์ประกอบ html เพิ่มชุด oldvalue เมื่อผู้ใช้คลิก จากนั้น onchange เหตุการณ์ใช้ oldvalue

<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

บางทีคุณอาจเก็บค่าก่อนหน้าของกล่องข้อความลงในกล่องข้อความที่ซ่อนไว้ จากนั้นคุณจะได้รับค่าแรกจากการซ่อนและค่าสุดท้ายจากกล่องข้อความเอง อีกทางเลือกหนึ่งที่เกี่ยวข้องกับสิ่งนี้ที่เหตุการณ์ออนโฟกัสของกล่องข้อความของคุณตั้งค่าของกล่องข้อความของคุณเป็นฟิลด์ที่ซ่อนอยู่และในเหตุการณ์ onchange อ่านค่าก่อนหน้า


1
แต่ถ้าเรามีกล่องข้อความมากกว่า 100 กล่องในกรณีนี้เราจำเป็นต้องมีตัวแปรซ่อนอยู่มากกว่า 100 รายการมีวิธีอื่นอีกไหมที่เราจะได้รับค่าเก่า
CFUser

0

บางทีคุณอาจลองบันทึกค่าเก่าด้วยเหตุการณ์ "ออนโฟกัส" เพื่อเปรียบเทียบกับค่าใหม่กับเหตุการณ์ "onchange" ในภายหลัง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.