テキストボックスの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 元の値を提供します。

これは初期値でのみ機能することに注意してください。

変更するたびに「古い」値を保持するためにこれが必要な場合は、expandoプロパティまたは同様のメソッドがニーズを満たします


ただのメモ。私はfirefoxで発見しましたelement.getAttribute( "value")もオリジナルを明らかにしているようです...これがクロスブラウザ/標準的なものであるかどうかを判断するのに十分なことはわかりません。
cheshirekow 2010年

47
element.defaultValueは、<input>タグに設定された値を返します。この値が編集またはその他のJavaScriptによって変更された場合、element、defaultValueはこの(新しい)古い値を返しません。
SabreWolfy 2012年

SabreWolfyに感謝し、あなたのコメントを見つけて私の問題を解決しました。値を複数回変更する必要があったため、上記を行うのは良くありませんでした。

175

古い値を手動で保存する必要があります。さまざまな方法で保存できます。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>

24
うまくいかない場合や不適切な回答の場合は、反対票を投じることができます。ユーザーのニーズを解決する答えを提供しました。このコードはテストされました。完成です。そして、受け入れられた答えではできないことを行います(defaultValueプロパティはいつでも確認できますが、ユーザーが値を複数回変更した場合はどうなりますか?)。
Gabriel McAdams

ここで提案された変更は正しくありません。まず、アラートが発生すると、フィールドはフォーカスを失います。その後の変更は、onfocusイベントが発生した後に発生します。次に、入力フィールドのonchangeイベントは、フォーカスが失われるまで発生しません。
Gabriel McAdams 2011年

2
これは、値を複数回操作している場合に効果的です。上記の答え(element.defaultValue)は1回だけ機能します。これまで:)

4
シンプルで効果的。+1以上あげられたらいいのに。
イアンケンプ2013

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)


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要素にoldvalue属性を追加し、ユーザーがクリックしたときにsetoldvalueを追加します。次に、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

たぶん、テキストボックスの以前の値を非表示のテキストボックスに保存できます。次に、hiddenから最初の値を取得し、textbox自体から最後の値を取得できます。これに関連する別の方法として、テキストボックスのonfocusイベントでテキストボックスの値を非表示フィールドに設定し、onchangeイベントで前の値を読み取ります。


1
しかし、100以上のテキストボックスがある場合、この場合は100以上の非表示変数が必要です。それで、古い値を取得する他の方法はありますか?
CFUser 2009

0

たぶん、「onfocus」イベントで古い値を保存して、後で「onchange」イベントで新しい値と比較することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.