Як отримати старе значення з подією 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 надасть вам початкове значення.

Зверніть увагу, що це працює лише на початкове значення.

Якщо вам потрібно це зберегти "старе" значення кожного разу, коли воно змінюється, властивість extendo або подібний метод відповідатиме вашим потребам


просто примітка. Я виявив у firefox element.getAttribute ("значення"), здається, також виявляє оригінал ... Я недостатньо знаю, щоб сказати, чи це крос-браузер / стандартна річ.
cheshirekow

47
element.defaultValue повертає значення, встановлене в тегу <input>. Якщо це значення змінилося за допомогою редагування чи іншого елемента JavaScript, елемент defaultValue не поверне це (нове) старе значення.
SabreWolfy

Дякую SabreWolfy, помітив ваш коментар і вирішив мою проблему. Доводилося змінювати значення кілька разів, тому робити вищезазначене не було ніякої користі.

175

Вам потрібно буде зберегти старе значення вручну. Ви можете зберігати його різними способами. Ви можете використовувати об'єкт javascript для зберігання значень для кожного текстового поля, або скористатися прихованим полем (я б не рекомендував його - занадто важке html), або можна використовувати властивість extendo у самому текстовому полі, наприклад:

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

24
Я розумію, що ви голосуєте проти, якщо це не спрацьовує, або якщо це невідповідна відповідь. Я дав відповідь, яка вирішила потреби користувача. Цей код був протестований. Він закінчений. І він робить те, що прийнята відповідь не робить (ви завжди можете подивитися властивість 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. Ви можете створювати власні атрибути та зберігати в них різні значення.


2

Брудний трюк, який я часом використовую, - приховування змінних в атрибуті 'name' (які я зазвичай не використовую для інших цілей):

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

Ви можете зробити це: додати атрибут 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

Можливо, ви можете зберегти попереднє значення текстового поля у прихованому текстовому полі. Тоді ви можете отримати перше значення із прихованого, а останнє - із самого текстового поля. Альтернатива, пов’язана з цим, при події onfocus вашого текстового поля встановіть значення вашого текстового поля до прихованого поля, а при події onchange прочитайте попереднє значення.


1
Але, якщо у нас є понад 100 текстових полів, у цьому випадку нам потрібно мати понад 100 прихованих змінних, то чи є інший спосіб отримати старі значення?
CFUser

0

Можливо, ви можете спробувати зберегти старе значення за допомогою події "onfocus", щоб потім порівняти його з новим значенням із подією "onchange".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.