Как получить старое значение с событием 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>

Заранее спасибо

CFUser
источник

Ответы:

70

element.defaultValue даст вам исходное значение.

Обратите внимание, что это работает только с начальным значением.

Если вам нужно, чтобы это сохраняло "старое" значение каждый раз, когда оно изменяется, свойство expando или аналогичный метод удовлетворит ваши потребности.

Джордж
источник
просто примечание. Я обнаружил в firefox element.getAttribute ("value"), похоже, также раскрывает оригинал ... Я не знаю достаточно, чтобы сказать, является ли это кроссбраузерным / стандартным.
cheshirekow
48
element.defaultValue возвращает значение, установленное в теге <input>. Если это значение было изменено путем редактирования или какого-либо другого элемента JavaScript, defaultValue не вернет это (новое) старое значение.
SabreWolfy
Спасибо, SabreWolfy, заметил ваш комментарий и решил мою проблему. Пришлось менять значение несколько раз, так что сделать это было бесполезно.
179

Вам нужно будет сохранить старое значение вручную. Вы можете хранить его разными способами. Вы можете использовать объект javascript для хранения значений для каждого текстового поля, или вы можете использовать скрытое поле (я бы не рекомендовал его - слишком тяжелый html), или вы можете использовать свойство expando в самом текстовом поле, например:

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

Тогда ваша функция javascript для обработки изменения будет выглядеть так:

    <script type="text/javascript">
    function onChangeTest(textbox) {
        alert("Value is " + textbox.value + "\n" + "Old Value is " + textbox.oldvalue);
    }
    </script>
Габриэль Макадамс
источник
25
Я понимаю, что вы отклоняете ответ, если он не работает или если это неуместный ответ. Я дал ответ, который удовлетворил потребность пользователя. Этот код был протестирован. Это полно. И он делает то, чего не делает принятый ответ (вы всегда можете посмотреть свойство defaultValue, но что, если пользователь изменяет значение более одного раза?).
Габриэль Макадамс,
Предлагаемое здесь изменение неверно. Прежде всего, как только появляется предупреждение, поле теряет фокус. Любое изменение после этого произойдет после того, как было запущено событие onfocus. Во-вторых, событие onchange поля ввода не срабатывает, пока не потеряет фокус.
Габриэль Макадамс
2
Это работает лучше, если вы изменяете значение несколько раз. Ответ выше (element.defaultValue) работает только один раз. Вверх :)
4
Просто и эффективно. Хотел бы я дать вам больше +1.
Ян Кемп,
1
@GrijeshChauhan: Нет. Мы устанавливаем старое значение в фокусе. После этого после каждого изменения выставляем заново.
Габриэль Макадамс
6

Я бы посоветовал:

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

  //we have available old value here;
}
Кришник
источник
6

Вы должны использовать атрибуты данных HTML5. Вы можете создавать свои собственные атрибуты и сохранять в них разные значения.

tiwari.vikash
источник
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);
*/
Manjeet
источник
2

Вы можете сделать это: добавить атрибут oldvalue к элементу html, добавить set oldvalue при нажатии пользователем. Затем в событии onchange используйте старое значение.

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

Возможно, вы можете попытаться сохранить старое значение с помощью события «onfocus», чтобы впоследствии сравнить его с новым значением с событием «onchange».

владение
источник