텍스트 상자에서 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에 의해 변경된 경우 element, defaultValue는이 (새) 이전 값을 반환하지 않습니다.
SabreWolfy 2012 년

감사합니다 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

여기에 제안 된 변경 사항이 올바르지 않습니다. 우선 경보가 발생하면 필드가 초점을 잃게됩니다. 그 이후의 모든 변경은 onfocus 이벤트가 발생한 후에 발생합니다. 둘째, 입력 필드의 onchange 이벤트는 포커스를 잃을 때까지 발생하지 않습니다.
Gabriel McAdams 2011 년

2
값을 여러 번 조작하는 경우 더 잘 작동합니다. 위의 대답 (element.defaultValue)은 한 번만 작동합니다. 이 하나 :) 업

4
간단하고 효과적입니다. +1 이상 줄 수 있으면 좋겠어요.
Ian Kemp

1
@GrijeshChauhan : 아니요. 이전 값을 초점에 맞추고 있습니다. 그 후 모든 변경 후에 다시 설정합니다.
Gabriel McAdams 2014 년

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

당신은 이것을 할 수 있습니다 : html 요소에 oldvalue 속성을 추가하고 사용자가 클릭 할 때 set 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

아마도 텍스트 상자의 이전 값을 숨겨진 텍스트 상자에 저장할 수 있습니다. 그런 다음 숨김에서 첫 번째 값을 가져오고 텍스트 상자 자체에서 마지막 값을 가져올 수 있습니다. 이와 관련된 대안으로 텍스트 상자의 onfocus 이벤트에서 텍스트 상자의 값을 숨겨진 필드로 설정하고 onchange 이벤트에서 이전 값을 읽습니다.


1
하지만 100 개 이상의 텍스트 상자가있는 경우이 경우에는 100 개 이상의 숨겨진 변수가 필요합니다. 그러면 이전 값을 얻을 수있는 다른 방법이 있습니까?
CFUser 2009

0

"onfocus"이벤트를 사용하여 이전 값을 저장하여 나중에 "onchange"이벤트를 사용하여 새 값과 비교할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.