LoginSignup
6
6

More than 5 years have passed since last update.

HTMLInputElement.value を監視する

Last updated at Posted at 2017-10-04

teratailでこういう質問があって、

yubinbango.js で、住所が取得できた瞬間をイベントで検知したいんですが、うまく行きません。
JavaScript - yubinbago.js で住所取得を検知したい(94990)|teratail

要は、「他のライブラリによるフォームの値変更を検知したい」という話です。
 
イベントで拾えず、キー入力イベントのバブリングを拾って後から取るのもダメ。
もちろん、setTimeoutでタイミングをずらせばいいだけなんだけど、なんかスマートじゃない。
 
MutationObserverかな、と思ったけど、プロパティは変更されても属性の変化はないので、やはり拾えない。
 
 
 
で、valueプロパティのsetterを作ってフックする方法を考えました。

Object.defineProperty(target, 'value',{
  get : function(){return value;},
  set : function(x){
    console.log(x);
    value = x;
  }
})

ただ、これだと、valueプロパティが変更されても、フォームの内容に反映されませんでした。
 
 
 
ネイティブのsetterに値を渡せばいいのかな、と思ったので探してみたところ、コンストラクタのHTMLInputElementprototypeにそれっぽいものが。
これをObject.getOwnPropertyDescriptorから呼び出してみると、どうやら上手く動作するようです(要確認)

Object.defineProperty(target, 'value',{
  get : function(){return Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,'value').get.call(target)},
  set : function(x){
    console.log(x);
    Object.getOwnPropertyDescriptor( HTMLInputElement.prototype, 'value' ).set.call( target, x );
  }
})

なんちゃってデータバインディングとかに使えるかも。
 
 
 

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6