質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

22441閲覧

input イベントで入力前の値を取得するAPIはありますか

think49

総合スコア18189

イベントハンドラ

マウスのクリックなどの特定の事象(イベント)が発生した時に実行される処理のことをイベントハンドラと呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

1クリップ

投稿2016/11/08 10:09

input イベントは右クリックメニューからの貼り付けにも対応した優秀なイベントですが、<input type="text"> で検証してみると value プロパティには入力後の値が入っています。
input イベントハンドラ関数内において入力する一つ手前の値を取得する方法は用意されていないでしょうか。

下記コードで data-* 独自属性に入力前の値を保存しておく事で期待通りの結果を得られますが、同様の機能を標準APIを使う事でよりスマートに実装出来ないか、を探しています。

HTML

1<input id="sample" type="text" name="sample" data-input-before="" value="" /> 2 3<script> 4'use strict'; 5document.getElementById('sample').addEventListener('input', function handleInput (event) { 6 var input = event.target, 7 value = input.value; 8 9 console.log('input-before', input.getAttribute('data-input-before')); 10 console.log('input-end', value); 11 input.setAttribute('data-input-before', value); 12 13 console.log(event); 14 console.log('data' in event, event.data); // false undefined 15}, false); 16</script>

「UI Events」によれば InputEvent#data が存在すると読めるのですが、Google Chrome ver.54.0.2840.87 m, Firefox ver.49.0.2 共に当該プロパティは存在しませんでした。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

IEを除けばおそらくtargetに対してdatasetプロパティを利用すればいけます
しかしIEを捨てきれないならget/set Attributeでもそれほど違和感ないような気がします

html

1<script> 2document.addEventListener('focus', function(e) { 3 var t = e.target; 4 if(t.id!=="sample") return false; 5 t.setAttribute("data-insert-before",t.value); 6},true); 7document.addEventListener('input', function(e) { 8 var t = e.target; 9 if(t.id!=="sample") return false; 10 var preval=t.getAttribute("data-insert-before"); 11 console.log(preval); 12 t.setAttribute("data-insert-before",t.value); 13},false); 14</script> 15<input id="sample" type="text" name="sample" value="test" />

ちなみにdatasetを利用する場合はハイフンで区切られたdataには
ラクダでアクセスします。

javascript

1t.dataset.insertBefore=t.value

投稿2016/11/08 13:50

yambejp

総合スコア116468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

think49

2016/11/08 17:11

回答ありがとうございます。 dataset プロパティの存在は認識しています。 yambejp さんが既に指摘したように dataset プロパティ は IE11+ を要求するので、後方互換性の観点から `setAttribute`, `getAttribute` を採用しました。 http://caniuse.com/#feat=dataset https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset 質問の本題は「inputイベントハンドラ関数内で入力前の値を取得するAPI」になります。 「入力前の値を対比する標準API」についてはdataset以外にも複数の手段がある事は認識しています(WeakMap、クロージャ、handleEventを利用したthis値のプロパティ等)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問