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
に値を渡せばいいのかな、と思ったので探してみたところ、コンストラクタのHTMLInputElement
のprototype
にそれっぽいものが。
これを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 );
}
})
なんちゃってデータバインディングとかに使えるかも。